|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
& k- f1 J% g" p1 [8 u
! G; g) W' w( a. h+ @/ m' X前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。
. O+ k& W5 g9 i( p4 {" `% ^. q
这两天为装饰物件添加了对右击响应的支持。; @) J. Y. Q' h8 U$ r+ D7 _' j
& |: G; M3 t7 x7 K0 f
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。# Y/ b" g1 d! C2 x
W# M8 X9 v. C9 I I8 p6 C0 j1 N为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
g8 z9 {/ Z( ~* e* V
. o3 u0 _% l% p6 y* a下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。+ H7 C7 } X5 ?3 N& j9 E
- importPackage(java.nio);
" S) N; t$ p' z% b0 V
' M8 } P$ G4 T5 r5 h- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z
9 p/ C% y# z y. u; D" b - model = ModelManager.uploadVertArrays(model);
% g/ i5 L( C- |& n/ P/ z: D
% d4 N* w, S7 r- function create(ctx, state, entity) {
) a5 q9 H' {$ G. `( [+ M - state.num = 0;# I+ @7 v- l1 L6 p- s% s( X! B
- }. y0 q3 |& F0 ^( F6 ^8 v
) D$ R8 A) i/ h$ {- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性 y& [; Y1 W& G: v- S: d+ Z
- let p = player.getPosition();
$ L' V4 R0 A5 L/ d* p. h t - p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
. x O& R2 I. c; p ^ - ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);$ \4 o1 A8 B' C
- let ti = Date.now();* A, e1 L# j1 R- o# D
- // DrawCall为一个接口 仅有一个commit方法
' ?/ ~$ D0 l& F - let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
3 \( {! r) @/ a; B - try {
% w4 y. a1 N% ]3 }4 g7 O' D - let pose = worldPose.copy();2 x8 N: b. ^+ D4 L6 O; q3 y
- pose.translate(p);* N- a1 U8 c* X
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
4 W! P8 j5 j, l+ ]4 I
: v. b3 Y* a. R0 d1 H0 }- let buf = FloatBuffer.allocate(16);
6 t1 x4 v& J! b0 ]3 w - pose.store(buf);
9 `/ ]3 H1 H7 j! p+ ?( B. u0 R -
+ v9 d4 q/ Q; G7 Y. q3 i - buf.put(0, 1);3 ?/ y- [0 @5 Q: r, v1 |/ X7 ?
- buf.put(1, 0);
$ O8 X8 A# k j+ _: | - buf.put(2, 0);
5 j1 G4 Q |, G$ p* A3 {$ X4 d - buf.put(3, 0);
' |6 A. T% v Q* n; ?
2 X$ X f% n/ M- buf.put(4, 0);4 {' K4 }4 I" @7 c4 e
- buf.put(5, 1);0 A& [' g" F! G- j u! j
- buf.put(6, 0);
$ B3 O; ]! F$ j/ E4 g - buf.put(7, 0);9 @; J: u& U2 B* W/ G( |0 d; N
, W9 b* Y9 E% Q( U- buf.put(8, 0);4 C5 X1 h4 |6 e7 c
- buf.put(9, 0);& Z$ U, @# h4 q& \
- buf.put(10, 1);& w' t9 M7 T0 x
- buf.put(11, 0);
{! [: F) k& ?: U - 4 g' u$ i9 H+ D. u" [8 G
- pose.load(buf);// 清空旋转信息 始终面向摄像机6 y; C) ~/ o4 w7 K! _+ v3 U' N
- ' l/ z7 J* o/ f v1 ^6 r7 a( X$ S
- drawScheduler.enqueue(model, pose, light);) Z" q2 U/ ?! j% h# R5 q; @$ [
- } catch (e) {
. c* _ y5 U: V+ y: q) c: H2 S, O - ctx.setDebugInfo("Error", e.toString());6 P4 C9 @* U+ o: e7 r+ o6 W8 m
- }. @; D u" ]$ ^& B
- }});
4 E& T; n# d5 W( w( D9 J( b - ctx.drawCalls.put(state.num, call);6 \* V$ D. l. _: f( }
- // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); ( N( |: r! U+ [. N* A9 c x
- // 即 function -> lambda表达式(java) -> DrawCall对象
. Q; F; C J( B, A1 J - state.num++; h3 [# Q5 {5 ]
- }
复制代码 ! a* [1 p* R! W( i
s, c3 ^' L6 b: q: V4 A. p2 v4 q2 N9 _
请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(# q7 t' q; |8 }
# P' I# y4 L+ b |
|