2016-03-06 56 views
2

我做一个简单的游戏(使用雨燕& SpriteKit),在那里我有就是可以被拖到了一圈。但圆圈不允许穿过墙壁。Swift Sprite碰撞。对象穿过墙壁

我的碰撞掩码完美的作品,但是当我拖动速度不够快,圆结束了穿墙。

的玩家精灵的初始化是这样的:

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) 
    } 

我对移动雪碧代码是这样的:

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) 

     } 
} 

任何想法如何确保碰撞检测工作,即使在高速度?

回答

1

从你的代码它很难判断。 为什么你叫碰撞喜欢

ColliderType.Wall.rawValue + ColliderType.... 

我没有用“+”见过这个作为分隔符,通常你使用“|” 将它们分开。

ColliderType.Wall.rawValue | ColliderType.... 

根据我的理解,使用加号应该将两个值相加,并且不会将其视为2种碰撞类型。我可能在这里错了。

而且你尝试使用像这样精确的碰撞检测?

...physicsBody.usesPreciseCollisionDetection = true. 

苹果描述如下

默认值为NO这个布尔。如果碰撞中的两个物体没有执行精确的碰撞检测,并且一个物体完全穿过另一个物体,则不会检测到碰撞。如果该属性在任一主体上设置为YES,则仿真将执行更精确且更昂贵的计算以检测这些冲突。此属性应该设置为小,快速移动的身体上。

不知道这是帮助

+0

完美的,这解决了我的问题!谢谢!至于碰撞Bitmask,我应该把它改成“|”而不是“+”。这只是一个与UInt32匹配的实验,而据我测试..它令人惊讶的工程! –

+0

不客气,快乐编码 – crashoverride777

+0

我试过这个,但它没有帮助我。所以我创造了一个不同的方式来做到这一点。点击[这里](https://stackoverflow.com/a/47575444/1259775)来查看它 – aytek