我正在使用 pygame 构建一个简单的游戏,并具有以下主循环,其中mouse()
是捕获和处理鼠标事件和keyboard()
键盘事件的函数:
def mainLoop():
pygame.event.pump()
keyboard(pygame.key.get_pressed())
events = pygame.event.get()
mouse(events)
for event in events:
if event.type == pygame.QUIT:
pygame.quit()
return False
return True
当玩家点击瓷砖时,我会调用以下函数mouse()
:
def objReach(obj, pos):
try:
path = obj.reach(pos, move=False) # A* (path-finding algorithm)
for step in path:
sleep(1.0/obj.speed)
objMove(obj, step)
except Exception as e:
sendMsg(str(e))
问题是,当对象走在路径上时(当for
循环运行时)鼠标事件不会被捕获,所以如果玩家在中间点击另一个图块,什么也不会发生。我希望玩家能够改变路径。
我尝试mainLoop
在for
循环内使用,但它只是部分有效 - 它只捕获MOUSEBUTTONUP
事件,而不是 UP 和 DOWN 事件,这是确定玩家是否只是单击或拖放所必需的。这是mouse()
要澄清的功能:
def mouse(events):
global clickPos
global releasePos
for event in events:
if event.type == MOUSEBUTTONDOWN:
clickPos = getPos(pygame.mouse.get_pos())
# getPos() transforms screen coordinates in game coordinates
elif event.type == MOUSEBUTTONUP:
releasePos = getPos(pygame.mouse.get_pos())
if event.button == MAIN_BUTTON:
# Simple click
if clickPos == releasePos:
if player.privilege > 1:
objMove(player, getPos(pygame.mouse.get_pos()))
else:
objReach(player, getPos(pygame.mouse.get_pos()))
# Drag and drop
else:
obj = player.place.matrix[clickPos[0]][clickPos[1]][-1]
objThrow(obj, clickPos, releasePos)
elif event.button == SECONDARY_BUTTON:
pass # TODO: ...
我不熟悉多线程,我认为它不应该与 pygame 一起使用,但这是我唯一能想到的。有任何想法吗?