3

我的 while 循环仅在光标在屏幕内移动时保持精灵的移动。我尝试重新组织一些 screen.blits 和 display.update() 和 display.flip()。我似乎无法弄清楚为什么角色在一个像素发生变化后停止,而不是像我预期的那样继续。

    background_image = 'Terrain_Grass_First.png'
    import pygame, sys
    from pygame.locals import *
    pygame.init()
    pygame.display.set_caption('Hans')
    screen_width = 600
    screen_height = 400
    screen = pygame.display.set_mode((screen_width, screen_height),0,32)
    pygame.mouse.set_visible(False)
    sprite = pygame.image.load('Hans_front_still.png').convert_alpha()
    x,y = (0,0)
    movex, movey = (0,0)
    while True:
        for event in pygame.event.get():
                if event.type == QUIT:
                        pygame.quit()
                        sys.exit()

                if event.type == KEYDOWN:
                        if event.key == K_ESCAPE:
                                pygame.quit()
                                sys.exit()
                        if event.key == K_w:
                                y = -1

                        elif event.key == K_a:
                                x = -1

                        elif event.key == K_s:
                                y = +1

                        elif event.key == K_d:
                                x = +1

                elif event.type == KEYUP:
                        if event.key == K_w:
                                y = 0

                        elif event.key == K_a:
                                x = 0

                        elif event.key == K_s:
                                y = 0

                        elif event.key == K_d:
                                x = 0
                movex += x
                movey += y


        screen.fill((0,0,0))
        screen.blit(sprite,(movex,movey))
        pygame.display.flip()
4

2 回答 2

2

你的循环块在pygame.event.get.

您不安排自己的任何活动。

因此,在操作系统有事件(鼠标移动、重绘等)给您之前,您什么都不做。


而且,即使您解决了这个问题,您也会在movex += x每个事件中调用一次。因此,当操作系统向您抛出大量事件时,您的精灵会在屏幕上疯狂地滑动,但当事件发生得更慢时,它会爬行。这几乎不是你想要的。


解决这两个问题的一个简单方法是安排您自己的活动。例如,使用pygame.time.set_timer(),您可以确保每隔 250 毫秒获得一个事件,并且您只能在这些事件上移动精灵。例如:

timer_event = pygame.USEREVENT + 1
pygame.time.set_timer(timer_event, 250)
while True:
    for event in pygame.event.get():
        # ...
        elif event.type == timer_event:
            movex += x
            movey += y

另一种选择是使用固定帧速率设计游戏。

一个简单的示例如下所示:

FRAME_TIME = 50 # 50ms = 20fps
next_frame_time = pygame.time.get_ticks() + FRAMES
while True:
    while True:
        event = pygame.event.poll()
        if event.type == pygame.NOEVENT:
            break
        elif # ...
    pygame.display.flip()
    now = pygame.time.get_ticks()
    if now < next_frame_time:
        pygame.time.wait(next_frame_time - now)
    next_frame_time += FRAMES

现在您可以每 5 帧移动一次。

一个现实的例子必须处理丢失的帧,队列中的太多事件,选择waitdelay适当的等等。

但在大多数情况下,我会使用带有计时器的事件驱动版本,而不是固定帧速率版本,特别是如果你已经走这条线了。

于 2013-06-20T23:17:06.490 回答
1

唯一的问题是你的缩进!

倒数第五行和第六行缩进错误,需要删除。

These two lines:
            movex += x
            movey += y

should be:
        movex += x
        movey += y

它有效

于 2018-04-05T13:37:27.167 回答