我现在有3种碰撞类型。 “头”,“身体”和“食物”。
头部与食物相撞。 “Head”和“Body”是SKNode和“SnakeBodyUnit”类的实例。但是,“头部”在尝试与“身体”物体碰撞时不会发射。同样,“Head”与“Food”SKSpriteNode相撞。 “食物”课程是独立的。
以下是2个班级: SnakeBodyUnit:
类SnakeBodyUnit:SKNode {
var bodyDir: Direction?
var id = -1
var partX = -1
var partY = -1
var bodyT = -1
var unitHolder: SKSpriteNode?
init(size: CGSize, gap: CGFloat, bodyType: Int) {
super.init()
bodyT = bodyType
let xPos = (size.width - (size.width * gap)) / 2
let yPos = (size.height - (size.height * gap)) / 2
let reducedSize = size.width*gap
unitHolder = SKSpriteNode()
unitHolder!.position = CGPoint(x:xPos, y:yPos);
unitHolder!.size = CGSize(width: (size.width * gap), height: (size.height * gap))
if (bodyT == 0) {
//head
unitHolder!.color = UIColor(
red: 184/255,
green: 252/255,
blue: 101/255,
alpha: 1.0)
self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(reducedSize/2, reducedSize/2), center: CGPointMake(reducedSize/2, reducedSize/2))
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = ColliderType.Head
self.physicsBody?.dynamic = false
self.physicsBody?.contactTestBitMask = ColliderType.Food | ColliderType.Body
} else if (bodyT == 1) {
//body part
unitHolder!.color = UIColor(
red: 52/255,
green: 229/255,
blue: 253/255,
alpha: 1.0)
self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(reducedSize/2, reducedSize/2), center: CGPointMake(reducedSize/2, reducedSize/2))
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = ColliderType.Body
self.physicsBody?.dynamic = false
} else if (bodyT == 2) {
//static corner
unitHolder!.color = UIColor(
red: 52/255,
green: 229/255,
blue: 0/255,
alpha: 1.0)
}
unitHolder!.anchorPoint = CGPoint(x: 0, y: 0)
self.addChild(unitHolder!)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init coder not implemented")
}
}
以下是碰撞工作正常的食品类:
class Food:SKSpriteNode {
func createFood(bodyamount: CGFloat, gap: CGFloat) {
self.size = CGSizeMake(bodyamount * gap, bodyamount * gap)
self.color = UIColor(
red: 184/255,
green: 252/255,
blue: 101/255,
alpha: 1.0)
let reducedSize = bodyamount * gap
self.position = CGPoint(x: bodyamount, y: reducedSize/2)
self.zRotation = 45.0 * CGFloat(M_PI) / 180
self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size, center: CGPointMake(reducedSize/2, reducedSize/2))
self.physicsBody?.affectedByGravity = false
self.physicsBody?.categoryBitMask = ColliderType.Food
self.anchorPoint = CGPoint(x: 0, y: 0)
}
} //这些是在一个名为ColliderType
的结构中static let Head: UInt32 = 0
static let Food: UInt32 = 0b1
static let Body: UInt32 = 0b10
答案 0 :(得分:0)
您必须告知每个节点与其碰撞的其他节点。因此,您必须告诉磁头它碰撞的节点(正如您已经做过的那样):
self.physicsBody?.contactTestBitMask = ColliderType.Food | ColliderType.Body
但您还必须在正文中添加一条相似的行(更新所选的Collider
):
self.physicsBody?.contactTestBitMask = ColliderType.Food | ColliderType.Head
和食物:
self.physicsBody?.contactTestBitMask = ColliderType.Head | ColliderType.Body
这可以解决您的问题。
答案 1 :(得分:0)
答案是在body中将dynamic设置为true,并将collisionBitMask设置为0.这是解决它的body类的设置:
<connectionStrings>
<add name="xls" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\srv***\l***\9*****\9***\****M.xls;Extended Properties=Excel 8.0"/>
</connectionStrings>