私は 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 で使用することになっているとは思いませんが、それしか考えられませんでした。何か案は?