|
|
还没有账号?赶快去注册吧!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
% z' q% |* \& S8 C6 V- _, s3 F
$ {3 q9 R" c% B7 w: Q( W9 ?
前情提要:此Mod 现名ANTE (Aphrodite's Nemo's Transit Expansion) 即由 我(Aphrodite) 进行后续更新的NTE 请勿与NTE混为一谈,切忌找zbx问关于ANTE的新特性。2 F0 [- [ Z& r) P
8 e2 `% |, x2 S e6 j
这两天为装饰物件添加了对右击响应的支持。
. }* q+ @- s# X& C0 v/ y3 F1 t& U3 e8 G) e+ q2 [
同时我改良了DrawCall系列的继承关系,为自定义DrawCall内容提供了支持。& ]2 L& y t; j/ A) D5 b
/ X! ^+ [# p, Y- `. c }1 d1 I1 }8 E为了能不受限于在render函数中添加绘制调用,我为装饰物件和列车的上下文添加了drawCalls(Map<Object, DrawCall>),现在可以在任何时间任何线程添加、修改、删除绘制调用。
6 _ e7 N; g/ Z7 ^ Q1 @, R8 x+ U8 b; K% t0 O, n2 q/ R
下面是一段示例代码,实现了在右击装饰物件时(不是用刷子)时在玩家头部生成一个始终面向摄像机并向上匀速运动的面的效果。+ g3 j; T n& M) o
- importPackage(java.nio);- O6 T: O% C p$ n: _' X
( O9 m- {! B( A: t' F+ B- let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z
2 J' h! O5 P4 u/ G# l - model = ModelManager.uploadVertArrays(model);
- w& [4 y" d* m$ m8 ~: _/ \
* V% C* J/ I8 {7 \( i- function create(ctx, state, entity) {
# P' F+ U$ {* ^/ |; i - state.num = 0;9 c/ Z& M; F6 ~5 k
- }6 `5 D/ W' C5 c' [7 A4 P/ i
- ) Q! U/ ]2 B: s, w
- function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性6 w/ S8 D Z4 O
- let p = player.getPosition();5 j0 Z9 l$ h* X i6 X3 U
- p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
& B5 R) i7 {+ [+ S* u$ S+ Y - ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);
8 b; J C- S7 k; ~; z) a" s# H3 i - let ti = Date.now();7 c c# U5 h# b9 {% _- N* o2 [) T
- // DrawCall为一个接口 仅有一个commit方法
. {9 w/ {: t3 H, v( d7 J: h - let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象3 ~$ q) U5 H# i, V
- try {
* K+ l* P1 A6 y$ O- N& p - let pose = worldPose.copy();# c, f# X7 q- y6 ^
- pose.translate(p);- X( ~7 s, B8 N5 @ z C) |) `
- pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);0 d( _8 X% D+ p' ]* v2 n+ t
- 4 @2 Z8 ^6 v) n* w
- let buf = FloatBuffer.allocate(16);* r H# Y1 T! r) j* l4 S* V
- pose.store(buf);
8 B R; \2 x9 i( Q5 c6 L$ { - / H# p4 C" M8 G: i
- buf.put(0, 1);
1 O$ D" b+ K+ I, N! L7 n& S" l; D - buf.put(1, 0);
. ^. K4 P# Q6 s8 o - buf.put(2, 0);
) A4 O4 R# f, d2 w; O - buf.put(3, 0);8 [% o; D7 ^! F4 r
- + T0 V8 {/ o" w4 I; t
- buf.put(4, 0);. {- e( ^4 _+ k0 D, j# \
- buf.put(5, 1);
" g \/ |7 q* B# M - buf.put(6, 0);
$ J2 N! e( g4 t/ [- o% F+ b8 d7 A - buf.put(7, 0);+ M6 l0 ^! Z" J E
- ; S1 l" D- f; N
- buf.put(8, 0);) o7 Z6 W3 ^9 y2 Y7 Z* e [- ~
- buf.put(9, 0);
" k) b+ J& t. |( i) p/ V$ E* d - buf.put(10, 1);, H m; l' Q" B( q' a3 K6 X
- buf.put(11, 0);
( R7 B! ?7 j0 q* [) a
4 [/ B0 F% q% G& a* V- pose.load(buf);// 清空旋转信息 始终面向摄像机/ N* X1 R6 j0 M
- . o) E5 _- v# u$ a# g* O
- drawScheduler.enqueue(model, pose, light);1 S% c* x! X8 q
- } catch (e) { N; \4 N- W9 t8 E
- ctx.setDebugInfo("Error", e.toString());
; Y* B- D" {( A1 K; K. d% W - }0 z( a4 [% A- |" l# Q
- }});3 n H$ K0 {/ V6 Z
- ctx.drawCalls.put(state.num, call);$ W# ?& W2 C6 I$ A& S. U# P8 s
- // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); 0 g& u+ q& `( T0 _/ B2 H* h
- // 即 function -> lambda表达式(java) -> DrawCall对象
I2 v5 D1 U/ f% K5 Q - state.num++;( L; T) O8 A. }2 e7 h, ^2 L7 L
- }
复制代码 & [2 Z7 j& H% B* q
* O3 H1 z- R' U, U0 ?请注意 beClicked 只会在当前客户端执行一次 若需要多端同步请将数据保存在 entity.data 中(
+ x2 x2 y% C! u+ V% G: s
) x/ N8 z! U) J' F3 G |
|