|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
5 T L8 ?3 `/ [- t- i
6 h5 |' _4 v# c% g+ K" `3 G, N
前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。
% E: E; g- X1 [) g& `( H+ @* F5 M8 x: H1 Z7 {
这两天为装饰物件添加了对右击响应的支持。9 |. S; K1 I' m x( r
8 T" k( o- G7 ^' |0 @5 u) n# A9 k! ^" j
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。
* |+ t: K. a) B
" b/ ]! l) U4 j [0 ?/ {- K* x为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
7 k0 C/ y* n# a T1 W5 ?4 T
" j7 F! h* V' ]' B下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。
3 ~0 Y3 M7 ]8 I/ {. r- importPackage(java.nio);/ X* @5 d% g8 z! `) t; S
- 9 M& P- E8 S6 U/ W6 j0 P
- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z( v3 o3 ]' }2 `) c
- model = ModelManager.uploadVertArrays(model);
/ M; V& R# R; p+ k; [5 W2 C
, f( Y: B0 i; b/ U- ~9 e) M- function create(ctx, state, entity) {
$ a; A9 B9 m+ T( q! j - state.num = 0;
4 A" [1 n$ Z# o" i! r3 w6 i - }4 R V+ j C) m7 t$ w6 {: y6 X
- ( h7 Q% Z* N1 _2 @' z
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
$ |, C J4 V, z: g% |' X: w. ^ - let p = player.getPosition();
! ~3 D5 I2 v' o8 g+ R+ Y( N+ g5 f - p.add(0, 1.5, 0);// 假定头在脚底往上1.5m4 M8 G+ q' A, \. ]
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);0 V/ @, T Q, J4 j) u
- let ti = Date.now();# q4 Z( m. p% y- w( G
- // DrawCall为一个接口 仅有一个commit方法+ o" M& N2 E8 G2 a8 a; L- I4 h- u
- let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象, k, s6 Y6 V& X$ ^
- try {* l! @3 Y: [" Z. t8 }% d& P
- let pose = worldPose.copy();% P1 D& ?+ B! F& l9 j! [
- pose.translate(p);
2 @! K3 z W& q0 @ - pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);/ h/ [) f3 I( k3 F$ Y/ c, A) s
- % x5 g1 x) z/ n" o! X
- let buf = FloatBuffer.allocate(16);
6 v+ e+ P4 z3 p - pose.store(buf);. x; `8 i, C9 @& s" \
- 3 @/ V) k: X# t- L" t$ N3 d# [- s
- buf.put(0, 1);
. t( {" W2 j- O - buf.put(1, 0);7 l/ C- _: X: Y+ T: H: m
- buf.put(2, 0);
- c* c1 w) R6 H. i% b1 B- k" y0 \ - buf.put(3, 0);$ T/ \6 X; B z: D
- - {0 `& O. H4 i
- buf.put(4, 0);
+ c5 t- _( f2 b! _ - buf.put(5, 1);* X, p5 e' q; g g0 t! K; Z
- buf.put(6, 0);
" b2 G: O- X1 P) k9 j - buf.put(7, 0);
+ u x3 J' a% j) a- J' k j* l
$ ?: D" K! h+ a- buf.put(8, 0);9 ^' J' o, [- d/ f+ b- q
- buf.put(9, 0);0 d: n0 `) T& p6 `. g( K
- buf.put(10, 1);! N. J/ }: v; k% r( u% I* O( x* o* q
- buf.put(11, 0);
: p: |! D2 D3 C3 m5 [ - 1 [( B5 E. ]! H4 n9 a( d
- pose.load(buf);// 清空旋转信息 始终面向摄像机0 o% P$ _" j# X6 F; ~5 r1 U) d
! _- _ r# Y g8 p& H# D- drawScheduler.enqueue(model, pose, light);
$ Y9 d! _# @8 U E - } catch (e) {- z, F$ C* C0 ^. O2 p' D
- ctx.setDebugInfo("Error", e.toString());
& r' `7 b) B: ?) ^4 T# @, Q9 n - }0 w2 v+ f% S. V0 _8 X
- }});
- y y; N* w) R7 K3 ?+ s - ctx.drawCalls.put(state.num, call);; c* D( E, l, D, d. \6 G1 s, j
- // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); }; G' {+ ^. n) I+ L
- // 即 function -> lambda表达式(java) -> DrawCall对象+ P/ {& n! K: {& u, M3 `
- state.num++;
- s9 B7 S- A3 z1 H' M1 r - }
复制代码 2 h3 V; n+ M- }2 U' }
% y/ N. v/ v0 H" [1 t& C" y1 U请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(: d+ E0 Z/ @- ~0 _- @7 D
6 V) u1 t. [; q D- E |
|