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