Ios 使用SkPhysicsBody接触
下面是我的代码,这是一个游戏的一部分,现在有一些事情是错误的,当游戏进行。首先,子弹从英雄物理形状的底部射出,而不是从形状的中心射出。另一个原因是英雄和敌人之间的碰撞检测并不总是有效的,它会让英雄飞船做一些随机的事情。类别位掩码和接触位的哪一部分我有错Ios 使用SkPhysicsBody接触,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,下面是我的代码,这是一个游戏的一部分,现在有一些事情是错误的,当游戏进行。首先,子弹从英雄物理形状的底部射出,而不是从形状的中心射出。另一个原因是英雄和敌人之间的碰撞检测并不总是有效的,它会让英雄飞船做一些随机的事情。类别位掩码和接触位的哪一部分我有错 import UIKit import SpriteKit import CoreMotion class hero: SKSpriteNode { var width: CGFloat = 0.0 var height: CG
import UIKit
import SpriteKit
import CoreMotion
class hero: SKSpriteNode {
var width: CGFloat = 0.0
var height: CGFloat = 0.0
func createShip() {
self.anchorPoint = CGPointMake(1.0, 0.5)
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)
self.zPosition = 1.0
self.physicsBody?.mass = 0.02
self.physicsBody?.dynamic = true
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = ObjectCategory.collisionHeroCategory.rawValue
self.physicsBody?.contactTestBitMask = ObjectCategory.sceneCategory.rawValue | ObjectCategory.collisionEnemyCategory.rawValue
self.physicsBody?.collisionBitMask = ObjectCategory.sceneCategory.rawValue | ObjectCategory.collisionEnemyCategory.rawValue
self.position = CGPointMake(width, height)
}
}
class enemy:SKSpriteNode {
func createEnemyShip(heroShipSize:CGSize,viewFrame:CGRect) -> SKSpriteNode{
let enemyShip = SKSpriteNode(imageNamed: "enemyShip")
enemyShip.position = CGPointMake(viewFrame.maxX + enemyShip.size.height, CGFloat(arc4random_uniform(UInt32(viewFrame.maxY) - UInt32(enemyShip.size.width))))
enemyShip.name = "enemyShip"
enemyShip.zPosition = 1.0
enemyShip.anchorPoint = CGPointMake(0.5, 0.5)
enemyShip.physicsBody = SKPhysicsBody(rectangleOfSize: heroShipSize)
enemyShip.physicsBody?.mass = 5
enemyShip.physicsBody?.dynamic = true
enemyShip.physicsBody?.affectedByGravity = false
enemyShip.physicsBody?.categoryBitMask = ObjectCategory.collisionEnemyCategory.rawValue
enemyShip.physicsBody?.contactTestBitMask = ObjectCategory.collisionBulletCategory.rawValue | ObjectCategory.collisionHeroCategory.rawValue
enemyShip.physicsBody?.collisionBitMask = ObjectCategory.collisionBulletCategory.rawValue | ObjectCategory.collisionHeroCategory.rawValue
return enemyShip
}
}
class bullet:SKSpriteNode{
func createBullet(heroShipPosition:CGPoint) -> SKSpriteNode{
let bullet = SKSpriteNode(imageNamed: "bullet")
bullet.position = CGPointMake(heroShipPosition.x, heroShipPosition.y)
bullet.zPosition = 1.0
// Add physics body for collision detection
bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.frame.size)
bullet.physicsBody?.dynamic = true
bullet.physicsBody?.affectedByGravity = false
bullet.physicsBody?.categoryBitMask = ObjectCategory.collisionBulletCategory.rawValue
bullet.physicsBody?.contactTestBitMask = ObjectCategory.collisionEnemyCategory.rawValue
bullet.physicsBody?.collisionBitMask = ObjectCategory.collisionEnemyCategory.rawValue
return bullet
}
}
enum ObjectCategory:UInt32{
case collisionBulletCategory = 0
case collisionHeroCategory = 1
case sceneCategory = 2
case collisionEnemyCategory = 3
}
下面是我的场景中的联系人功能
func didBeginContact(contact: SKPhysicsContact) {
if contact.bodyA.categoryBitMask == ObjectCategory.collisionBulletCategory.rawValue && contact.bodyB.categoryBitMask == ObjectCategory.collisionEnemyCategory.rawValue{
score++
}
if contact.bodyB.categoryBitMask == ObjectCategory.collisionEnemyCategory.rawValue && contact.bodyA.categoryBitMask == ObjectCategory.collisionHeroCategory.rawValue{
endGame()
}
}
如果你在另一篇帖子上读过我的回答,我已经回答了你关于物理体接触的问题。它是从物理体的底部射出子弹,然后从我船的中心射出,我希望他们射出倾斜的物体。你的子弹是从你的锚点射出的,这是你的建议吗?当我回答你的其他问题时,你删除了这篇文章,所以我不得不评论这个老问题。这是一个重复的评论来回答一些问题:你的其他问题是bodyA永远不能保证是bullet,所以你需要考虑bodyA是bullet和bodyB是bullet的两种情况,你的类别必须是2的幂,这些是位掩码标志,所以3实际上意味着sceneCategory和CollisionHero,因为在二进制中,3是0011(因此有2个类别),但您需要将其二进制设置为0100,以给它一个唯一的类别。这在枚举上吗?