如何解决在pygame中移动蛇
我刚刚开始学习 pygame,我正在开发一个贪吃蛇游戏。但是,我似乎无法转动蛇,也找不到问题所在。我认为问题出在蛇类内部的“move_snake”方法中,但我真的找不到问题。我通常也不熟悉 Python 和面向对象编程,所以这可能是原因。
import pygame,sys
import random
pygame.init()
clock = pygame.time.Clock()
screen_width = 600
screen_height = 600
screen = pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption("Snake Game")
bgColor = "grey12"
lightGrey = (200,200,200)
random_x = random.randint(0,screen_width - 20)
random_y = random.randint(0,screen_height - 20)
class FOOD:
def __init__(self):
self.food_x = random_x
self.food_y = random_y
self.food_width = 20
self.food_height = 20
self.food_rect = pygame.Rect(self.food_x,self.food_y,self.food_width,self.food_height)
def draw_food(self):
pygame.draw.rect(screen,lightGrey,self.food_rect)
food = FOOD()
class SNAKE(FOOD):
def __init__(self):
super().__init__()
self.snake_width = 20
self.snake_height = 20
self.snake_x = screen_width/2 - self.snake_width
self.snake_y = screen_height/2 - self.snake_height
self.snake_rect = pygame.Rect(self.snake_x,self.snake_y,self.snake_width,self.snake_height)
self.move = [0,-1]
self.snake_speed = 5
def draw_snake(self):
pygame.draw.rect(screen,self.snake_rect)
def move_snake(self):
for e in pygame.event.get():
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_UP:
self.move = [0,-1]
if e.key == pygame.K_DOWN:
self.move = [0,1]
if e.key == pygame.K_LEFT:
self.move = [-1,0]
if e.key == pygame.K_RIGHT:
self.move = [1,0]
self.snake_x += self.move[0] * self.snake_speed
self.snake_y += self.move[1] * self.snake_speed
self.snake_rect.topleft = (self.snake_x,self.snake_y)
snake = SNAKE()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
screen.fill(bgColor)
food.draw_food()
snake.draw_snake()
snake.move_snake()
pygame.display.flip()
clock.tick(60)
解决方法
问题是多次调用 pygame.event.get()
。
pygame.event.get()
获取所有消息并将它们从队列中删除:
这将获取所有消息并将它们从队列中删除。 [...]
如果在多个事件循环中调用 pygame.event.get()
,则只有一个循环接收事件,但不会所有循环都接收所有事件。因此,似乎错过了一些事件。
获取事件一次并在多个循环中使用它们或将列表或事件传递给处理它们的函数和方法:
class SNAKE(FOOD):
# [...]
def move_snake(self,event_list):
for e in event_list:
if e.type == pygame.KEYDOWN:
# [...]
while True:
event_list = pygame.event.get()
for event in event_list:
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# [...]
snake.move_snake(event_list)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。