Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 尽管有着不同的面具,精灵们仍在碰撞_Swift_Sprite Kit - Fatal编程技术网

Swift 尽管有着不同的面具,精灵们仍在碰撞

Swift 尽管有着不同的面具,精灵们仍在碰撞,swift,sprite-kit,Swift,Sprite Kit,我的精灵有5个不同类别的位掩码: 红色子弹(敌人射击) 绿子弹(编剧) 船舶类别(玩家精灵) 敌人类别(AI精灵) 墙类别(屏幕边框) 我已经正确设置了位掩码,但是我遇到了一些不应该发生的碰撞。两颗子弹将相互碰撞并撞向墙壁,而不是穿过墙壁。如果这些位掩码不包括在collisionBitmap中,为什么会发生这种情况 let shipCategory: UInt32 = 1 let wallCategory: UInt32 = 2 let greenBulletCategory: UInt32

我的精灵有5个不同类别的位掩码:

  • 红色子弹(敌人射击)
  • 绿子弹(编剧)
  • 船舶类别(玩家精灵)
  • 敌人类别(AI精灵)
  • 墙类别(屏幕边框)
我已经正确设置了位掩码,但是我遇到了一些不应该发生的碰撞。两颗子弹将相互碰撞并撞向墙壁,而不是穿过墙壁。如果这些位掩码不包括在collisionBitmap中,为什么会发生这种情况

let shipCategory: UInt32 = 1
let wallCategory: UInt32 = 2
let greenBulletCategory: UInt32 = 3
let enemyShipCategory: UInt32 = 4
let redBulletCategory: UInt32 = 5

    self.anchorPoint = CGPoint.init(x: 0.5, y: 0.5)
    setUpHeaderUI()
    self.physicsWorld.gravity = CGVector.zero
    self.physicsWorld.contactDelegate = self
    createBG()
    addShip()
    self.physicsBody = SKPhysicsBody.init(edgeLoopFrom: self.frame)
    self.physicsBody?.collisionBitMask = shipCategory | enemyShipCategory
    self.physicsBody?.categoryBitMask = wallCategory
    self.physicsBody?.friction = 0

func enemyShoot(node: SKSpriteNode){
    Bullet = SKSpriteNode.init(imageNamed: "red.svg.hi")
    Bullet.zPosition = 1
    Bullet.setScale(0.2)
    Bullet.position = node.position
    Bullet.physicsBody = SKPhysicsBody.init(rectangleOf: Bullet.size)
    Bullet.physicsBody?.isDynamic = true
    Bullet.physicsBody?.allowsRotation = true
    Bullet.physicsBody?.linearDamping = 0
    Bullet.physicsBody?.friction = 0
    Bullet.physicsBody?.categoryBitMask = redBulletCategory
    Bullet.physicsBody?.contactTestBitMask = shipCategory
    Bullet.physicsBody?.velocity = CGVector.init(dx: ((node.physicsBody?.velocity.dx)!/100), dy: CGFloat.init(-750))
    Bullet.name = "Bullet"
    self.addChild(Bullet)
}

func playerShoot(){
    changePower(change: 10)
    if(power > 99 ){
        consPowerTimer.invalidate()
        changePower(change: 100 - power)
        canFire = false
        powerTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.powerCooldown), userInfo: nil, repeats: true)
    }
    else{
    Bullet = SKSpriteNode.init(imageNamed: "green.svg.hi")
    Bullet.zPosition = 1
    Bullet.zRotation = CGFloat.init(3 * Double.pi/2)
    Bullet.setScale(0.2)
    Bullet.position = ship.position
    Bullet.physicsBody = SKPhysicsBody.init(rectangleOf: Bullet.size)
    Bullet.physicsBody?.isDynamic = true
    Bullet.physicsBody?.allowsRotation = true
    Bullet.physicsBody?.linearDamping = 0
    Bullet.physicsBody?.friction = 0
    Bullet.physicsBody?.categoryBitMask = greenBulletCategory
    Bullet.physicsBody?.contactTestBitMask = enemyShipCategory
    print(ship.physicsBody?.velocity.dx)
    Bullet.physicsBody?.velocity = CGVector.init(dx: (ship.physicsBody?.velocity.dx)!, dy: CGFloat.init(750))
    Bullet.name = "Bullet"
    self.addChild(Bullet)
    }

