开启左侧

脚本也能这么写

[复制链接]
Harlotte 作者认证 2024-12-31 19:39:29

还没有账号?赶快去注册吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

×

& 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
  1. importPackage(java.nio);
    " S) N; t$ p' z% b0 V

  2. ' M8 }  P$ G4 T5 r5 h
  3. let model = ModelManager.loadRawModel(Resources.manager(), Resources.idr("face.obj"), null);// 法线 -z
    9 p/ C% y# z  y. u; D" b
  4. model = ModelManager.uploadVertArrays(model);
    % g/ i5 L( C- |& n/ P/ z: D

  5. % d4 N* w, S7 r
  6. function create(ctx, state, entity) {
    ) a5 q9 H' {$ G. `( [+ M
  7.     state.num = 0;# I+ @7 v- l1 L6 p- s% s( X! B
  8. }. y0 q3 |& F0 ^( F6 ^8 v

  9. ) D$ R8 A) i/ h$ {
  10. function beClicked(ctx, state, entity, player) {// player: WapperedEntity 包装了 Entity(Player) 为js提供一些基本的方法和属性  y& [; Y1 W& G: v- S: d+ Z
  11.     let p = player.getPosition();
    $ L' V4 R0 A5 L/ d* p. h  t
  12.     p.add(0, 1.5, 0);// 假定头在脚底往上1.5m
    . x  O& R2 I. c; p  ^
  13.     ctx.setDebugInfo("Clicked on ", "shift: " + player.isShiftKeyDown(), "look angle: " + player.getLookAngle(), "from: " + p,"time: " + Date.now(), p);$ \4 o1 A8 B' C
  14.     let ti = Date.now();* A, e1 L# j1 R- o# D
  15.     // DrawCall为一个接口 仅有一个commit方法
    ' ?/ ~$ D0 l& F
  16.     let call = new DrawCall({commit: (drawScheduler, basePose, worldPose, light) => {// 差不多是这样的 包含commit方法的对象 -> 转换为DrawCall对象
    3 \( {! r) @/ a; B
  17.         try {
    % w4 y. a1 N% ]3 }4 g7 O' D
  18.             let pose = worldPose.copy();2 x8 N: b. ^+ D4 L6 O; q3 y
  19.             pose.translate(p);* N- a1 U8 c* X
  20.             pose.translate(0, (Date.now() - ti) / 1000 * 0.4, 0);
    4 W! P8 j5 j, l+ ]4 I

  21. : v. b3 Y* a. R0 d1 H0 }
  22.             let buf = FloatBuffer.allocate(16);
    6 t1 x4 v& J! b0 ]3 w
  23.             pose.store(buf);
    9 `/ ]3 H1 H7 j! p+ ?( B. u0 R
  24.             
    + v9 d4 q/ Q; G7 Y. q3 i
  25.             buf.put(0, 1);3 ?/ y- [0 @5 Q: r, v1 |/ X7 ?
  26.             buf.put(1, 0);
    $ O8 X8 A# k  j+ _: |
  27.             buf.put(2, 0);
    5 j1 G4 Q  |, G$ p* A3 {$ X4 d
  28.             buf.put(3, 0);
    ' |6 A. T% v  Q* n; ?

  29. 2 X$ X  f% n/ M
  30.             buf.put(4, 0);4 {' K4 }4 I" @7 c4 e
  31.             buf.put(5, 1);0 A& [' g" F! G- j  u! j
  32.             buf.put(6, 0);
    $ B3 O; ]! F$ j/ E4 g
  33.             buf.put(7, 0);9 @; J: u& U2 B* W/ G( |0 d; N

  34. , W9 b* Y9 E% Q( U
  35.             buf.put(8, 0);4 C5 X1 h4 |6 e7 c
  36.             buf.put(9, 0);& Z$ U, @# h4 q& \
  37.             buf.put(10, 1);& w' t9 M7 T0 x
  38.             buf.put(11, 0);
      {! [: F) k& ?: U
  39. 4 g' u$ i9 H+ D. u" [8 G
  40.             pose.load(buf);// 清空旋转信息 始终面向摄像机6 y; C) ~/ o4 w7 K! _+ v3 U' N
  41. ' l/ z7 J* o/ f  v1 ^6 r7 a( X$ S
  42.             drawScheduler.enqueue(model, pose, light);) Z" q2 U/ ?! j% h# R5 q; @$ [
  43.         } catch (e) {
    . c* _  y5 U: V+ y: q) c: H2 S, O
  44.             ctx.setDebugInfo("Error", e.toString());6 P4 C9 @* U+ o: e7 r+ o6 W8 m
  45.         }. @; D  u" ]$ ^& B
  46.     }});
    4 E& T; n# d5 W( w( D9 J( b
  47.     ctx.drawCalls.put(state.num, call);6 \* V$ D. l. _: f( }
  48.     // 亦可以直接使用 ctx.drawCalls.put(state.num, (drawScheduler, basePose, worldPose, light) => {...}); ( N( |: r! U+ [. N* A9 c  x
  49.     // 即 function -> lambda表达式(java) -> DrawCall对象
    . Q; F; C  J( B, A1 J
  50.     state.num++;  h3 [# Q5 {5 ]
  51. }
复制代码
! 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
有事加我QQ: 3435494979
Hobbytimeblank 作者认证 2024-12-31 22:29:41
大佬!干得漂亮!新年快乐!
你是更怀念那几台机器,怀念那两个多月的时间,还是怀念当时与你一起合作的人?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表