角色只在鼠标在屏幕上移动时保持移动?

2024-06-17 09:25:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我的while循环只在光标在屏幕内移动时保持精灵的移动。我试着重组一些屏幕.blits以及显示.更新()和显示.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()

Tags: keyeventif屏幕typedisplaysysscreen
2条回答

唯一的问题是你的压痕!在

底部的第五行和第六行缩进错误,需要删除它们。在

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

should be:
        movex += x
        movey += y

而且很管用

循环在^{}上阻塞。在

你不会安排任何你自己的活动。在

所以,在操作系统有事件(鼠标移动、重画等)给你之前,你什么都不做。在


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


解决这两个问题的一个简单方法就是安排自己的活动。例如,使用^{},您可以确保每隔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

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

下面是一个简单的例子:

^{pr2}$

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

一个实际的例子必须处理丢失的帧、队列中太多的事件、在wait和{}之间进行适当的选择,等等

但在大多数情况下,我会选择带有计时器的事件驱动版本,而不是固定帧速率版本,尤其是如果你已经在这条线上走下去的话。在

相关问题 更多 >