|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
& o# S% [" p2 Z
1 m- E/ {9 S" F5 {3 X0 ]前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。3 A- V0 s: C( o8 `
) ]9 d4 `1 _8 A- h! w) x这两天为装饰物件添加了对右击响应的支持。6 ~1 S i! A. r `- x3 E) x6 @
# {, i2 L/ a" ~
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。( {2 r* R6 T9 H% ^
! f/ h- @! Q& ^0 i为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。. ?6 E0 h7 E( ~. ^: U. k
- N6 X3 J2 {5 ~7 m" P3 Q. o N
下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。+ R2 t8 Y9 U4 ?% h' Z
- importPackage(java.nio);* o3 A* w5 i2 Q8 P% r% V
- ; G# ~: {* l2 U* B% x2 e, A9 A
- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z( o" \1 o# Q+ I) F3 e% g# U
- model = ModelManager.uploadVertArrays(model);
# M8 ^2 @0 {8 v V% |! L - ; W" b5 b" ^1 ^
- function create(ctx, state, entity) {" Y; O( H: S3 S; u
- state.num = 0;
' r9 ~; p) V6 E# `" O5 d' ]8 A - }! K; c5 v. `& ^5 P; C
- 2 Y8 U i& Q$ f6 w2 N
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性
( _( n, U4 h2 R - let p = player.getPosition();
8 i- F2 q$ w E/ l+ R( V& i - p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
j' W1 l+ c) f% `1 Z6 C - ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
5 D1 E# v9 I! \7 E( ^+ I - let ti = Date.now();8 W' @0 p# N; D! [& d: P
- // DrawCall为一个接口 仅有一个commit方法$ j3 K, M/ R! H5 Z* g+ Z) ]
- let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象" J: N1 z4 ]- T: N( x; e
- try {
f' h& T" K; J - let pose = worldPose.copy();6 m2 [ Y: u, |( ?; [ s
- pose.translate(p);' Y# B+ p$ c$ w6 T6 y
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);/ O- Q5 @" Z3 B6 Q% j
- ' d2 L6 Z. B7 H) f. E: h( n% ]
- let buf = FloatBuffer.allocate(16);; R6 n0 p" b5 o- E, ?0 I( J
- pose.store(buf); a s: \0 }+ f$ V, ^/ k0 b
-
! Q X- {7 i0 f3 J, l0 G8 X - buf.put(0, 1);
; l# ]1 e2 c% r# M# T% p j - buf.put(1, 0);, k% N! ] n8 M! M
- buf.put(2, 0);
& J( Z9 _' T! }' o - buf.put(3, 0);$ D1 F4 o" E5 T) h+ j
- % ^% F. r( t# r! s1 N: x+ t
- buf.put(4, 0);7 l- N0 u: B% \: F! p& H4 c
- buf.put(5, 1);- g2 ^9 _: o+ s( { A v; {' \# W
- buf.put(6, 0);# D5 ^) w3 E; A
- buf.put(7, 0);2 \ k f( P! q& w
- 1 v5 q$ [0 j5 ~$ V# r; E
- buf.put(8, 0);
+ W2 `7 T, h' D) C' K \ - buf.put(9, 0);" o \% Z, u( N- _$ f
- buf.put(10, 1);
8 }4 |: m/ T, `9 }; \" C - buf.put(11, 0);
6 V" R0 X+ w7 f/ d$ f - 0 s- X b- [2 ?' H; A+ v
- pose.load(buf);// 清空旋转信息 始终面向摄像机* I; ]' Y8 }4 `4 q
- 3 l3 t! S9 d G- _
- drawScheduler.enqueue(model, pose, light);$ h6 X4 P9 \# D n$ U
- } catch (e) {
- T& K3 S) B, q) ]: @. Z - ctx.setDebugInfo("Error", e.toString()); h! x; _1 h/ W7 ]* z, s
- }
9 B5 Q& t$ {) }; {0 r4 J1 k - }});- `# Q: p+ _. V3 m' {! F$ v
- ctx.drawCalls.put(state.num, call);
3 r: x4 L% n+ J' B8 C - // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...});
% x4 } s+ f% J# i- c - // 即 function -> lambda表达式(java) -> DrawCall对象
% H; ]/ F4 S5 w9 [, l - state.num++;
4 D& Z9 F6 v N" H6 R2 K7 C2 i - }
复制代码 ) {. R- {1 }1 s$ s3 |
, h5 w5 Q) E! ~' P5 M# h
请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(
5 w4 O. s/ a( N0 t* l& E+ k$ a: Y$ ^" n+ U+ o! X# }9 A
|
|