为了账号安全,请及时绑定邮箱和手机立即绑定

Pygame 循环检查速度很少

Pygame 循环检查速度很少

茅侃侃 2023-04-25 15:48:03
我正在尝试在 pygame (python 3) 中重新创建蛇,我想做的是每一帧,通过检查按键来检查蛇的速度,但它很少意识到我正在按下一个键,我做错了什么/我应该怎么做(代码在下面),我不明白为什么这不起作用,因为其他所有东西都可以立即运行,例如 clear 函数,甚至 handle() 做的事情非常相似,所以它使得我不知道为什么它不起作用import pygamefrom pygame.locals import *import mathimport randompygame.init()display = pygame.display.set_mode((512, 512))pygame.display.set_caption("Snake")display.fill((255, 255, 255))def handle():    global x, y    for event in pygame.event.get():        if event.type == QUIT:            pygame.quit()def make_apple():    x, y = random.randint(0, 502), random.randint(0, 502)    pygame.draw.rect(display, (255, 0, 0), (x, y, 10, 10))    return x, y# -- COLLISION DETECTION -- #def r(fox, foy, cR, sox, soy):    dx = abs(fox - sox)    dy = abs(foy - soy)    if dx < cR and dy < cR:        return True    else:        return Falsedef clear(aX, aY):    global x, y    display.fill((255, 255, 255))    pygame.draw.rect(display, (255, 0, 0), (aX, aY, 10, 10))    draw_snake(x, y)def draw_snake(x, y):    pygame.draw.rect(display, (0, 255, 0), (x, y, 10, 10))def set_vel():    for event in pygame.event.get():        if event.type == KEYDOWN:            print("KEY")            if event.key == K_LEFT:                yVel = 0                xVel = -1            elif event.key == K_RIGHT:                yVel = 0                xVel = 1            elif event.key == K_UP:                yVel = -1                xVel = 0            elif event.key == K_DOWN:                yVel = 1                xVel = 0            return xVel, yVel    return 0, 0def update_pos(x, y, xV, yV):    x += xV    y += yV    return x, yaX, aY = make_apple()x, y = 256, 256length = 1eaten = Falsewhile True:    velX, velY = set_vel()    clear(aX, aY)    handle()    x, y = update_pos(x, y, velX, velY)    if eaten:        aX, aY = make_apple()        eaten = False    pygame.display.update()    if r(x, y, 3, aX, aY):        display.fill((255, 255, 255))        eaten = True
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

您的问题是,当您调用 时pygame.event.get(),该函数不仅获取事件,而且还将它们从队列中删除。这意味着每帧调用它两次(就像您在set_vel和中所做的那样handle)会产生奇怪的结果。

当我写 pygame 时,我for event in pygame.event.get()while True. 尝试这样做并将退出处理和速度变化移动到循环中True而不是它们自己的函数中。


查看完整回答
反对 回复 2023-04-25
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

正如另一个答案中提到的,pygame.event.get()获取所有消息并将它们从队列中删除。因此,第一个或第二个循环获取一个事件,但永远不会两个循环都获取所有事件。这导致某些事件似乎被遗漏了。

在主应用程序循环中获取一次事件列表并将列表传递给函数:

def handle(events):

    global x, y

    for event in events:

        if event.type == QUIT:

            pygame.quit()

def set_vel(events):

    for event in events:

        # [...]

while True:

    events = pygame.event.get()

  

    velX, velY = set_vel(events )

    clear(aX, aY)

    handle(events)


    # [...] 


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信