我正在制作一个简单的游戏(使用Swift& SpriteKit),我有一个可以拖动的圆圈。但是圈子不允许通过墙壁。
我的碰撞BitMask工作得很好,但当我拖得足够快时,圆圈最终穿过墙壁。
玩家精灵的初始化就像这样:
func initPlayerSprite(){
let playerTexture = SKTexture(imageNamed: "player.png")
let originX = CGRectGetMidX(self.frame)
let originY = CGRectGetMidY(self.frame)
player = SKSpriteNode(texture: playerTexture, size: CGSize(width: 26, height: 26))
player.position = CGPoint(x: originX , y: originY)
player.physicsBody = SKPhysicsBody(circleOfRadius: playerTexture.size().height/2)
player.physicsBody!.dynamic = true
player.physicsBody?.allowsRotation = false
player.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
player.physicsBody!.contactTestBitMask = ColliderType.Floor.rawValue + ColliderType.Gap.rawValue
player.physicsBody!.collisionBitMask = ColliderType.Wall.rawValue + ColliderType.Floor.rawValue
self.addChild(player)
}
我移动Sprite的代码是这样的:
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?){
var nodeTouched = SKNode()
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
let dx = -player.position.x + location.x
let dy = -player.position.y + location.y
let movePlayer = SKAction.moveBy(CGVector(dx: dx, dy: dy), duration: 0.02)
}
}
任何想法如何确保碰撞检测即使在高速下也能正常工作?
答案 0 :(得分:2)
从你的代码很难判断。 你为什么要调用像
这样的碰撞 ColliderType.Wall.rawValue + ColliderType....
我之前没有看过这个&#34; +&#34;作为分隔符,通常使用&#34; |&#34; 分开他们。
ColliderType.Wall.rawValue | ColliderType....
根据我的理解,使用加号应该将两个值一起添加,并且不会将其视为2种碰撞类型。我可能在这里错了。
您是否也尝试使用精确碰撞检测?
...physicsBody.usesPreciseCollisionDetection = true.
Apple将此bool描述如下
默认值为NO。如果碰撞中的两个物体不执行精确的碰撞检测,并且一个物体在一个帧中完全穿过另一个物体,则不会检测到碰撞。如果在任一主体上将此属性设置为YES,则模拟会执行更精确且更昂贵的计算来检测这些冲突。在小而快速移动的物体上,此属性应设置为YES。
不确定这有帮助