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

Maniol102

我正在做一个游戏,当玩家不断移动并处于中间位置时,背景会不断移动,以使其看起来好像玩家在移动。当我按下两个箭头键时。向上和向右倾斜,但是当我放开向上箭头时,它应该继续向右移动。有时它可以工作,但是大多数情况下它只是停止运动。

我不知道该如何解决。

事件循环

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")

运动

运动在这里改变

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”等内容,因为我认为它只会通过两个ifs并在两个位置上进行编辑。但事实并非如此。

很抱歉,如果您已经找到该主题的答案,但找不到任何答案。

谢谢

懒惰

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

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()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我的循环有问题吗?

来自分类Dev

我的批处理脚本中的循环有什么问题?

来自分类Dev

在我的例子中 for() 循环有什么问题?

来自分类Dev

我在 Django 模板中嵌套的 for 循环有什么问题?

来自分类Dev

pygame事件循环麻烦

来自分类Dev

PyGame:MOUSEBUTTONDOWN事件的问题

来自分类Dev

我的全日历只列出了我有for循环的3个事件中的1个?

来自分类Dev

PyGame中字体的有趣问题

来自分类Dev

我的While循环有什么问题?

来自分类Dev

pygame时钟和事件循环

来自分类Dev

带有python asyncio的AWS Lambda。事件循环关闭问题?

来自分类Dev

我在VBA中遇到循环问题

来自分类Dev

我在VBA中遇到循环问题

来自分类Dev

我无法正确跟踪PyGame中的KEYDOWN事件

来自分类Dev

我的Ruby中的“墙上的啤酒瓶”循环有什么问题

来自分类Dev

我的代码中与while循环和数组有关的问题

来自分类Dev

我的Ruby中的“墙上的啤酒瓶”循环有什么问题

来自分类Dev

在pygame中我有一个问题:+ =不支持的操作数类型:'int'和'list'

来自分类Dev

R中的循环语句有问题

来自分类Dev

pygame跳跃系统出现问题。请告诉我我的代码有什么问题

来自分类Dev

在wxPython应用程序中实现我自己的事件循环

来自分类Dev

我的“ for循环”问题-Java

来自分类Dev

Pygame的:如何编写事件循环多态

来自分类Dev

无法使此功能正常工作,我认为循环是有问题的

来自分类Dev

我的while循环有问题,不太清楚为什么

来自分类Dev

Codewars Javascript问题-我的代码带有双重for循环超时

来自分类Dev

我的Jade for循环代码有什么问题?

来自分类Dev

我的JavaScript for-in循环有什么问题

来自分类Dev

我有关于 ruby 循环睡眠的问题

Related 相关文章

热门标签

归档