Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

例: 完全なゲーム

このレッスンでは、小さなコレクションゲームを作成します。プレイヤーはシーン内を移動し、壁にぶつかり、コインを集め、ゲーム終了時に最終スコアを表示します。

全てのスクリプトを一度に貼り付ける代わりに、例はほとんどのTiniest2Dプロジェクトで使用する部分に分割されています:

  • アセットと状態変数
  • start()
  • onUpdate(dt)
  • onCollision(objA, objB)
  • end()

1. アセットとゲーム状態

最初のセクションでは、スクリプトの残りの部分で使用されるアセットと変数を作成します。スプライトは画像で、シーンはレベル、プレイヤーはそのシーンに配置されるオブジェクトで、スコア/速度変数はシンプルなゲーム状態を保存します。

// アセットを作成
var playerImg = Sprite(16, 16)
var wallImg = Sprite(16, 16)
var coinImg = Sprite(8, 8)
var level = Scene()

// プレイヤーオブジェクトを作成
var player = Object("Player")

// ゲーム状態
var score = 0
var speed = 100

この時点では、変数は存在しますが、ゲームはまだ何もシーンに配置していません。そのセットアップは start() で行われます。

2. start() 関数

start() はゲームが始まったときに一度実行されます。オブジェクトの設定、最初のシーンの設定、カメラの位置決め、初期値の準備を行います。

func start() {
    // プレイヤーのセットアップ
    setSprite(player, playerImg)
    setCollisionType(player, COLLISION_DYNAMIC())
    setX(player, 50)
    setY(player, 50)
    addObject(level, player)

    // 初期シーンを設定
    setScene(level)

    // カメラをプレイヤーに合わせる
    setCameraX(level, getX(player))
    setCameraY(level, getY(player))
    setCameraZoom(level, 3)

    print("コインを集めてください!")
}

プレイヤーは COLLISION_DYNAMIC() を使用します、壁に衝突して押し出されるべきだからです。カメラはプレイヤーの中心に配置され、レベルビューは正しい位置から始まります。

3. onUpdate(dt) 関数

onUpdate(dt) は各フレームごとに実行されます。ここでは、プレイヤーが入力を読み取り、移動し、カメラを更新し、リセットキーをチェックします。

dt は「デルタタイム」を意味します:前のフレームからの時間の量です。移動を dt で乗算することで、異なるフレームレート間で移動速度をより一貫させることができます。

func onUpdate(dt) {
    // プレイヤーの移動
    var moveX = 0
    var moveY = 0

    if (isKeyHeld(KEY_LEFT()) || isKeyHeld(KEY_A())) {
        moveX = -1
    }
    if (isKeyHeld(KEY_RIGHT()) || isKeyHeld(KEY_D())) {
        moveX = 1
    }
    if (isKeyHeld(KEY_UP()) || isKeyHeld(KEY_W())) {
        moveY = -1
    }
    if (isKeyHeld(KEY_DOWN()) || isKeyHeld(KEY_S())) {
        moveY = 1
    }

    // 移動を適用
    setX(player, getX(player) + moveX * speed * dt)
    setY(player, getY(player) + moveY * speed * dt)

    // カメラがプレイヤーを追う
    setCameraX(level, getX(player))
    setCameraY(level, getY(player))

    // Rキーでレベルをリセット
    if (isKeyPressed(KEY_R())) {
        resetScene(level)
        setX(player, 50)
        setY(player, 50)
        score = 0
        print("レベルがリセットされました!")
    }
}

移動のコードは、キーボード入力から方向を構築します。その後、その方向をプレイヤーの現在の位置に加えます。カメラは移動の後に更新され、新しい位置に従います。

4. onCollision(objA, objB) 関数

onCollision(objA, objB) は2つのオブジェクトが衝突したときに実行されます。この例では、コインは COLLISION_TRIGGER() を使用するべきです。トリガーオブジェクトはオーバーラップを報告しますが、動きをブロックしません。

func onCollision(objA, objB) {
    var nameB = getName(objB)
    var typeB = getCollisionType(objB)

    // コイン収集(コインはシーンエディタでTRIGGERタイプにするべき)
    if (typeB == COLLISION_TRIGGER()) {
        removeObject(level, objB)
        score = score + 1
        print("スコア: " + score)
    }
}

プレイヤーがトリガーに触れると、スクリプトはそのオブジェクトをシーンから削除し、スコアを増やします。これがピックアップ、鍵、パワーアップ、チェックポイントの基本的なパターンです。

5. end() 関数

end() はゲームが停止したときに実行されます。この例では最終スコアを表示するだけですが、大きなゲームではこの関数をクリーンアップや最終デバッグメッセージに使用できます。

func end() {
    print("最終スコア: " + score)
}

例のセットアップ

  1. スプライトを作成:
  2. playerImg をCtrl+クリックし、キャラクターを描きます(例:シンプルなスティックフィギュア)
  3. wallImg をCtrl+クリックし、固体ブロックを描きます
  4. coinImg をCtrl+クリックし、小さな円またはダイヤモンドを描きます

  5. シーンを設計:

  6. level をCtrl+クリック
  7. 左のパネルで wallImg を選択し、衝突を「静的」に設定します
  8. 壁を端に描き、迷路を作成します
  9. coinImg を選択し、装飾用コインタイルに対して衝突を「なし」と設定します
  10. シーン全体に視覚的ガイドとしてコインを配置します

  11. トリガーコインオブジェクトを作成:

シーンに押し込まれたスプライトはタイルや装飾に便利ですが、収集可能なコインはオブジェクトである必要があるため、衝突コールバックがそれらを削除できます。コインオブジェクトを次のように追加します:

var coin1 = Object("Coin1")
var coin2 = Object("Coin2")

func start() {
    // ... プレイヤーのセットアップ ...

    // コインをトリガーとしてセットアップ
    setSprite(coin1, coinImg)
    setCollisionType(coin1, COLLISION_TRIGGER())
    setX(coin1, 100)
    setY(coin1, 80)
    addObject(level, coin1)

    setSprite(coin2, coinImg)
    setCollisionType(coin2, COLLISION_TRIGGER())
    setX(coin2, 150)
    setY(coin2, 120)
    addObject(level, coin2)

    // ... startの残り ...
}

このパターンは、より多くのコイン、敵、ドア、またはスクリプトビヘイビアが必要な任意のオブジェクトに拡張できます。