|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
! o5 R9 W! G) _' i1 ^# p3 J2 D
2 y2 m" w$ u: n, {前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。
0 a% Z- {8 e6 s6 s5 a0 |8 X7 o9 L5 B8 }% E
这两天为装饰物件添加了对右击响应的支持。
- x5 C0 ^( _: q+ r
* z6 e2 v7 I* Q0 ?7 i3 ^同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。
3 J# U) H1 \- y5 d) [" O+ H& ]" l; r: V5 _' x
为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。/ E/ X5 M. V& l( m
9 ]( ~+ n( G2 P B- {8 a# Y# x7 ]; B下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。
7 K; y9 J" ?. O8 h+ ^- importPackage(java.nio);
% y. N" v* G* i2 u* v6 o# ] - * d ^# i( Y7 i6 w+ J. R+ j
- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z$ r" z1 C C. X' W2 b+ y: [
- model = ModelManager.uploadVertArrays(model);
+ c$ V6 q' C- h0 v8 t
0 v$ R+ P/ s: J( c$ b! K9 Z# W- function create(ctx, state, entity) {
% |$ e4 C+ {5 d6 D. x - state.num = 0;3 T" B: u2 @7 D0 @) h
- }
5 {& U+ p) @# M" y+ p5 `8 K - " N- ^# \) R; L, c. ~1 Z4 l
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
% N0 Y! [% b1 u; Q4 @ - let p = player.getPosition();. Q# G+ S6 M! Y+ e2 |( L0 l; \' e
- p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
$ q" ]- t3 c! ^1 w+ S - ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);$ a# ?8 X! J6 Z
- let ti = Date.now();0 t; F& f. c5 Y6 }& Y+ q" c D
- // DrawCall为一个接口 仅有一个commit方法
. @6 s8 f& r' F5 X7 e2 B! F - let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
7 }/ O7 O9 m0 m- n/ x: Q- U4 B - try {2 f1 R. G8 r7 ]1 V
- let pose = worldPose.copy();: x( [: R1 x5 L
- pose.translate(p);
8 O4 W# T0 v' Q/ a% t. S) \ Y7 v - pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);0 g, h! O( j9 z6 G8 k5 |
- # [5 b8 l2 a- b
- let buf = FloatBuffer.allocate(16);
/ G6 _% G) X( a% n" E - pose.store(buf);
+ p' s' c$ w4 \# L( Y" F9 k0 f -
- Y u' J# p1 x( K; R @ - buf.put(0, 1);
' `' E) s: q6 P2 z$ |' u- _' ? - buf.put(1, 0);+ O# L# F1 L# S0 U# w# V- z) L5 S
- buf.put(2, 0);
; M2 C# i9 d* {, U& B - buf.put(3, 0);- v$ y: }" `4 W7 |0 [( w
; |: V9 Q% i9 B* L5 m- buf.put(4, 0);
2 z6 g r+ I4 T8 g, H - buf.put(5, 1);
* A- G1 @* C" Y" [ - buf.put(6, 0);$ O% d% c, {. Q5 e! [/ H7 @# x
- buf.put(7, 0);
2 J+ m" T: \; E1 t& G - 8 m- Z @8 A4 c6 a' C) W5 B
- buf.put(8, 0);
+ W7 K9 I V0 u. P+ p ~) } - buf.put(9, 0);
9 a* ^% C* n& C B- n - buf.put(10, 1);
/ X3 a# ]0 T2 y- W, B, k - buf.put(11, 0);
5 D. X+ C: ~( @8 y
' G1 w, |( _$ r& n- pose.load(buf);// 清空旋转信息 始终面向摄像机
1 A" q) A4 r! G9 i( p
0 }1 v% [9 i2 H2 u" T% H/ s- drawScheduler.enqueue(model, pose, light);8 y% K7 ]. O& m$ r7 Q. m
- } catch (e) {
2 L1 w, r# ?5 y& m& p - ctx.setDebugInfo("Error", e.toString());
/ v4 L3 L! X8 R0 P0 @ - }) W. H: `2 u& \8 }! }
- }});
: [: l5 K9 p- n% Q8 G5 y - ctx.drawCalls.put(state.num, call);
7 N4 [) N- Y1 k U - // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...});
6 ^2 e- H0 M3 J - // 即 function -> lambda表达式(java) -> DrawCall对象
9 _8 q! ~4 I( v - state.num++;
% J, g+ B8 Z: X - }
复制代码 . w2 a u6 Z- N" ^1 m3 v; [
1 O" Q* L# a0 p
请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(* J5 ]6 O( i) \. I8 n6 e
2 `8 E% v3 X# T# R7 I# ` |
|