|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
) u/ w0 s0 l: K$ J
8 L4 s- E; I- u" S+ T+ t/ ~2 s+ d) v前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。2 i0 X( \6 g: y$ m3 f" e
& h; z+ B1 Y: W这两天为装饰物件添加了对右击响应的支持。% |+ B6 B6 d8 v. R6 t
3 D* K9 P/ N' y i' P
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。; |8 D& m6 K+ c# l, C+ z
* R- I* v9 S U. Z& [7 n3 |为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。9 F4 w+ S- i8 {$ ]2 w# D8 j
5 s L' e3 T0 c5 F3 b, `下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。+ V: s8 W& y' N, N) G
- importPackage(java.nio);
' u/ T" y" j1 g0 I U
; c" K$ U+ k& [1 d# w* @' l- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z8 r E5 y8 M8 D0 H
- model = ModelManager.uploadVertArrays(model);
! V' ?2 f0 E0 `6 C8 F |' s' @
$ \( E t/ v2 p/ x' J/ i R5 p F- function create(ctx, state, entity) {7 W; t/ R$ W! S9 l9 t
- state.num = 0;
% E! A* X9 G) W; f5 c& k4 J' O& ~ - }
]. ~) Y% b! S
4 l3 t) _! s: \$ g# {5 W& G- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性' U: W. @8 N$ C7 Q& D0 }
- let p = player.getPosition();; i8 k8 S4 ~3 X+ l6 C- ?
- p.add(0, 1.5, 0);// 假定头在脚底往上1.5m' E& \* G$ n I
- ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
( d' | }( [+ D! P - let ti = Date.now();
* w* x2 c5 l7 }6 [3 \ - // DrawCall为一个接口 仅有一个commit方法( n+ Z4 z& G! F
- let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象! z! m5 ^# J6 F1 _' b/ I
- try {- \; s3 W+ j! @1 G* O
- let pose = worldPose.copy();
3 g5 F2 s( d6 ~5 g7 h# p - pose.translate(p);7 _4 W5 G# Z0 M0 z
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);& Q3 r, s+ \! H9 @! x: k& v
i, A' Y' q6 ]- m) E- let buf = FloatBuffer.allocate(16);
$ Q: H/ a8 ?8 U. v; x; S1 R4 x - pose.store(buf);
4 V5 W& Q4 A6 d9 V& h - 8 @( }8 @$ B: ~
- buf.put(0, 1);
0 {9 O7 D+ w$ A4 p$ g - buf.put(1, 0);
* e( r2 B( b% p' F' n' Z0 J# ~ - buf.put(2, 0);5 K$ _; P7 r9 ?) d6 E6 r6 O
- buf.put(3, 0);5 [% ?3 @0 M! |0 `# i. E
) t; J% \6 d" P" \' E! \% z# T9 l- buf.put(4, 0);
5 ?# w% l6 B* m) j9 `. p. d8 b - buf.put(5, 1);0 G( E% d e5 e9 c Q8 ?
- buf.put(6, 0);0 ~3 b8 M$ k1 f1 J, E b+ l
- buf.put(7, 0);' f3 U: t6 l% w5 X6 e, u! B% Q3 P
. f+ n* p8 }% {1 m$ D- buf.put(8, 0);, i% v, {' r& K+ R1 i, Q: u
- buf.put(9, 0);
; k% _4 [- e; E5 y9 s2 Z - buf.put(10, 1);2 S% E6 ^; m4 x+ {, A
- buf.put(11, 0);' Z4 g7 I: v/ \7 Y) z4 S2 Y! D. V, E
- & n/ r7 H! _* T# B. R
- pose.load(buf);// 清空旋转信息 始终面向摄像机
7 W1 c7 `. w2 V7 p6 x n
1 V; p9 u1 f2 ]& `' U) R; [/ u- drawScheduler.enqueue(model, pose, light);
7 o+ o8 L4 r9 a' [" g5 _* t. V/ r - } catch (e) {
! e: \# Z) t7 E" y, Z& E3 [3 y - ctx.setDebugInfo("Error", e.toString());
Q9 C! s" ~; R' E- n7 P - }' Q) f: c# K; I6 F3 s$ K4 m
- }});
0 E1 S @$ j0 \, W$ o - ctx.drawCalls.put(state.num, call);) G' H$ y* j' j/ ?5 K$ t
- // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); ' Z) c, A6 V6 N7 |9 v! @
- // 即 function -> lambda表达式(java) -> DrawCall对象0 L7 Q" n( ~1 _& Y4 _: U- S
- state.num++;2 I" F* t' i9 M! l2 v2 s+ |/ j& i- T
- }
复制代码 " f# h+ j/ n: A' C7 P A1 m2 D
3 q8 F, K% P1 k* \& ~请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(
+ L5 a. c0 l# T. x: I/ e. i. Z) j8 t, C2 b* y
|
|