2

開発中の最初のゲーム アプリケーションがあります。このゲームでは、ユーザーが操作する唯一のキャラクターが、あるブロックから別のブロックにジャンプできます。それは、マリオ(マリオ ブラザーズ) が移動中のリフトから別のリフトにジャンプするようなものです。彼が失敗した場合、彼は死ぬでしょう。では、ジャンプが成功した結果としての短い落下と、自由落下をどのように区別できますか? 私ができると思ったのは、キャラクターの垂直方向の速度を測定することです。したがって、次のコード行があります。didSimulatePhysicsで使用されます

SKNode *player = [self childNodeWithName:@"//player"]; // It's the node characterizing the game character
CGVector v = player.physicsBody.velocity;

if (v.dy < -2000) {
    [self endTheScene:kEndReasonLose]; // The character has died from free fall => game is over
}

ゲーム キャラクターがジャンプすると、ゲーム アプリケーションは -2022.466797 の垂直速度を記録できます。だからこの策は通用しない。他に何ができますか?目に見えないバーを設定し、ゲーム キャラクターがintersectsNodeで触れたかどうかを確認します。それも失敗する可能性があります。これまでゲームを開発したことがありません。どうやって作っているのかわからないので、任天堂のゲーム開発者の凄さを実感します。30年くらい経った今でも出来ません。

アドバイスありがとうございます。


アップデート

以下は、キャラクターが自由落下で死亡したかどうかを判断できると思います。

- (void)didSimulatePhysics {
    if (self.isMoving) {
    // isMoving is an instance variable (BOOL): YES if the game has started
        CGVector v = player.physicsBody.velocity;
        BOOL hasFallen = self.lastFallenDate ? [self.lastFallenDate timeIntervalSinceNow] < -2.0 : YES; // lastFallenDate is an instance variable recording the time when the character fell last time
        if (hasFallen) {
            if (v.dy < -1500) {
                [self endTheScene:kEndReasonLose];
            }
        }
    }
}

それでも、SKAction に関する限り、Apple には修正すべきバグがあると思います。何をやっても、キャラクターが落ちていないのに、ゲーム開始からちょうど5秒くらいで音が鳴ります。

- (void)endTheScene:(EndReason)endReason {
    if (endReason == kEndReasonLose) {
        SKAction *lossAudio = [SKAction playSoundFileNamed:@"failureAudio.caf" waitForCompletion:NO];
        [self runAction:lossAudio];
    }
}
4

1 に答える 1

2

スーパー マリオ ブラザーズはタイル ベースのゲームでした。画面はいくつかの正方形の領域に分割され、それぞれが値で表されていました。各タイルには、タイル ID に応じて画面のその領域に個別のスプライトがブリットされ、そのタイルのプロパティに基づいて、マリオがその上に立つことができるかどうか、それが彼を傷つけるかどうか、または彼が自由に飛ぶことができるかどうかを判断できます。 . これに魔法はありません。彼がどこにいるかを確認するだけです!

マリオが受けるダメージに関心がない場合 (つまり、固い地面にいる限り、どの高さからでもジャンプできる場合)、これは簡単です。世界よ、彼は死んだ:

  • 速度を無視します。y 位置を確認します。

ビルの屋上から飛び降りて生還させたくない場合は、速度を確認する必要があります。衝突の力で命を落とすほどの速さで移動しているかどうかを確認する必要があります。

  • y 位置を無視します。速度をチェック

彼がプラットフォームにいることをどのように知っていますか? 物理ノード?

正直なところ、世界を引き延ばす「床」平面を配置し、死にかけている配管工を捕まえるためにシーンの下部に固定することができます。これはパフォーマンスに影響しません。実際、Update メソッドでこれらのチェックを実行するよりも効率的です。

編集して追加

交差を気にしないでください-(void)didBeginContact:(SKPhysicsContact*)contact。デリゲートである限り、衝突が発生すると警告が表示されます。更新ループを完全にスキップします。これにより、衝突が発生した場合にトリガーされ、見逃されることはありません。

于 2014-02-28T22:43:23.643 に答える