这更像是一个好奇的问题,因为我回去并设法做我想做的事。标题最初会像'检查一个有序元组是否在一个范围的元组中?'
到目前为止,我一直在使用此代码检查鼠标点击次数 -
pos = pygame.mouse.get_pos()
if pos[0] > X and pos[0] < X2 and pos[1] > Y and pos[1] < Y2:
#Do this
#Separate function with same XY's
if pos[0] > X and pos[0] < X2 and pos[1] > Y and pos[1] < Y2:
#Do something else - could be used for mouse hover rather than click.
我想知道其他人如何进行按钮检测,因为有时需要多次检查(例如,在单独的功能中)。有时候我会触发一个外部函数,布尔值或计时器,或者沿着这些行触发的东西。我在下面的例子中做到了这一点。但这也会变得混乱,我觉得必须有一个更简单的方法。
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
gp = game.pos
#Initial gbh declaration
gbh = game.button_health = range(391, 527), range(179, 253)
if gp[0] in gbh[0] and gp[1] in gbh[1]:
player.skillpoints -= 1
player.health += 10
player.healthmax += 10
#Separate func.
gp = game.pos
gbh = game.button_health
if gp[0] in gbh[0] and gp[1] in gbh[1]:
blit(font.render(str(Z), True, BLACK), (X, Y))
答案 0 :(得分:2)
如果你有重复的代码,那么你可以把它放到一个函数中并在代码所在的位置调用它。这使得以后更容易修改代码,因为您只需在一个地方更改它。测试代码也更容易。
以下是一个例子(我还添加了Google style docstring):
def collided(pos, X, X2, Y, Y2):
"""Check if a point `pos` collides with an area.
Args:
pos (tuple): The point.
X (int, float): The left coordinate of the area.
etc.
Returns:
bool: True if it collides, otherwise False.
"""
return pos[0] > X and pos[0] < X2 and pos[1] > Y and pos[1] < Y2
# Call the function and pass the needed arguments.
if collided(pg.mouse.get_pos(), X, X2, Y, Y2):
print('collision')
答案 1 :(得分:1)
由于您的问题被标记为performance
,因此最好的起点是一句名言:
&#34;我们应该忘记小的效率,大约97%的时间说:过早优化是所有邪恶的根源。然而,我们不应该把关键的3%&#34; (D. Knuth,&#34;结构化编程,转到语句&#34;,强调我的)
您确定这会对您的应用程序的全局性能产生影响吗?如果4次比较产生影响,我会非常感到惊讶。因此,我们假设它不是性能问题。
首先,请注意在Python中你可以写:
if X < pos[0] < X2 and Y < pos[1] < Y2:
....
但更重要的是:使您正在测试的内容清晰。你怎么说清楚?只需命名即可:
if pos[0] > X and pos[0] < X2 and pos[1] > Y and pos[1] < Y2:
# Do this
变为:
if area_contains(X, X2, Y, Y2, pos):
# Do this
或使用自定义类:
area = Area(X, X2, Y, Y2)
if area.contains(pos):
# Do this
为了清楚起见,即使您只有一次测试,也应该这样做。功能不仅仅是为了减少重复代码(DRY:不要重复自己),还要提高可读性。看看这个:
player.skillpoints -= 1
player.health += 10
player.healthmax += 10
为什么不:
player.increase_health()
?
不要仅仅将对象用作结构:它们为您提供了一种方便的方式来表达您正在做的事情而不会泄露实现细节。现在,您可以更改increase_health
的含义,而无需查找导致它的所有事件。