从下面击中物体时如何结束游戏?

时间:2015-03-23 20:45:58

标签: swift xcode6 sprite-kit

嘿所以我正在制作这个项目,玩家必须将平台一直跳到顶部。一些怪物在整个游戏中随机产生。所以当你从下面击中它们时,我们的想法是失去游戏,但如果你跳过它们就可以继续游戏。我已经完成了玩家跳过它并摧毁怪物的部分,但是当你从下面击中它时我仍然卡在那部分上以失去游戏。关于如何设法做到这一点的任何想法?对于这个项目,我遵循了Ray Wenderlich关于如何让游戏像大型跳跃的教程。 所以在我的GameScene上,我有didBeginContact方法:

func didBeginContact(contact: SKPhysicsContact) {
    var updateHUD = false
    let whichNode = (contact.bodyA.node != player) ? contact.bodyA.node : contact.bodyB.node
    let other = whichNode as GameObjectNode
    updateHUD = other.collisionWithPlayer(player)
    if updateHUD {

        lblStars.text = String(format: "X %d", GameState.sharedInstance.stars)
        lblScore.text = String(format: "%d", GameState.sharedInstance.score)
    }
}

然后从GameObjectNode场景调用该方法。

class MonsterNode: GameObjectNode {  
var monsterType: MonsterType!
override func collisionWithPlayer(player: SKNode) -> Bool {
    if player.physicsBody?.velocity.dy < 0 {
        player.physicsBody?.velocity = CGVector(dx: player.physicsBody!.velocity.dx, dy: 450.0)
        if monsterType == .Normal {
            self.removeFromParent()
        }
    }

当玩家跳到怪物顶部时,怪物将从父母身上移除。我试图设置如果当与怪物碰撞时玩家的速度大于0,那么玩家将从父母移除。然后,当我回到我的GameScene时,我可以在我的更新方法中声明一些内容,以便当从父调用中删除播放器时调用endGame()方法。

override func update(currentTime: NSTimeInterval) {
    if gameOver {
        return
    }
    if Int(player.position.y) > endLevelY {
        endGame()
    }
    if Int(player.position.y) < maxPlayerY - 500 {
        endGame()     
    }
}

当然我无法完成这项工作,但我仍然无法做到。所以如果有人能帮助我如何设法做到这一点,或者可能是一些可以指导我这样做的教程我会非常感激!先感谢您。

1 个答案:

答案 0 :(得分:0)

首先,您使用didBeginContact方法确定玩家和怪物之间是否已建立联系。接下来,您将比较玩家和怪物的y位置。如果怪物的位置大于玩家的...... BANG,玩家就会死亡。

代码示例假设您有多个怪物,每个怪物都有一个唯一的名称,并将它们全部存储在一个数组中。

- (void)didBeginContact:(SKPhysicsContact *)contact {
uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask);

if (collision == (CategoryMonster | CategoryPlayer)) {
    for(SKSpriteNode *object in monsterArray) {
        if(([object.name isEqualToString:contact.bodyB.node.name]) || ([object.name isEqualToString:contact.bodyA.node.name])) {
            if(object.position.y > player.position.y) {
                // moster is above player
            }
        }
    }
}

几个笔记......如果你在任何时候有多个活跃的怪物,你需要为每个怪物都有一个独特的名字。原因是你需要知道哪个怪物联系了玩家,只有你可以区分怪物才会发生。因此,每个人的唯一名称。

对y位置的if检查很简单,只需要+1 y即可完成。如果您的玩家可以与怪物进行侧面接触而不是死亡,您可以将if条件更改为if(object.position.y > player.position.y+50),以确保联系人实际上来自底部。

(我不太熟悉Swift,所以代码示例在Obj-C中。)