示例:
此墙预设在负载
var preWall = SKSpriteNode(texture: preWallTexture, size: CGSize(width: width, height: height))
preWall.position = CGPoint(x: x, y: y)
preWall.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRect(x: x, y: y, width: width, height: height))
preWall.physicsBody?.affectedByGravity = false
preWall.physicsBody?.dynamic = false
preWall.physicsBody?.categoryBitMask = BLOCK
preWall.name = "preWall"
self.addChild(preWall)
这些" sand"用户触摸生成器(屏幕上的红色块)后创建粒子,
var img = "BlockRed.png"
let sand = SKSpriteNode (imageNamed: img)
var randLoc = arc4random_uniform(26)
sand.position = CGPointMake(location.x - CGFloat(10) + CGFloat(randLoc), location.y)
sand.name = "redSand"
sand.zPosition = 0
self.addChild(sand)
//gravity
sand.physicsBody?.affectedByGravity = true
//contact
sand.physicsBody!.categoryBitMask = PARTICLE
sand.physicsBody?.collisionBitMask = BLOCK | PARTICLE
sand.physicsBody?.contactTestBitMask = BLOCK | PARTICLE
sand.physicsBody = SKPhysicsBody(circleOfRadius: sand.frame.width - 3)
但是,当它们接触时,颗粒就会从墙壁上掉下来。为什么会发生这种情况,我该如何解决?
注意:
// Constants
let NOTHING: UInt32 = 0x1 << 0
let PARTICLE: UInt32 = 0x1 << 1
let BLOCK: UInt32 = 0x1 << 2
答案 0 :(得分:1)
设置physics body
后,您正在初始化沙粒的bit masks
。尝试更改线条的顺序。
sand.physicsBody = SKPhysicsBody(circleOfRadius: sand.frame.width - 3)
sand.physicsBody?.categoryBitMask = PARTICLE
sand.physicsBody?.collisionBitMask = BLOCK | PARTICLE
sand.physicsBody?.contactTestBitMask = BLOCK | PARTICLE
答案 1 :(得分:0)
预设节点的物理主体不是基于体积的主体,因此不会与沙粒碰撞。我转自:
preWall.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRect(x: x, y: y, width: width, height: height))
到
preWall.physicsBody = SKPhysicsBody(rectangleOfSize: preWall.frame.size)