我目前正在嘗試數字化我發明的桌面遊戲(回購:https://github.com/zutn/King_of_the_Hill)。爲了使它工作,我需要檢查這個board瓷磚(弧)之一是否已被點擊。到目前爲止,我還沒有能夠放棄用於繪製的pygame.arc函數。如果我使用點擊位置的x,y位置,我無法找到出路來確定要比較的圓弧的確切輪廓。我想過使用顏色檢查,但這隻會告訴我是否有任何瓷磚被點擊過。那麼有沒有一種方便的方法來測試pygame中是否點擊過弧線,還是必須使用精靈或者完全不同的東西?此外,在後面的步驟中,將包括位於瓷磚上的單位。這會使角度計算結果下面的解決方案變得更加困難。檢測pygame中是否點擊了弧線
0
A
回答
1
這是一個簡單的弧類,它將檢測弧中是否包含點,但它只能用於圓弧。
import pygame
from pygame.locals import *
import sys
from math import atan2, pi
class CircularArc:
def __init__(self, color, center, radius, start_angle, stop_angle, width=1):
self.color = color
self.x = center[0] # center x position
self.y = center[1] # center y position
self.rect = [self.x - radius, self.y - radius, radius*2, radius*2]
self.radius = radius
self.start_angle = start_angle
self.stop_angle = stop_angle
self.width = width
def draw(self, canvas):
pygame.draw.arc(canvas, self.color, self.rect, self.start_angle, self.stop_angle, self.width)
def contains(self, x, y):
dx = x - self.x # x distance
dy = y - self.y # y distance
greater_than_outside_radius = dx*dx + dy*dy >= self.radius*self.radius
less_than_inside_radius = dx*dx + dy*dy <= (self.radius- self.width)*(self.radius- self.width)
# Quickly check if the distance is within the right range
if greater_than_outside_radius or less_than_inside_radius:
return False
rads = atan2(-dy, dx) # Grab the angle
# convert the angle to match up with pygame format. Negative angles don't work with pygame.draw.arc
if rads < 0:
rads = 2 * pi + rads
# Check if the angle is within the arc start and stop angles
return self.start_angle <= rads <= self.stop_angle
下面是該類的一些示例用法。使用它需要一箇中心點和半徑,而不是用於創建弧的矩形。
pygame.init()
black = (0, 0, 0)
width = 800
height = 800
screen = pygame.display.set_mode((width, height))
distance = 100
tile_num = 4
ring_width = 20
arc = CircularArc((255, 255, 255), [width/2, height/2], 100, tile_num*(2*pi/7), (tile_num*(2*pi/7))+2*pi/7, int(ring_width*0.5))
while True:
fill_color = black
for event in pygame.event.get():
# quit if the quit button was pressed
if event.type == pygame.QUIT:
pygame.quit(); sys.exit()
x, y = pygame.mouse.get_pos()
# Change color when the mouse touches
if arc.contains(x, y):
fill_color = (200, 0, 0)
screen.fill(fill_color)
arc.draw(screen)
# screen.blit(debug, (0, 0))
pygame.display.update()
+0
這正是我所期待的。非常感謝。 –
相關問題
- 1. 檢測弧內點擊
- 2. 檢測點擊形狀pygame
- 3. 如何檢測pygame中的精靈是否被點擊
- 4. 繪製自定義弧視圖並檢測每條弧線的用戶點擊
- 5. 檢測Android WebView中是否點擊了特定的按鈕
- 6. 如何檢測用戶是否在pygame中雙擊?
- 7. 檢查我是否點擊了datagridview行
- 8. pygame的點擊是
- 9. 如何檢測用戶是否點擊了「返回」按鈕
- 10. 如何檢測'Enter'是否觸發了點擊事件?
- 11. VB.net - 檢測是否有人點擊「f5」
- 12. Pygame - 如何檢查我的矩形是否已被點擊?
- 13. 圓弧和線段碰撞檢測
- 14. jquery檢測用戶是否點擊了輸入 - 如果沒有做點什麼
- 15. 檢測所選元素是否是右鍵點擊的錨點
- 16. 檢測是否從另一個類中點擊了一個按鈕
- 17. 檢測點擊了什麼鏈接
- 18. 檢測點擊了哪個CCSprite
- 19. 檢查是否點擊+ Jquery
- 20. as3檢查是否已經點擊了數組中的項目
- 21. 如何檢查pygame中的鼠標點擊是否在圓圈內?
- 22. vim中的行號/符號點擊是否可檢測?
- 23. 檢測div是否具有某個添加了點擊的類(不刷新)
- 24. 檢測是否點擊了裏面的反應成分或不打字稿
- 25. 檢測用戶是否點擊了「返回」按鈕 - 手機瀏覽器
- 26. 檢測點是否在SVG路徑中
- 27. UITextField點擊檢測
- 28. 檢測點擊卡
- 29. JavaScript - 檢測單擊事件是否觸發了DOMNodeInserted事件
- 30. pygame中的碰撞檢測
如果是這樣的話:將中心點作爲原點在2維座標系中。計算鼠標點擊和原點之間的角度,以確定點擊了哪一組瓷磚。然後計算鼠標點擊和原點之間的距離,以確定點擊了哪個磁貼。 –
這可能會起作用。非常感謝。我會嘗試一下並報告。其他想法仍然歡迎。 –
對不起,我忘了補充說,瓷磚上也會有單位,這樣做是不可能的(至少就像我想象的那樣) –