我的 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()
你的循环阻塞pygame.event.get http://www.pygame.org/docs/ref/event.html#pygame.event.get.
您不安排自己的任何活动。
因此,在操作系统向您提供事件(鼠标移动、重画等)之前,您什么也不做。
而且,即使你解决了这个问题,你还是在打电话movex += x
每个事件一次。因此,当操作系统向您抛出大量事件时,您的精灵会在屏幕上疯狂地移动,但当事件来得更慢时,它会爬行。这几乎从来都不是你想要的。
解决这两个问题的一个简单方法就是安排您自己的活动。例如,与pygame.time.set_timer() http://www.pygame.org/docs/ref/time.html#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 帧移动一次。
一个现实的例子必须处理丢失的帧、队列中的事件太多、在以下情况之间进行选择:wait
and delay
适当地等等
但在大多数情况下,我会选择带有计时器的事件驱动版本,而不是固定帧速率版本,特别是如果您已经沿着这条线走下去的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)