2017-02-01 66 views
0

基本上我正在用pygame做遊戲,並且會有矩形在屏幕上移動。玩家1和玩家2的。如果玩家1的任何單位在玩家2單位的x距離範圍內,則射擊。如果我與中心距離很遠,那麼它會不準確,因爲這些矩形的一部分在一側會長得多,並且會在被擊中的範圍內,但中心不會。我一直在尋找,但一直沒能找到解決這個問題的辦法。Pygame;檢查兩個矩形上任意點之間的最短距離是否小於x量?

編輯:刪除圈子。我也會有圈子,但我會像長方形一樣對待它們並使用它們的正確。它們很小,2像素不準確並不重要。

+0

你是什麼意思,一些矩形會較長一側的它的中心?中心總是被定義爲兩個相對邊之間具有相等距離的點。如果你的意思是你想在玩家重疊的時候開火,那麼只需要檢查矩形相互碰撞的時間,又名['如果rect1.colliderect(rect2)'](https://www.pygame.org/docs/ref/rect。 HTML#pygame.Rect.colliderect)。或者,您可以暫時縮放([inflate](https://www.pygame.org/docs/ref/rect.html#pygame.Rect.inflate))更大的矩形x像素,然後檢查碰撞。 –

+0

我沒有考慮過它的膨脹,這似乎是可行的。我的意思是說,如果有兩個長長的瘦骨rectang rectang的長方形,它們會在彼此相距x距離之前相互碰撞,因爲距離是距離它們的中心。雖然膨脹似乎是一個很好的解決方案。 – user3529201

回答

0

這是我現在能想到的最好: 它比較矩形的角與圓的中心。如果這還不夠,你可以在矩形邊上添加中心點。

不是一個完美的解決方案,但是這取決於你正在寫的遊戲應該足夠

def isInRange(rectangle, circle): 
    return (
     (rectangle.topleft.x  - circle.centerx)**2 + (rectangle.topleft.y  - circle.centery)**2 <= (mindist + r_circle)**2 or #circle in upper left quadrant of rectangle 
     (rectangle.bottomleft.x - circle.centerx)**2 + (rectangle.bottomleft.y - circle.centery)**2 <= (mindist + r_circle)**2 or #circle in bottom left quadrant of rectangle 
     (rectangle.bottomright.x - circle.centerx)**2 + (rectangle.bottomright.y - circle.centery)**2 <= (mindist + r_circle)**2 or #circle in bottom right quadrant of rectangle 
     (rectangle.topright.x - circle.centerx)**2 + (rectangle.topright.y - circle.centery)**2 <= (mindist + r_circle)**2 #circle in top right quadrant of rectangle 
     ) 
+0

伴侶,功能將非常受歡迎! – math2001

+0

改變了,謝謝! – Hans

+0

它需要一個矩形和一個圓作爲參數,這對於檢查兩個矩形之間的距離不起作用。我應該在原帖中解釋清楚。我只是將圓形視爲矩形,然後使用它來檢查distace。圓圈足夠小以至於無所謂。 – user3529201