按F1或页面右上角按钮可以打开此帮助页面🤔
关于此应用
这是一个通用的编程游戏框架,可以模块化地加载不同的场景,让用户在编辑器里编写代码来控制物理模拟中的物体。
目前支持三种语言:javascript、python3和c++。其中python仅支持有限的包(math等); c++仅支持基本语法和有限的头文件(不能定义class、struct,不支持模板等,具体请看JSCPP的readme)
代码均在本地浏览器中的沙箱里执行。
操作说明:
页面加载完成后会直接打开demo场景并开始运行示例代码。每次更改代码之后,需要点场景上方的重启来重新载入代码,或者点击热更新在不重启场景的情况下直接插入新的代码。
场景信息和全局变量
不同的场景可能有不同的全局变量定义和具体操作方式,请点击场景信息按钮查看。
通常js中的全局变量直接以js对象定义,可以用形如vessel.velocity.x的方式获取; python中是以字典形式定义,可以用形如vessel['velocity']['x']的方式获取; c++中没有直接定义全局变量,而是提供了一个获取全局变量的函数,可以用形如getFloat("vessel.velocity.x")的方式获取所需变量。
调试信息
js中的console.log(),python中的print(),c++中的printf都可以在虚拟控制台中输出信息。其中js和python可以直接打印对象或字典,c++只能打印字符串。
错误定位
如果代码运行过程中出错,双击控制台的错误信息可以让编辑器光标跳转到错误位置(仅限js和python)。
保存
代码改动后保存按钮上会有蓝点提示,虽然代码会缓存在页面的localStorage里,但还是建议及时保存成文件。如果代码不想要了可以点清除重置成默认代码。
制作自定义场景
请参考hopper场景的源码
首先,每个场景是由一个包含AMD(Asynchronous Module Definition)的.js文件来定义的。在define的参数中指定依赖项,在回调函数中用参数接收依赖项(其中level是必须的,因为Level是场景的父类)。
随后需要定义一个类继承Level类,至少实现以下方法:
- init() 在场景加载时被调用
- reset() 在用户点击重置场景时被调用
- tick() 在物理帧时被调用
- onCollision() 在发生碰撞时被调用
- exec(code, langtype) 在用户提交代码时被调用,code为代码文本,langtype为语言('js', 'py' 或 'cpp')
还需要设置以下属性:
- template 给出各种语言的示例代码
- desc 显示在场景信息里的描述文字(html)
- documentation 描述全局变量的类型、说明和结构
最后return这个类即可
将写好的代码存成.js文件,文件名命名为场景名,点击场景-添加并上传文件