我有一个瓷砖贴图,它通过类似于此的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。
答案 0 :(得分:2)
您可以使用rect.collidepoint
来确定鼠标光标是否在矩形内。
entities_the_mouse_is_over = [entity for entity in entities if entity.rect.collidepoint(mouse_x, mouse_y)]
如果您希望使用此方法,请重新考虑您的舍入算法。当mouse_x
或mouse_y
向上舍入到最接近的32时,这将无效。例如,假设图块的矩形为(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)内。
你也可以根本不做任何四舍五入。
答案 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)