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

时间:2013-06-20 23:08:51

标签: python pygame

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

2 个答案:

答案 0 :(得分: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之间进行适当的选择等等。

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

答案 1 :(得分:0)

唯一的问题是你的缩进!

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

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

should be:
        movex += x
        movey += y

它有效