无编辑摘要 |
小 (→Protected方法获取) |
||
(未显示3个用户的25个中间版本) | |||
第1行: | 第1行: | ||
=== | === Mindustry的[https://developer.mozilla.org/zh-CN/docs/Web/javascript JS] === | ||
Mindustry使用: [https://github.com/Anuken/Rhino Rhino] | Mindustry使用: [https://github.com/Anuken/Rhino Rhino] | ||
类似于[https://nodejs.cn/ node.js],它没有''<code>window</code>,<code>document</code>''等一系列变量 | |||
Rhino并没有完全支持es6的语法 | |||
[[https://www.runoob.com/js/js-tutorial.html 菜鸟教程]] | [[https://developer.mozilla.org/zh-CN/docs/Web/javascript MDN]] | |||
Mindustry提供了一下全局变量:[https://github.com/Anuken/Mindustry/blob/d79a306970598ae8d7fa29102d1ce2aa0653e5ed/core/assets/scripts/global.js global.js] | Mindustry提供了一下全局变量:[https://github.com/Anuken/Mindustry/blob/d79a306970598ae8d7fa29102d1ce2aa0653e5ed/core/assets/scripts/global.js global.js] | ||
一些常用的变量 | |||
=== 关于[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment | * <code>scriptName</code>: 当前脚本的名称(这会随脚本的变化而变化,建议: <code>'''const''' { scriptName } = '''this''';</code> ) | ||
cosnt { a, b } = { a: 1, b: 2 }; | * <code>modName</code>: 当前Mod的名称(这会随mod的变化而变化,建议: <code>'''const''' { modName } = '''this''';</code> ) | ||
* <code>print</code>: 打印日志 | |||
* <code>extend</code>: | |||
=== 关于[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment 解构赋值] === | |||
<code>'''cosnt''' { a, b } '''=''' { a: 1, b: 2 };</code> | |||
=== 特殊语法 === | === 特殊语法 === | ||
==== | ==== '''new''' F''/* functionName */'' ( ''/* args */'' ) { ''/* code */'' } ==== | ||
其实就是<code>F''/* functionName */'''''(''' ''/* args */'' , { ''/* code */'' } ''')'''</code> | |||
在最后面传了一个对象 | 在最后面传了一个对象 | ||
所以你可以: | |||
'''new''' extend('''Block''', "a block") { | |||
setBars() { print('''this'''.barMap) } | |||
} | |||
==== Getter & Setter ==== | |||
'''Getter''': 你可以使用<code>xxx.class</code>等价于<code>xxx.getClass()</code> | |||
* 注意:<code>Vars.class</code>获取到的是'''Class'''类(或者直接报错),如果想要获取对应类对象 可以使用<code>Vars.__javaObject__</code> | |||
'''Setter''': 你可以使用<code>cell.element = xxx</code>,这等价于<code>cell.setElement(xxx)</code> | |||
=== 一些小坑 === | |||
====== 一个函数接受所有方法 ====== | |||
extend(BulletType, { | |||
hit(b, x, y) { print(b); } | |||
} | |||
<code>BulletType#'''hit'''('''Bullet''' b)</code>和<code>BulletType#'''hit'''('''Bullet''' b, '''float''' x, '''float''' y)</code>都会调用上面的hit方法, | |||
所以<code>x</code>,<code>y</code>可能为<code>undefined</code> | |||
===== <code>for ... of ...</code> 不能迭代java的Iterable ===== | |||
可以使用下面的代码 | |||
定义函数 | |||
function *itep(map){ | |||
let iterator = map.iterator() | |||
// 这里用try是因为hasNext在有的类中是字段 | |||
try { while (true) yield iterator.next() } | |||
catch(e) {} | |||
} | |||
使用方法 | |||
let map = new IntMap() | |||
map.put(11, 3931) | |||
for (let entry of new iter(map)) { // new 不能省 | |||
print(entry) | |||
} | |||
====== Protected方法获取 ====== | |||
<pre> | |||
// $p 指 Packages | |||
$p.rhino.NativeJavaObject( | |||
$p.rhino.ImporterTopLevel(Vars.mods.scripts.context), // 用于刷新缓存 | |||
Core.assets, // 对象 | |||
$p.arc.assets.AssetManager, // 类对象 | |||
true // 是否包含protected | |||
).addAsset // 获得protected | |||
</pre> |
2024年10月2日 (三) 18:21的最新版本
Mindustry的JS
Mindustry使用: Rhino
类似于node.js,它没有window
,document
等一系列变量
Rhino并没有完全支持es6的语法
Mindustry提供了一下全局变量:global.js
一些常用的变量
scriptName
: 当前脚本的名称(这会随脚本的变化而变化,建议:const { scriptName } = this;
)modName
: 当前Mod的名称(这会随mod的变化而变化,建议:const { modName } = this;
)print
: 打印日志extend
:
关于解构赋值
cosnt { a, b } = { a: 1, b: 2 };
特殊语法
new F/* functionName */ ( /* args */ ) { /* code */ }
其实就是F/* functionName */( /* args */ , { /* code */ } )
在最后面传了一个对象
所以你可以:
new extend(Block, "a block") { setBars() { print(this.barMap) } }
Getter & Setter
Getter: 你可以使用xxx.class
等价于xxx.getClass()
- 注意:
Vars.class
获取到的是Class类(或者直接报错),如果想要获取对应类对象 可以使用Vars.__javaObject__
Setter: 你可以使用cell.element = xxx
,这等价于cell.setElement(xxx)
一些小坑
一个函数接受所有方法
extend(BulletType, { hit(b, x, y) { print(b); } }
BulletType#hit(Bullet b)
和BulletType#hit(Bullet b, float x, float y)
都会调用上面的hit方法,
所以x
,y
可能为undefined
for ... of ...
不能迭代java的Iterable
可以使用下面的代码
定义函数
function *itep(map){ let iterator = map.iterator() // 这里用try是因为hasNext在有的类中是字段 try { while (true) yield iterator.next() } catch(e) {} }
使用方法
let map = new IntMap() map.put(11, 3931) for (let entry of new iter(map)) { // new 不能省 print(entry) }
Protected方法获取
// $p 指 Packages $p.rhino.NativeJavaObject( $p.rhino.ImporterTopLevel(Vars.mods.scripts.context), // 用于刷新缓存 Core.assets, // 对象 $p.arc.assets.AssetManager, // 类对象 true // 是否包含protected ).addAsset // 获得protected