JavaScript 代码事件
这个事件允许你在游戏中添加自定义的JavaScript代码。它只适用于熟悉JavaScript编程的高级用户。
要添加一个JavaScript事件,点击事件表工具栏中的+按钮,然后选择JavaScript代码:
添加后,点击代码以进行编辑。每次GDevelop到达事件时,代码都将被执行。
在所有的JavaScript事件中,你可以访问名为runtimeScene
的变量。这个变量代表正在播放的场景。下面是一个标准的GDevelop事件的示例,以及一个使用JavaScript的等效事件:
如果在runtimeScene
参数旁边点击“点击这里选择传递给JavaScript的对象”,你可以选择场景中的一个对象。这个对象的实例将作为一个名为objects
的数组传递给你的函数:
这个数组的使用方法正好像动作或条件所使用的一样。例如,下面的插图是使用JavaScript事件作为子事件的事件。JavaScript事件将操作与玩家发生碰撞的敌人:
在GDevelop扩展中使用JavaScript
危险
推荐使用JavaScript事件的方式是通过扩展实现新的动作、条件或行为。它们可以在项目之间重复使用,并与社区共享。在关于如何在扩展中使用JavaScript的页面中了解更多。
示例
提示
看它在行动! 🎮
在线打开这些示例。你可以通过下面给出的链接来实现。当你要求GDevelop创建一个新项目时,点击示例按钮,就会有更多的示例可用。
文本转语音
平台游戏中的JavaScript块
文档 📚
- 阅读**游戏引擎文档**以开始。
- 你也可以直接浏览**GDJS游戏引擎源代码**。
代码示例
读取和更改变量的值
const myVar = runtimeScene.getVariables().get("MyVar"); const myVar2 = runtimeScene.getVariables().get("MyVar2"); const currentValue = myVar.getAsNumber(); myVar.setNumber(currentValue + 1); myVar2.setString("Hello, world");
查看gdjs.Variable的文档。
移动对象到另一个位置,检查游戏是否在渲染第一帧
const players = runtimeScene.getObjects("Player"); const playerHitBoxes = runtimeScene.getObjects("PlayerHitBox"); // 如果意外情况下未找到玩家或碰撞箱对象,则提前停止。 if (playerHitBoxes.length === 0 || players.length === 0) return; // 仅在第一帧(即:在场景开始时)。 if (runtimeScene.getTimeManager().isFirstFrame()) { // 隐藏PlayerHitBoxes的第一个实例。 playerHitBoxes[0].hide(); } // 设置Player对象的位置。 players[0].setX(playerHitBoxes[0].getX() - 12); players[0].setY(playerHitBoxes[0].getY());
等效事件:
根据对象的行为条件更改动画
提示
在下面的代码中,我们使用了一个被称为注释的东西。
通过在JavaScript变量声明之前写入注释/** @type {gdjs.XXX} */
,您让代码编辑器知道该变量具有类型gdjs.XXX。编辑器将能够在您输入时(或当您悬停在一个单词上时)为您提供自动补全。
大多数时间不需要注释。您使用的方法已经设置了type注释。但是,当您使用对象列表时,您可能想访问这个特定对象的方法(例如,修改一个精灵对象的动画的方法)。在这种情况下,您可以写/** @type {gdjs.SpriteRuntimeObject} */
。
如果您不这样做,代码仍然可以运行,但编辑器只能为您提供gdjs.RuntimeObject
(基本类)的方法。
当您从一个对象中获取行为时,您还知道自己获得了什么类型的行为。通过注释让编辑器知道这一点(否则,您只会得到gdjs.RuntimeBehavior
基类的自动补全)。
const players = runtimeScene.getObjects("Player"); const playerHitBoxes = runtimeScene.getObjects("PlayerHitBox"); if (playerHitBoxes.length === 0 || players.length === 0) return; /** @type {gdjs.SpriteRuntimeObject} */ const player = players[0]; /** @type {gdjs.PlatformerObjectRuntimeBehavior} */ const platformerBehavior = playerHitBoxes[0].getBehavior("PlatformerObject"); if (platformerBehavior.isJumping() || platformerBehavior.isFalling()) { player.setAnimation(1); } else if (platformerBehavior.isOnFloor()) { if (!platformerBehavior.isMoving()) { player.setAnimation(0); } else { player.setAnimation(2); } } const LEFTKEY = 37; const RIGHTKEY = 39; if (runtimeScene.getGame().getInputManager().isKeyPressed(LEFTKEY)) { player.flipX(true); } else if (runtimeScene.getGame().getInputManager().isKeyPressed(RIGHTKEY)) { player.flipX(false); }
等效的事件将是:
设置相机位置为物体的位置
if (!objects.length) return; // 这里,“objects”指的是“Player”列表,在函数配置中应选择它。
runtimeScene.getLayer("").setCameraX(objects[0].getX());
淡出精灵对象的等效事件(在使用平台对象行为时,当精灵对象在地板上时)
objects.forEach(object => {
/** @type {gdjs.SpriteRuntimeObject} */
const enemy = object;
/** @type {gdjs.PlatformerObjectRuntimeBehavior} */
const platformerBehavior = object.getBehavior("PlatformerObject");
if (enemy.getAnimation() === 1 && platformerBehavior.isOnFloor() && !platformerBehavior.isMoving()) {
object.activateBehavior("PlatformerObject", false);
enemy.setOpacity(enemy.getOpacity() - 50 * object.getElapsedTime(runtimeScene) / 1000);
if (enemy.getOpacity() === 0) {
object.deleteFromScene(runtimeScene);
}
}
});
使用JavaScript获取函数的参数值
当在扩展、自定义行为或自定义对象的函数中使用JavaScript代码块时,您可以访问该函数的参数。访问参数的方式取决于参数的类型。
如果参数的类型为“Objects”,则可以获取传递给此对象的_实例数组_:
eventsFunctionContext.getObjects("myParameter");
在这种情况下,如果有一个名为“RotatedObjects”的参数,如果要将对象旋转45度,则可以执行以下操作:
const objects = eventsFunctionContext.getObjects("RotatedObjects");
const firstInstance = objects[0];
firstInstance.setAngle(45);
您还可以读取数字或字符串类型的参数值。例如,如果有一个类型为“Number”的参数:
const angle = eventsFunctionContext.getArgument("Angle");
可以使用相同的代码来访问字符串、数字或布尔参数。