2016-11-18 4 views
0

ボールと障害物の2つの画像があります。ボールが障害物に当たったら、ゲームオーバーです。CGRectIntersectsRectを呼び出すとフレームを小さくするには

しかし、私の障害物とボールは長方形の形をしていないので、互いに衝突する前にゲームオーバーのように見えます。私は彼らのフレームが実際にお互いに当たることを理解しています。しかし、ゲームでは、私のボールと障害物が交差するように見える前にゲームオーバー機能が呼び出されます。

私は2つの画像がゲームオーバー機能が呼び出される前に互いに遭遇したように見えるという結果を得ることができるように助けてくれることを願っています。

if CGRectIntersectsRect(ball.frame, obstacle.frame) { 
    gameOver() 
} 
+1

あなたはそれを小さくするRECTをはめ込むことができます。 https://developer.apple.com/reference/coregraphics/1454218-cgrectinset –

+0

これは意味がありますが、動作させることはできません。たぶん私はそれを間違って実装している?私のif文の前に、私は新しいrectを宣言します: CGRectInset(obstacle.frame、2000、2000)。 @JoshHomannはこれが間違っていますか? – Frederic

+0

その通りですが、2000,2000は非常に大きくて非常に恣意的です。例えば円を含む矩形を使用する代わりにボールを使用する場合、円で囲まれるのに十分小さい矩形を使用します。シンプルなトリグは、高さと幅がsqrt(2)/ 2または外側の矩形(sin(45)* radius * 2)の0.707倍になるように指示するので、collisionFrame = CGRectInset(ball.frame、(1-0.707)* ball .frame.size.width、(1-0.707)* ball.frame.size.height) –

答えて

0
extension CGPoint { 
    func distance(to p: CGPoint) -> CGFloat { 
     return sqrt((p.x - self.x) * (p.x - self.x) + (p.y - self.y) * (p.y - self.y)) 
    } 
} 



extension UIView { 

    func collided(with otherView: UIView) -> Bool { 
     let myRadius = bounds.width/2 
     let hisRadius = otherView.bounds.width/2 

     return self.center.distance(to: otherView.center) <= myRadius + hisRadius 
    } 
} 

今ではあまりにもうまく読み:

if ball.collided(with: obstacle) { 
    gameOver() 
} 
関連する問題