首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雪碧包玩家与敌人的碰撞

雪碧包玩家与敌人的碰撞
EN

Stack Overflow用户
提问于 2017-04-26 00:57:47
回答 1查看 364关注 0票数 2

我一直在四处寻找如何让我的玩家和敌人发生碰撞。我设置了一个攻击按钮,这样当按下按钮时,玩家前面的敌人就会从屏幕上移走。我如何设置碰撞,如何让它只在按钮被按下时进行碰撞?

我已经尝试使用这个代码来处理碰撞,但我不认为它有任何效果。

代码语言:javascript
复制
//physicsbody for player and enemies
func didBegin(_ contact: SKPhysicsContact) {
    var bodyA = SKPhysicsBody()
    var bodyB = SKPhysicsBody()

    if contact.bodyA.node?.name == "player" {
        bodyA = contact.bodyA
        bodyB = contact.bodyB
    } else  {
        bodyA = contact.bodyB
        bodyB = contact.bodyA
    }
    //Player hits the rocket and dies and also remove the rocket
    if bodyA.node?.name == "player" && bodyB.node?.name == "enemy" {
        bodyA.node?.removeFromParent()
        bodyB.node?.removeFromParent()


        //After player dies go to death scene
        let gameOver = GameOverScene(size:CGSize(width: 2048, height: 1536), won:  false)
        self.view?.presentScene(gameOver)

    }

}

然后这就是玩家:

代码语言:javascript
复制
 func createPlayer(_ position: CGPoint) { //This is the method that creates the player on screen. You must pass this method the position you want the sprite spawned. Or maybe you can do it somewhere else in Swift, I dunno.

    //graphic stuff
    //let playerTexture = SKTexture(imageNamed: "Ttam1") //create variable with graphic assigned to it
    let player = SKSpriteNode(texture: playerTexture) //give player the graphic
    player.size = CGSize(width: 175, height: 200) //player sprite size
    player.zPosition = 20
    player.name = "player"
    //physics stuff
    player.physicsBody = SKPhysicsBody(texture: playerTexture, size: player.size) //Set up pixel-perfect collision mesh for the player
    player.physicsBody?.isDynamic = true
    player.physicsBody!.affectedByGravity = true //Stop the player from being affected by gravity
    player.physicsBody?.allowsRotation = false
    player.physicsBody?.categoryBitMask = ColliderType.PLAYER


    //spawny stuff
    insertChild(player, at: 0) //spawn player
    player.position = position //move player to position passed into this method
    playerNode = player //Create a node where the player is, filled by the player itself... Like a D.Va ult! The call mech one, not the self-destruct one.
    /*
    let frame2 = SKTexture(imageNamed: "Ttam2")
    let frame3 = SKTexture(imageNamed: "Ttam3")
    let frame4 = SKTexture(imageNamed: "Ttam4")

    */
    let animation = SKAction.animate(with: [playerTexture, frame2, frame3, frame4], timePerFrame: 0.2)
    let runForever = SKAction.repeatForever(animation)

    player.run(runForever)

}

这是我们的敌人:

代码语言:javascript
复制
//Create enemy - slime
func spawnEnemy() {

    //Call the enemy variable and sprite
    let enemyTexture = SKTexture(imageNamed: "Slime1")
    let enemy = SKSpriteNode(texture: enemyTexture)
    enemy.size = CGSize(width: 175, height: 175)
    enemy.zPosition = 10
    //Collision with the enemy
    enemy.name = "enemy"
    enemyNode = enemy

    //Randomly place the enemy on screen and move
    enemy.position = CGPoint(x: 2100, y: 325)
    enemy.physicsBody? = SKPhysicsBody(texture: enemyTexture, size: enemy.size)
    enemy.physicsBody?.affectedByGravity = true
    enemy.physicsBody?.allowsRotation = false
    enemy.physicsBody?.isDynamic = true




    //Add enemy node to screen.
    addChild(enemy)

    let frame2 = SKTexture(imageNamed: "Slime2")
    let frame3 = SKTexture(imageNamed: "Slime3")
    let animation = SKAction.animate(with: [enemyTexture, frame2, frame3, frame2], timePerFrame: 0.2)
    let runForever = SKAction.repeatForever(animation)

    enemy.run(runForever)



    //Set the enemy to move in a single direction:
    let actionMove = SKAction.moveTo(x: -enemy.size.width/2, duration: 10.0)

    //Remove enemy from screen when action is complete:
    let actionRemove = SKAction.removeFromParent()
    enemy.run(SKAction.sequence([actionMove, actionRemove]))

}
EN

回答 1

Stack Overflow用户

发布于 2017-04-26 15:44:09

要让攻击按钮摧毁敌人,请执行touchesBegan,如果按下了攻击按钮,则设置一个标志:

attacking = true

(首先在特性定义中定义attackingvar attacking = false )

touchesEnded中,如果在attck按钮上的触摸结束,则设置attacking = false

然后,在你的didBegin中,只有在没有设置攻击标志的情况下才能销毁玩家。如果设置好了(即玩家在按下攻击按钮的同时与粘液发生碰撞),则只销毁粘液,添加一些分数等。

代码语言:javascript
复制
//Player hits the rocket and dies and also remove the rocket
if bodyA.node?.name == "player" && bodyB.node?.name == "enemy" {    
    switch attacking {
    case false:
        bodyA.node?.removeFromParent()
        bodyB.node?.removeFromParent()

        //After player dies go to death scene
        let gameOver = GameOverScene(size:CGSize(width: 2048, height: 1536), won:  false)
        self.view?.presentScene(gameOver)
    case true:
        let enemy = contact.bodyA.categoryBitMask == ColliderType.ENEMY ? contact.bodyA.node : contact.bodyB.node
        enemy.removeFromParent()
        score += 1
    }
}

我假设你评论中的‘火箭’是敌人的节点,它是粘液?:-)我没有看到为敌人设置的categoryBitMask -有吗?我以为是ColliderType.ENEMY

didBegin:中的这段代码是多余的:

代码语言:javascript
复制
var bodyA = SKPhysicsBody()
var bodyB = SKPhysicsBody()
if contact.bodyA.node?.name == "player" {
    bodyA = contact.bodyA
    bodyB = contact.bodyB
} else  {
    bodyA = contact.bodyB
    bodyB = contact.bodyA
}

因为您从来没有使用过您设置的bodyAbodyB变量。如果您以后确实使用它们,那么这可能更有意义:

代码语言:javascript
复制
if contact.bodyA.node?.name == "player" {
    player = contact.bodyA
    enemy = contact.bodyB
} else  {
    enemy = contact.bodyB
    player = contact.bodyA
}

然后是下面这行代码:

代码语言:javascript
复制
        let enemy = contact.bodyA.categoryBitMask == ColliderType.ENEMY ? contact.bodyA.node : contact.bodyB.node

可以从case true:块中删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43616780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档