|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
, v6 V! m: w( F% C" O+ |
3 P3 @8 g3 G- W2 ^& {前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。$ N: L+ U' Q5 c( r: g2 z7 G
/ _3 M. m/ g( d" R; e( @& ^# ~* ^
这两天为装饰物件添加了对右击响应的支持。4 E0 Z! x. o& i0 s
+ u5 O. r5 a/ ]. z1 R2 Z8 g4 s+ p同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。
Q- Z' u# a) U; b) d
( _7 i" I8 K- Q; O2 @9 R, r为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。2 E5 s. T/ v; G1 J( ^
8 Q6 [$ |2 b0 v% } z, U2 P$ D/ l" D下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。6 s i, b7 x% g/ m
- importPackage(java.nio);: W' `7 H1 }$ n# B! {2 h
- 8 t( S; H% K- K3 L! E
- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z
/ r2 x' P5 H" K) T" _. e - model = ModelManager.uploadVertArrays(model);! k5 h, g- `* v6 d f! V, [3 [
9 W ~$ }7 I \. L; z- function create(ctx, state, entity) {
2 n% C# C5 C0 _' a - state.num = 0;
2 V4 |. Z) R! J2 p4 ` - }& H7 g+ q# ^7 {( {; n9 T
+ Z) A( x) }" `- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性$ p/ C& K$ |( M( L O
- let p = player.getPosition();
' |4 z0 O7 O0 u1 }- w+ S3 m - p.add(0, 1.5, 0);// 假定头在脚底往上1.5m' O$ G/ u' x; A
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
$ ^3 c8 b" B5 V" g( @- V. U - let ti = Date.now();
: h7 e' f8 Z- c3 _% O" ?3 l+ N - // DrawCall为一个接口 仅有一个commit方法0 R2 i9 P: ^3 i5 @, Y
- let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
4 e& T1 _( f' t3 U8 u* y - try {
/ ?6 b3 G) K q" ?. t( c7 f& b - let pose = worldPose.copy();" E5 o7 i. p7 w' W D
- pose.translate(p);( h- R! l/ O# q" ^) U) g3 Y8 l
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);& g* w2 X& h7 r8 {7 s
) n8 W5 N+ {* z3 Z- let buf = FloatBuffer.allocate(16);5 ? T$ e1 ?4 l; z: V* u" `0 h
- pose.store(buf);
# }2 p x9 R# R6 y$ q - 1 X5 a j& t+ i! y
- buf.put(0, 1);1 }2 O9 s" {6 R5 q
- buf.put(1, 0);1 z8 U x' I; e2 ?0 v
- buf.put(2, 0);
/ O$ _% u# A$ e& p' L8 ` - buf.put(3, 0);
5 d0 D/ x% Y4 k8 N) ^2 e" G - / j: q3 K% k0 g/ o& O3 O
- buf.put(4, 0);- @0 o: ^% i+ A- d3 m9 E
- buf.put(5, 1);( t: J2 j1 Z l8 u( w
- buf.put(6, 0);
0 F5 A$ @, n, L, Q5 `7 X; N - buf.put(7, 0);, L9 y; z! X4 ]/ G
: z4 N: C& d9 t, h, D, U- buf.put(8, 0);1 L2 |# V& \* w5 ?, \( F8 q
- buf.put(9, 0);
- Q" w7 v' z4 D% w, T9 x( M, B: a5 L4 @ - buf.put(10, 1);) G1 T1 k% J4 i$ N, x/ K
- buf.put(11, 0);
$ g" k! N9 n' ~5 {# {, A; S - X8 g6 w+ R! E5 ~2 i! M
- pose.load(buf);// 清空旋转信息 始终面向摄像机
) O8 w/ d" [; q4 b
3 V6 {9 t4 z8 I5 H3 M& Y$ \- drawScheduler.enqueue(model, pose, light);
9 O; f5 I- w7 C" S1 W - } catch (e) {( ?- {/ g: U7 M7 V, z/ p
- ctx.setDebugInfo("Error", e.toString());7 W @1 ?0 x4 b7 q( o
- }
6 i3 r$ k$ T& Z1 I- C& C9 n( ? - }});- L' X5 e6 @& D' n" s/ k
- ctx.drawCalls.put(state.num, call);
' ^5 y* ~4 L# |% |5 u - // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); # X0 d2 l2 M8 p. l( q
- // 即 function -> lambda表达式(java) -> DrawCall对象
& I9 c3 r9 w: _( e - state.num++;' O. I1 M6 J1 ~$ e9 p2 n* w0 W6 s% a
- }
复制代码
. @: E& L0 ^/ l( ?" t
# G$ U( G: D! w+ I: K" T L请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(/ K+ e& E! x% e" V4 z+ {$ R9 u- z
9 Q5 g' z K1 y1 ~ |
|