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());

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

オブジェクトの動作に関するいくつかの条件に従ってアニメーションを変更する

以下のコードでは、注釈と呼ばれるコメントを使用しています

JavaScriptで変数の宣言の直前に注釈を 記述することにより/* @type {gdjs.XXX} */、変数の型がgdjs.XXXであることをコードエディターに知らせます。エディターは、入力中(または単語にカーソルを合わせたとき)にオートコンプリートを提供することで、ユーザーを支援できます。

ほとんどの場合、注釈は必要ありません。使用している方法は documented によって型アノテーションに適合します。しかし、このオブジェクト固有のメソッド(スプライトオブジェクトのアニメーションを変更するメソッドなど)にアクセスする必要があります。例えば、次のように書く場合です /** @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);
  }
}
 
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);
}

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

カメラの位置をオブジェクトの位置に設定します

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

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