Pygame 循环检查速度很少

我正在尝试在 pygame (python 3) 中重新创建蛇,我想做的是每一帧,通过检查按键来检查蛇的速度,但它很少意识到我正在按下一个键,我做错了什么/我应该怎么做(代码在下面),我不明白为什么这不起作用,因为其他所有东西都可以立即运行,例如 clear 函数,甚至 handle() 做的事情非常相似,所以它使得我不知道为什么它不起作用


import pygame

from pygame.locals import *

import math

import random


pygame.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 False


def 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, 0

def update_pos(x, y, xV, yV):

    x += xV

    y += yV

    return x, y


aX, aY = make_apple()

x, y = 256, 256

length = 1

eaten = False


while 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


茅侃侃
浏览 69回答 2
2回答

暮色呼如

您的问题是,当您调用 时pygame.event.get(),该函数不仅获取事件,而且还将它们从队列中删除。这意味着每帧调用它两次(就像您在set_vel和中所做的那样handle)会产生奇怪的结果。当我写 pygame 时,我for event in pygame.event.get()的while True.&nbsp;尝试这样做并将退出处理和速度变化移动到循环中True而不是它们自己的函数中。

紫衣仙女

正如另一个答案中提到的,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)    # [...] 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python