ios - SpriteKit 游戏 : Telling Free Fall Death From Successful Jump

标签 ios ios7 sprite-kit sknode

我正在开发我的第一个游戏应用程序。在这个游戏中,用户控制的唯一角色将从一个方 block 跳到另一个方 block 。这就像马里奥(在《马里奥兄弟》中)从一部移动电梯跳到另一部。如果他失败了,他就会死。那么,如何区分自由落体和成功跳跃后的短暂下落呢?我认为我能做的一件事是测量角色的垂直速度。所以我有以下几行代码。它与 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触摸过它?这也可能会失败。我以前从未开发过游戏。所以我不知道他们是怎么做到的,这让我意识到任天堂游戏开发者是多么令人印象深刻。大约三十年后,我仍然做不到。

感谢您的建议。


更新

我认为以下内容可以判断角色是否因自由落体而死亡。

- (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];
    }
}

最佳答案

《 super 马里奥兄弟》是一款基于图 block 的游戏:屏幕被划分为许多方形区域,每个区域都由一个值表示。每个图 block 都会有一个单独的 Sprite ,根据图 block ID 传输到屏幕的该区域,并且根据该图 block 的属性,Shigeru 等人可以确定马里奥是否可以站在上面,是否会伤害他或者他是否可以自由飞行。这没有什么魔法,你只需要检查他在哪里!

如果你不关心你的马里奥会受到的伤害(即他可以从任何高度跳跃,只要它落在坚实的地面上),这很简单:如果他的 y 位置低于最低的固体在你的世界平台,他已经死了:

  • 忽略速度;检查 y 位置。

如果你不想让他从楼顶跳下幸存,你需要看看他的速度:他的移动速度是否足够快,以至于冲击力会结束他的生命?:

  • 忽略 y 位置;检查速度

你怎么知道他在平台上?物理节点?

老实说,您可以放置​​一个“地板”平面来拉伸(stretch)您的世界,并将其锚定在场景底部以捕获垂死的水管工,这不会影响性能 - 事实上,它比在更新中运行这些检查更有效方法。

编辑添加

不用担心交叉点,只要您是代表,-(void)didBeginContact:(SKPhysicsContact*)contact 就会提醒您发生的任何碰撞。完全跳过更新循环:这将触发任何冲突并且不会被错过

关于ios - SpriteKit 游戏 : Telling Free Fall Death From Successful Jump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22097902/

相关文章:

ios - MVVMCROSS Ios 绑定(bind) ShowViewModel

ios - iOS 7 中是否有蜂窝数据使用 API?

ios - Xcode 5 文档窗口缺少 sdk 指南和示例的完整概述

objective-c - 使用 Physics SKSpriteNode 子项暂停 SpriteKit 游戏

swift - 在模拟器上测试时的 iPad 设备方向问题

iOS-当我使用 uiview 到 uiviewcontroller 时如何设置选择器数据

objective-c - 我应该在哪里以及如何实例化一个将在 IOS 应用程序中全局使用的对象?

ios - XCode 5 和 Kiwi/XCUnit 的单元测试问题和崩溃

ios - 如何在 iOS 中创建受密码保护的 zip 文件

ios - 位掩码不工作。 SpriteKit swift