Tiniest2Dで2Dゲームを作る
衝突と物理
Lesson 9 of 11 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
コリジョンシステム
仕組み
- すべてのオブジェクトは、そのスプライトサイズに基づくAABB(軸に揃ったバウンディングボックス)を持っています
- スプライトはカスタムコライダー境界を持つことができます(スプライトエディタで設定されます)
- 動的オブジェクトのコリジョンは毎フレームチェックされます
コリジョンタイプの説明
- なし - オブジェクトはコリジョンシステムによって完全に無視されます
- 静的 - 動かない壁として機能します(地形やプラットフォームに使用)
- 動的 - 移動し、他のコライダーから押し出されます(プレイヤーや敵に使用)
- トリガー - 重なりを検出しますが、移動をブロックしません(収集品やゾーンに使用)
コリジョン解決
- 動的オブジェクトは、自動的に静的または他の動的オブジェクトから押し出されます
- トリガーは移動をブロックすることはありません - 重なりを検出するだけです
onCollisionコールバック
onCollision(objA, objB)関数は、オブジェクトが重なったときに呼び出されます。コールバックパターンは次の通りです:
| objAの種類 | objBの種類 | コールバック生成? | メモ |
|---|---|---|---|
| 動的 | 静的 | はい | 動的が静的から押し出される |
| 動的 | 動的 | はい(両方の方向) | 両方のオブジェクトがコールバックを受け取ります |
| 動的 | トリガー | はい | トリガーが検出されました |
| トリガー | トリガー | はい | 両方のトリガーがお互いを検出 |
| 静的 | 静的 | いいえ | 静的はコールバックを生成しません |
| 静的 | トリガー | いいえ | どちらもコールバックを生成しません |
主要ルール:
objAは常に動的またはトリガーです- 2つの動的オブジェクトが衝突すると、両方にコールバックが生成されます(それぞれがobjAとして)
- 2つのトリガーが重なると、1つのコールバックが生成されます(最初のトリガーがobjAとして)
- 静的オブジェクトは決してobjAとして表示されません
例: 異なるコリジョンタイプの検出
func onCollision(objA, objB) {
var typeA = getCollisionType(objA)
var typeB = getCollisionType(objB)
// プレイヤー(動的)がコイン(トリガー)に触れる
if (getName(objA) == "player" && typeB == COLLISION_TRIGGER()) {
print("収集しました!")
removeObject(gameScene, objB)
}
// 2つのトリガーが重なる(例: 検出ゾーン)
if (typeA == COLLISION_TRIGGER() && typeB == COLLISION_TRIGGER()) {
print(getName(objA) + " が " + getName(objB) + "のゾーンに入った")
}
// プレイヤーが敵に当たる(両方動的)
if (getName(objA) == "player" && getName(objB) == "enemy") {
print("プレイヤーがヒットしました!")
}
}
物理システム
Tiniest Engineには、動的オブジェクトの重力と速度を自動的に処理するビルトイン物理システムがあります。
物理の仕組み
エンジンは毎フレーム、次の処理を自動的に行います:
- シーンの重力を各動的オブジェクトの速度に適用します
- 速度を各動的オブジェクトの位置に適用します
// 物理パイプライン(エンジンによって自動的に処理される):
velocity += gravity * dt
position += velocity * dt
重力の設定
シーンに重力を設定して動的オブジェクトを落下させます:
func start() {
// 下向きの重力を設定(300ピクセル毎秒²)
setGravityY(gameScene, 300)
// オプション: 水平方向の重力(風の効果)
setGravityX(gameScene, 0)
setScene(gameScene)
}
速度の使用
位置を直接設定するのではなく、速度を使用してオブジェクトを制御します:
var player = Object("player")
var jumpForce = -200 // 負 = 上向き
func start() {
setCollisionType(player, COLLISION_DYNAMIC())
addObject(gameScene, player)
setGravityY(gameScene, 300)
setScene(gameScene)
}
func onUpdate(dt) {
// 水平方向の動きは速度を介して
if (isKeyHeld(KEY_LEFT())) {
setVelocityX(player, -100)
} else if (isKeyHeld(KEY_RIGHT())) {
setVelocityX(player, 100)
} else {
setVelocityX(player, 0)
}
// 上向きの速度を設定してジャンプ
if (isKeyPressed(KEY_SPACE())) {
setVelocityY(player, jumpForce)
}
}
物理関数
| 関数 | 説明 |
|---|---|
getVelocityX(obj) |
オブジェクトのX速度を返します |
setVelocityX(obj, vx) |
オブジェクトのX速度を設定します |
getVelocityY(obj) |
オブジェクトのY速度を返します |
setVelocityY(obj, vy) |
オブジェクトのY速度を設定します |
getGravityX(scene) |
シーンの重力X成分を返します |
setGravityX(scene, gx) |
シーンの重力X成分を設定します |
getGravityY(scene) |
シーンの重力Y成分を返します |
setGravityY(scene, gy) |
シーンの重力Yを設定します(正 = 下) |
重要: COLLISION_DYNAMIC()オブジェクトだけが重力の影響を受け、自動的にその速度が適用されます