2016-03-06 108 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