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