Skip to content

JavaScript 代码事件

这个事件允许你在游戏中添加自定义的JavaScript代码。它只适用于熟悉JavaScript编程的高级用户。

要添加一个JavaScript事件,点击事件表工具栏中的+按钮,然后选择JavaScript代码:

图示

添加后,点击代码以进行编辑。每次GDevelop到达事件时,代码都将被执行。

在所有的JavaScript事件中,你可以访问名为runtimeScene的变量。这个变量代表正在播放的场景。下面是一个标准的GDevelop事件的示例,以及一个使用JavaScript的等效事件:

图示

如果在runtimeScene参数旁边点击“点击这里选择传递给JavaScript的对象”,你可以选择场景中的一个对象。这个对象的实例将作为一个名为objects的数组传递给你的函数:

图示

这个数组的使用方法正好像动作或条件所使用的一样。例如,下面的插图是使用JavaScript事件作为子事件的事件。JavaScript事件将操作与玩家发生碰撞的敌人:

图示

在GDevelop扩展中使用JavaScript

危险

推荐使用JavaScript事件的方式是通过扩展实现新的动作、条件或行为。它们可以在项目之间重复使用,并与社区共享。在关于如何在扩展中使用JavaScript的页面中了解更多。

示例

提示

看它在行动! 🎮

在线打开这些示例。你可以通过下面给出的链接来实现。当你要求GDevelop创建一个新项目时,点击示例按钮,就会有更多的示例可用。

文本转语音

打开GDevelop中的示例

平台游戏中的JavaScript块

打开GDevelop中的示例

文档 📚

代码示例

读取和更改变量的值

javascript
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的文档。

移动对象到另一个位置,检查游戏是否在渲染第一帧

javascript
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基类的自动补全)。

javascript
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); }

等效的事件将是:

设置相机位置为物体的位置

javascript
if (!objects.length) return;  // 这里,“objects”指的是“Player”列表,在函数配置中应选择它。
runtimeScene.getLayer("").setCameraX(objects[0].getX());

淡出精灵对象的等效事件(在使用平台对象行为时,当精灵对象在地板上时)

javascript
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”,则可以获取传递给此对象的_实例数组_:

javascript
eventsFunctionContext.getObjects("myParameter");

在这种情况下,如果有一个名为“RotatedObjects”的参数,如果要将对象旋转45度,则可以执行以下操作:

javascript
const objects = eventsFunctionContext.getObjects("RotatedObjects");
const firstInstance = objects[0];
firstInstance.setAngle(45);

您还可以读取数字或字符串类型的参数值。例如,如果有一个类型为“Number”的参数:

javascript
const angle = eventsFunctionContext.getArgument("Angle");

可以使用相同的代码来访问字符串、数字或布尔参数。