**This is an old revision of the document!**

JavaScriptコードイベント

このイベントを使用すると、ゲームにカスタムJavaScriptコードを追加できます。JavaScriptプログラミングに精通した上級ユーザーのみが使用することを意図しています。

JavaScriptイベントを追加するには、イベントシートツールバーの[+]ボタンをクリックし、JavaScriptコードを選択します。

追加したら、コードをクリックして編集します。GDevelopがイベントに到達するたびにコードが実行されます。

コードでは、runtimeSceneという名前の変数にアクセスできることに注意してください。変数runtimeSceneは、再生されているシーンを表します。以下は、標準のGDevelopイベントと、JavaScriptを使用するのと同等のイベントの例です。

runtimeSceneパラメーターの横にある「ここをクリックしてJavascriptに渡すオブジェクトを選択」をクリックすると、「objects」という配列変数が使用可能になります。ゲームオブジェクトのメニューが表示されます。選択したゲームオブジェクトを選択できます。そのオブジェクトは、javascriptオブジェクト配列に追加されます。

「オブジェクト」は、選択したオブジェクトの選択されたインスタンスを含む配列です。アクションまたは条件が使用するものとまったく同じです。たとえば、次の図は、JavaScriptイベントをサブイベントとして使用するイベントです。javascriptイベントは、プレーヤーと衝突している敵を操作します。

参考資料 📚

コードサンプル

変数の値を読み取って変更する

var myVar = runtimeScene.getVariables().get("MyVar");
var myVar2 = runtimeScene.getVariables().get("MyVar2");
 
var currentValue = myVar.getAsNumber();
myVar.setNumber(currentValue+1);
 
myVar2.setString("Hello, world");

gdjs.Variablegdjs.VariablesContainerを参照して下さい。

オブジェクトを別の位置に移動し、ゲームが最初のフレームをレンダリングしているかどうかを確認します

const players = runtimeScene.getObjects("Player");
const playerHitBoxes = runtimeScene.getObjects("PlayerHitBox");
if (playerHitBoxes.length === 0 || players.length === 0) return;
 
if (runtimeScene.getTimeManager().isFirstFrame()) {
  playerHitBoxes[0].hide();
}
 
players[0].setX(playerHitBoxes[0].getX() - 12);
players[0].setY(playerHitBoxes[0].getY());

同等のイベントは次のとおりです

Change animation according to some conditions on the behavior of an object

In the code below, we use a comment which is called an annotation.

By writing the annotation /** @type {gdjs.XXX} */ just before the declaration of a variable in JavaScript, you let the code editor know that the variable has the type gdjs.XXX. The editor will be able to assist you by providing autocompletion while you type (or when you hover over a word).

Most of the time annotations are not needed. The methods that you are using are already documented with type annotations. But when you use a list of objects, you may want to access this object specific method (for example, methods to modify the animation of a sprite object). In this case, you could write /** @type {gdjs.SpriteRuntimeObject} */.

If you don't do this, the code will still work, but the editor will only be able to provide you with the methods of gdjs.RuntimeObject (the base class).

When you get the behavior from an object, you also know what kind of behavior you're getting. Let the editor know this using an annotation (otherwise, you'll only get autocompletion for the base class, 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);
  }
}
 
var LEFTKEY = 37;
var RIGHTKEY = 39;
if (runtimeScene.getGame().getInputManager().isKeyPressed(LEFTKEY)) {
  player.flipX(true);
} else if (runtimeScene.getGame().getInputManager().isKeyPressed(RIGHTKEY)) {
  player.flipX(false);
}

Equivalent events would be:

Set the position of the camera to the position of an object

if (!objects.length) return; 
 
// Here, "objects" refer to a list of "Player", which should be selected
// in the configuration of the function.
 
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);
      }
  }
});

同等のイベントは次のとおりです。