gpt4 book ai didi

python - 我在 pygame 中的事件循环有问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:06:02 26 4
gpt4 key购买 nike

我正在制作一款游戏,当背景移动时,玩家始终处于中间,使其看起来像是玩家在移动。当我按两个箭头键时向上和向右,它是对角线移动,但是当我松开向上箭头时,它应该继续向右移动。有时它会起作用,但大多数时候它只是停止移动。

我不知道如何解决这个问题。

事件循环

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
key = pygame.key.get_pressed()

if key[K_UP]:
if key[K_RIGHT]:
bg.move("up_right")
elif key[K_LEFT]:
bg.move("up_left")
else:
bg.move("up")

elif key[K_DOWN]:
if key[K_RIGHT]:
bg.move("down_right")
elif key[K_LEFT]:
bg.move("down_left")
else:
bg.move("down")


elif key[K_RIGHT]:
if key[K_DOWN]:
bg.move("down_right")
elif key[K_UP]:
bg.move("up_right")
else:
bg.move("right")


elif key[K_LEFT]:
if key[K_DOWN]:
bg.move("down_left")
elif key[K_UP]:
bg.move("up_left")
else:
bg.move("left")

运动

Here the movement gets changed

def move(self, direction):
if direction == "up_right":
self.posY += self.speed
self.posX -= self.speed

if direction == "up_left":
self.posY += self.speed
self.posX += self.speed

if direction == "down_right":
self.posY -= self.speed
self.posX -= self.speed

if direction == "down_left":
self.posY -= self.speed
self.posX += self.speed

if direction == "up":
self.posY += self.speed+2

if direction == "down":
self.posY -= self.speed+2

if direction == "right":
self.posX -= self.speed+2

if direction == "left":
self.posX += self.speed+2

起初,我没有添加“up_left”等,因为我认为它只会遍历两个 if 并编辑两者的位置。但事实并非如此。

如果该主题已有答案,我很抱歉,但我找不到任何答案。

谢谢

最佳答案

您的主要问题是检查事件循环内按下的键:

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# only executed if there's an event returned by pygame.event.get()
# and possible executed multiple times per frame
key = pygame.key.get_pressed()

if key[K_UP]:
...

因此,执行移动的代码 (if key[K_UP]: ...) 仅当队列中当前存在事件时才会执行。

只需将此代码移到事件处理程序循环之外即可:

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# always executed every frame
key = pygame.key.get_pressed()

if key[K_UP]:
...
<小时/>

恕我直言,处理移动的更好方法是使用矢量,因为它们可以轻松确保恒定的移动速度,并且代码少得多。

这是一个简单的例子:

import pygame

def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))

clock = pygame.time.Clock()
dt = 0

movement = {
pygame.K_UP: ( 0, -1),
pygame.K_DOWN: ( 0, 1),
pygame.K_LEFT: (-1, 0),
pygame.K_RIGHT: ( 1, 0)
}

pos = pygame.Vector2((100, 100))

while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return

pressed = pygame.key.get_pressed()

# calculate the movement vector
move = pygame.Vector2()
for dir in (movement[key] for key in movement if pressed[key]):
move += dir

if move.length() > 0: move.normalize_ip()
# ensure we have a constant speed
pos += move * dt/5

screen.fill(pygame.Color('grey'))
pygame.draw.circle(screen, pygame.Color('dodgerblue'), [int(x) for x in pos], 20, 0)
pygame.display.update()
dt = clock.tick(60)

if __name__ == '__main__':
main()

关于python - 我在 pygame 中的事件循环有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55391564/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com