func addAttackShip(){
    //30,40,40
    let enemy = attackShip.init()
    enemy.setScale(0.08)
    enemy.zRotation = CGFloat(0)
    enemy.physicsBody = SKPhysicsBody.init(rectangleOf: enemy.size)
    enemy.physicsBody?.isDynamic = true
    enemy.name = "enemy"
    enemy.zPosition = 2
    enemy.physicsBody?.mass = CGFloat.init(10)
    enemy.physicsBody?.friction = 0
    enemy.physicsBody?.categoryBitMask = enemyShipCategory
    enemy.physicsBody?.collisionBitMask = enemyShipCategory | wallCategory
    enemy.physicsBody?.contactTestBitMask = greenBulletCategory | shipCategory
    enemy.position = CGPoint.init(x: 0, y: 155.504 - enemy.size.height / 2)
    enemy.zRotation = CGFloat(2.4870942)
    let healthindicator = SKSpriteNode.init(color: UIColor.green, size: CGSize.init(width: 150, height: 30))
    healthindicator.name = "healthdisplay"
    healthindicator.zPosition = 3
    healthindicator.zRotation = -1 * CGFloat(2.4870942)
    enemy.addChild(healthindicator)
    addChild(enemy)
}

func addShip() {
    ship = SKSpriteNode(imageNamed: "Spaceship")
    ship.setScale(0.2)
    ship.zRotation = CGFloat(0)
    ship.physicsBody = SKPhysicsBody(rectangleOf: ship.size)
    ship.physicsBody?.isDynamic = true
    ship.name = "ship"
    ship.position = CGPoint.init(x: 0, y: (-(self.frame.size.height/2)) + ship.size.height/2)
    ship.zPosition = 2
    ship.physicsBody?.mass = CGFloat.init(10)
    ship.physicsBody?.friction = 0
    ship.physicsBody?.categoryBitMask = shipCategory
    ship.physicsBody?.collisionBitMask = wallCategory
    ship.physicsBody?.contactTestBitMask = redBulletCategory | enemyShipCategory
    self.addChild(ship)
    if motionManager.isAccelerometerAvailable == true {
        motionManager.startAccelerometerUpdates(to: OperationQueue.current!, withHandler:{
            data, error in
            if (data!.acceleration.y) < -0.05 {
                self.velocity = -500
            }

            else if data!.acceleration.y > 0.05 {
                self.velocity = 500
         }
            else{
                self.velocity = 0
            }

        })

    }
}
let shipCategory:UInt32=1
让墙类别:UInt32=2
让绿色公告类别:UInt32=3
让敌人分类:UInt32=4
let redBullet类别:UInt32=5
self.anchorPoint=CGPoint.init(x:0.5,y:0.5)
()
self.physicsWorld.gravity=CGVector.zero
self.physicsWorld.contactDelegate=self
createBG()
addShip()
self.physicsBody=SKPhysicsBody.init(edgeLoopFrom:self.frame)
self.physicsBody?.collisionBitMask=发货类别|敌人发货类别
self.physicsBody?.categoryBitMask=墙类别
自身物理体?摩擦力=0
func enemyShoot(节点:SKSpriteNode){
Bullet=SKSpriteNode.init(ImageName:“red.svg.hi”)
Bullet.zPosition=1
项目符号。设置刻度(0.2)
Bullet.position=节点.position
Bullet.physicsBody=SKPhysicsBody.init(矩形:Bullet.size)
Bullet.physicsBody?.isDynamic=真
Bullet.physicsBody?.allowsRotation=true
Bullet.physicsBody?.linearDamping=0
Bullet.physicsBody?摩擦力=0
Bullet.physicsBody?.categoryBitMask=redBulletCategory
Bullet.physicsBody?.contactTestBitMask=shipCategory
Bullet.physicsBody?.velocity=CGVector.init(dx:((node.physicsBody?.velocity.dx)!/100),dy:CGFloat.init(-750))
Bullet.name=“Bullet”
self.addChild(项目符号)
}
func Playershot(){
更改电源(更改:10)
如果(功率>99){
conpowertimer.invalidate()
更改电源(更改:100-电源)
canFire=false
powerTimer=Timer.scheduledTimer(时间间隔:1,目标:self,选择器:#选择器(self.powerCooldown),userInfo:nil,repeats:true)
}
否则{
Bullet=SKSpriteNode.init(ImageName:“green.svg.hi”)
Bullet.zPosition=1
Bullet.zRotation=CGFloat.init(3*Double.pi/2)
项目符号。设置刻度(0.2)
Bullet.position=ship.position
Bullet.physicsBody=SKPhysicsBody.init(矩形:Bullet.size)
Bullet.physicsBody?.isDynamic=真
Bullet.physicsBody?.allowsRotation=true
Bullet.physicsBody?.linearDamping=0
Bullet.physicsBody?摩擦力=0
Bullet.physicsBody?.categoryBitMask=绿色Bullet类别
Bullet.physicsBody?.contactTestBitMask=enemyShipCategory
打印(ship.physicsBody?.velocity.dx)
Bullet.physicsBody?.velocity=CGVector.init(dx:(ship.physicsBody?.velocity.dx)!,dy:CGFloat.init(750))
Bullet.name=“Bullet”
self.addChild(项目符号)
}
func addAttackShip(){
//30,40,40
让敌人=攻击飞船。init()
敌方设定标度(0.08)
敌方.zRotation=CGFloat(0)
敌方.physicsBody=SKPhysicsBody.init(矩形:敌方.size)
敌人.physicsBody?.isDynamic=真
敌军名称=“敌军”
敌方位置=2
敌方.physicsBody?.mass=CGFloat.init(10)
敌人。物理体?摩擦力=0
敌人.physicsBody?.categoryBitMask=敌人类别
敌人.physicsBody?.collisionBitMask=敌人类别|墙类别
敌方.physicsBody?.contactTestBitMask=GreenbertCategory | shipCategory
敌方.position=CGPoint.init(x:0,y:155.504-敌方.size.height/2)
敌方.zRotation=CGFloat(2.4870942)
让healthindicator=SKSpriteNode.init(颜色:UIColor.green,大小:CGSize.init(宽度:150,高度:30))
healthindicator.name=“healthdisplay”
healthindicator.zPosition=3
healthindicator.zRotation=-1*CGFloat(2.4870942)
敌方.addChild(healthindicator)
addChild(敌人)
}
func addShip(){
ship=SKSpriteNode(图像名为“宇宙飞船”)
船舶设置刻度(0.2)
ship.zRotation=CGFloat(0)
ship.physicsBody=SKPhysicsBody(矩形:ship.size)
ship.physicsBody?.isDynamic=true
ship.name=“ship”
ship.position=CGPoint.init(x:0,y:((self.frame.size.height/2))+ship.size.height/2)
ship.zPosition=2
ship.physicsBody?质量=CGFloat.init(10)
船舶物理体?摩擦力=0
ship.physicsBody?.categoryBitMask=shipCategory
ship.physicsBody?.collisionBitMask=墙类别
ship.physicsBody?.contactTestBitMask=redBulletCategory | EneyshipCategory
self.addChild(船)
如果motionManager.isAccelerometerAvailable==true{
motionManager.startAccelerometerUpdates(到:OperationQueue.current!,withHandler:{
数据错误
如果(数据!.acceleration.y)<-0.05{
自速度=-500
}
否则,如果数据!.加速度.y>0.05{
自振速度=500
}
否则{
自速度=0
}
})
}
}

您的项目符号的物理体不是冲突位掩码。因此,它将假定默认掩码为
0xFFFFFFFF
,并与所有内容冲突。如果您不需要它与任何内容冲突,请将其指定为冲突掩码0。

您尝试过将冲突位掩码设置为0吗?嘿,这里只是一个小提示,位图和位掩码是两件不同的事情:)你的类别是错误的-它们应该是2的幂,即1,2,4,8,16,32,64等。是的,你确实需要更改你的类别,否则你会得到不正确的结果。2,4,8等。整个要点是将它们加在一起以获得唯一的接触。你不能用1-5次来做这些。你需要正确设置碰撞遮罩,是吗?