我正在尝试在 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
而不是它们自己的函数中。
紫衣仙女
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)
# [...]
添加回答
举报
0/150
提交
取消