2016-09-04 68 views
0

我目前正在嘗試數字化我發明的桌面遊戲(回購:https://github.com/zutn/King_of_the_Hill)。爲了使它工作,我需要檢查這個board瓷磚(弧)之一是否已被點擊。到目前爲止,我還沒有能夠放棄用於繪製的pygame.arc函數。如果我使用點擊位置的x,y位置,我無法找到出路來確定要比較的圓弧的確切輪廓。我想過使用顏色檢查,但這隻會告訴我是否有任何瓷磚被點擊過。那麼有沒有一種方便的方法來測試pygame中是否點擊過弧線,還是必須使用精靈或者完全不同的東西?此外,在後面的步驟中,將包括位於瓷磚上的單位。這會使角度計算結果下面的解決方案變得更加困難。檢測pygame中是否點擊了弧線

+0

如果是這樣的話:將中心點作爲原點在2維座標系中。計算鼠標點擊和原點之間的角度,以確定點擊了哪一組瓷磚。然後計算鼠標點擊和原點之間的距離,以確定點擊了哪個磁貼。 –

+0

這可能會起作用。非常感謝。我會嘗試一下並報告。其他想法仍然歡迎。 –

+0

對不起,我忘了補充說,瓷磚上也會有單位,這樣做是不可能的(至少就像我想象的那樣) –

回答

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

這正是我所期待的。非常感謝。 –