删除Pygame中的Sprite

时间:2013-07-16 15:09:53

标签: python python-2.7 pygame

我有一个瓷砖贴图,它通过类似于此的for循环运行:

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 个答案:

答案 0 :(得分: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),就collidepoint而言,它不在rect(0,0,32,32)内。

如果您只围绕向下,则collidepoint将有效。在前面的例子中,(20,20)将向下舍入到(0,0),这是在rect(0,0,32,32)内。

你也可以根本不做任何四舍五入。

答案 1 :(得分: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)