2013-07-16 144 views
0

我有過一個for循環中運行一個類似的瓦片地圖:刪除精靈在Pygame的

def Draw_Level(x, y, column, obsticles, entities, image_cache): 

    #Grass# 
    if column == "G": 
     g = Grass(x, y, image_cache) 
     entities.add(g) 
    #Plain Grass# 
    elif column == "P": 
     p = Plain_Grass(x,y, image_cache) 
     entities.add(p) 
    #Grass with yellow flower# 
    elif column == "F": 
     f = Grass_Flower(x,y, image_cache) 
     entities.add(f) 
    #Grass To Sand (50/50 split block) Direct# 
    elif column == "Y": 
     q = Grass_To_SandD(x,y, image_cache) 
     entities.add(q) 

#Example If a class 
class Grass(Entity): 

    def __init__(self, x, y, image_cache): 
     Entity.__init__(self) 
     self.image = functions.get_image("data/images/Grass.png", image_cache) 
     self.image.convert() 
     self.rect = Rect(x, y, 32, 32) 

說,例如,我的鼠標被點擊其中的一個,而x和y決心最接近的32(這是塊的寬度和高度)。我將如何確定點擊哪個精靈?例如,如果我點擊了「草地」塊,並將該草地塊的座標繪製到屏幕上,我該如何刪除它?

的entites =持有的所有實體

有沒有一種方法,我可以從實體列表稱它爲列表?它混淆了我通過列表調用Rect,所以這就是爲什麼我卡住了:S。

回答

2

你想要做什麼叫做「撞檢測」或「hit-testing」。在你的代碼的情況下,它需要通過實體列表並檢查鼠標點擊的x,y位置與每個佔據的矩形的範圍。

如果你使每一個類,你可以一個方法hit_test(self, x, y)添加到它們,並調用它的每一個。東西沿着這些線:

class Grass(Entity): 
    def __init__(self, x, y, image_cache): 
     Entity.__init__(self) 
     self.image = functions.get_image("data/images/Grass.png", image_cache) 
     self.image.convert() 
     self.rect = Rect(x, y, 32, 32) 
    def hit_test(self, x, y): 
     return (self.rect.x <= x < self.rect.x+self.rect.width and 
       self.rect.y <= y < self.rect.y+self.rect.height) 
+0

Thankyou,我設法得到它。另外,感謝關​​於命中測試的信息。 – ReallyGoodPie

+1

不客氣。請注意,這可以通過預先計算x和y邊界並將它們存儲在實體中來加速。同樣明智的是,如果鼠標x,y在包圍它們的(虛構)邊界框之外,則可以將相同的邏輯應用於堆疊在一起的整個組。這被稱爲「[微不足道的拒絕]」(http://www.expertsmind.com/questions/trivial-rejection-case-of-cohen-sutherland-line-clippings-30149795.aspx)「並用於行剪切。 – martineau

2

您可以使用rect.collidepoint,以確定是否將鼠標光標是一個矩形內。

entities_the_mouse_is_over = [entity for entity in entities if entity.rect.collidepoint(mouse_x, mouse_y)] 

如果您希望使用此方法,請重新考慮舍入算法。當任一或mouse_xmouse_y四捨五入到最接近的32。例如,這將不起作用,假設一個瓦片具有的(0,0,32,32)一個矩形,並且用戶點擊在(20,20)。 mouse_xmouse_y將四捨五入爲(32,32),這是不是裏面的rect(0,0,32,32)就collidepoint而言。

如果您只有下降,那麼collidepoint將工作。在前面的例子中,(20,20)將舍入到(0,0),它在rect(0,0,32,32)內。

你也可以只沒有做任何四捨五入的。