【问题标题】:spriteKit collision not workingspriteKit 碰撞不起作用
【发布时间】:2018-05-03 01:29:21
【问题描述】:

不确定是哪一部分的问题。我正在做一个 spriteKit 射击游戏,但碰撞不起作用。宇宙飞船没有被摧毁。

一定和某处的碰撞有关……

射弹只是稍微将敌人移动过来,但不会摧毁他们。

    struct physicsCategory {
        static let player : UInt32 = 1
         static let enemy : UInt32 = 2
        static let projectile : UInt32 = 3


    }


        func didBeginContact(contact: SKPhysicsContact) {
            let firstBody : SKPhysicsBody = contact.bodyA
            let secondBody : SKPhysicsBody = contact.bodyB

            if ((firstBody.categoryBitMask == physicsCategory.projectile) && (secondBody.categoryBitMask == physicsCategory.enemy) || (firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.projectile)) {


                projectileCollision(enemyTemp: firstBody.node as! SKSpriteNode, projectileTemp: secondBody.node as! SKSpriteNode)

            }
            if ((firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.player) || (firstBody.categoryBitMask == physicsCategory.player) && (secondBody.categoryBitMask == physicsCategory.enemy)) {


                enemyPlayerCollision(enemyTemp: firstBody.node as! SKSpriteNode, playerTemp: secondBody.node as! SKSpriteNode)

            }
        }
        ///////////
        func projectileCollision(enemyTemp: SKSpriteNode, projectileTemp: SKSpriteNode){
            enemy.removeFromParent()
            projectile.removeFromParent()

            score = score + 1

            updateScore()




        }


    ////////////
        func enemyPlayerCollision(enemyTemp: SKSpriteNode, playerTemp: SKSpriteNode) {

            mainLabel.fontSize = 50
            mainLabel.alpha = 1.0
            mainLabel.text = "Game Over"

            player.removeFromParent()

            isAlive = false

            waitThenMoveToTiltleScreen()
        }

【问题讨论】:

  • 能否分享一下为精灵设置 physicBodies 和 collisionBitMask 的代码?您的 PhysicsCategory 结构似乎表明您对 bitMask 的工作方式并不完全满意...
  • func spawnProjectile(){ projectile = SKSpriteNode(color: offWhiteColor, size: projectileSize) projectile.size = projectileSize projectile.position = CGPoint(x: (player.position.x), y: (player .position.y)) projectile.physicsBody = SKPhysicsBody(rectangleOf: projectile.size) projectile.physicsBody?.affectedByGravity = false projectile.physicsBody?.categoryBitMask = PhysicsCategory.projectile projectile.physicsBody?.contactTestBitMask = PhysicsCategory.enemy projectile.physicsBody? .isDynamic = false
  • 嗨 T.Benjamin 抱歉,我只能粘贴这么少量的代码。但我在下面给出了答案/问题。只是一些射弹正在穿过敌人,但不是全部。我猜这是龙骑士所说的“需要处理你的第一个身体是射弹,你的第二个身体是敌人的情况”但我似乎不能这样做,因为我是 spriteKit 的新手。

标签: ios swift sprite-kit


【解决方案1】:

您的第一个问题是static let projectile : UInt32 = 3

如果你想声明一个唯一的位掩码,它需要是 2 的幂 (2^0,2^1,2^2,..etc)

3 的真正含义是,你的弹丸既是玩家又是敌人(1 = 2^0, 2 = 2^1)

你的第二个问题是你的逻辑

let f = firstBody.categoryBitMask
let s = secondbody.categoryBitmask
let p = physicsCategory.projectile
let x = physicsCategory.player
let e = physicsCategory.enemy

这是你的 if 语句:

if ((f == p) && (s == e) || (f == e) && (s == p)) {
   projectileCollision(enemyTemp: firstBody.node as! SKSpriteNode, projectileTemp: secondBody.node as! SKSpriteNode)
}

在您的 if 语句中,您是说 first 或 second 可能是敌人,但在您的射弹碰撞方法中,您声称第一个物体始终是敌人,第二个物体始终是射弹。

你需要处理你的第一个身体是弹丸,你的第二个身体是敌人的情况,因为你的弹丸很可能会进入敌人,所以它会是第一个身体。

【讨论】:

  • 谢谢。处理第一个身体是弹丸,第二个身体是敌人的情况的最佳方法是什么..
  • 目前玩家是唯一一个被FromParent移除的人。即使我在同一个语句中将enemy.removeFromParent() projectile.removeFromParent() 放在下面..
  • 你需要以某种方式保证你的敌人是第一机体而你的导弹是第二机体,使用新变量并检查谁是第一或第二,并将其分配给新变量
【解决方案2】:

谢谢(对不起,我对 spriteKit 还很陌生)我想我快到了,因为我在下面编写了这段代码,并且效果更好。

只有一个小问题!一些射弹只是穿过敌人。只有一些摧毁。

func didBegin(_ contact: SKPhysicsContact) {
        let firstBody : SKPhysicsBody = contact.bodyA
        let secondBody : SKPhysicsBody = contact.bodyB

        if ((firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.projectile) || (firstBody.categoryBitMask == physicsCategory.projectile) && (secondBody.categoryBitMask == physicsCategory.enemy)) {


            projectileCollision(enemy: firstBody.node as! SKSpriteNode, projectile: secondBody.node as! SKSpriteNode)

            }
        else if ((firstBody.categoryBitMask == physicsCategory.enemy) && (secondBody.categoryBitMask == physicsCategory.player) || (firstBody.categoryBitMask == physicsCategory.player) && (secondBody.categoryBitMask == physicsCategory.enemy)) {


            enemyPlayerCollision(enemy: firstBody.node as! SKSpriteNode, person: secondBody.node as! SKSpriteNode)

        }
    }
    ///////////
    func projectileCollision(enemy: SKSpriteNode, projectile: SKSpriteNode){

        enemy.removeFromParent()
        projectile.removeFromParent()

        score = score + 1

        updateScore()


    }



    ////////////
    func enemyPlayerCollision(enemy: SKSpriteNode, person: SKSpriteNode) {

        mainLabel.fontSize = 50
        mainLabel.alpha = 1.0
        mainLabel.text = "Game Over"

        person.removeFromParent()
      enemy.removeFromParent()

        isAlive = false

        waitThenMoveToTiltleScreen()
    }

【讨论】:

  • 好的,现在可以去某个地方了。射弹要快,所以碰撞没有检测到所有的碰撞,只有一些!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多