0

我有一个通过 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(这是块的宽度和高度)。我如何确定点击了哪个精灵?例如,如果我点击了一个“草”块,该块的坐标是绘制到屏幕上的,我该如何删除它?

实体 = 包含所有实体的列表

有没有办法从实体列表中调用它?它让我通过列表调用 Rect 感到困惑,所以这就是我被卡住的原因:S。

4

2 回答 2

2

您要做的称为“命中检测”或“命中测试”。对于您的代码,它将需要遍历实体列表并检查鼠标单击的 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) 
于 2013-07-16T15:47:45.973 回答
2

您可以使用rect.collidepoint来确定鼠标光标是否在矩形内。

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

如果您希望使用这种方法,请重新考虑您的舍入算法。mouse_x当其中一个或四舍五入到最接近的 32时,这将不起作用mouse_y。例如,假设一个图块的矩形为(0,0,32,32),并且用户在 (20,20) 处单击。mouse_x并且mouse_y将四舍五入到 (32,32),就目前collidepoint而言,它不在 rect(0,0,32,32) 内。

如果你只四舍五入那么collidepoint就可以了。在前面的示例中,(20,20) 将向下舍入为 (0,0),它位于 rect(0,0,32,32) 内部。

您也可以根本不进行任何舍入。

于 2013-07-16T15:44:01.160 回答