gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:36:31 27 4
gpt4 key购买 nike

我的 while 循环仅在光标在屏幕内移动时保持 Sprite 的移动。我试过重新组织一些 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 上.

您不安排自己的任何事件。

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


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


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

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 之间适本地选择,等等。

但在大多数情况下,我会选择带有计时器的事件驱动版本,而不是固定帧率版本,尤其是当您已经开始使用时。

关于python - 角色只在鼠标在屏幕上移动时保持移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17225326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com