这节是让snake相应键盘并且能移动。
(1)首先给每一个方向指定一个移动的标记,并且给头部图片加上一个旋转角度。(snake.py)
class Snake():
"""
class of a snake:
snake_head: use to local a snake
"""
def __init__(self, ai_settings, screen):
self.ai_settings = ai_settings
self.screen = screen
# ......
# set snake direction up:0, right:90 down:180 left: 270
self.direction = self.ai_settings.direction
# moving flag
self.moving_right = False
self.moving_left = False
self.moving_up = False
self.moving_down = False
(2)响应键盘事件,根据键盘输入改变移动标记和改变蛇头部图片的角度。(game_functions.py)
pygame图片旋转角度是逆时针计算,这里根据图片把向上定为0度。还有就是蛇不能朝着反方向转向,只能向左或右转90°。
def check_events(ai_settings, screen, snake):
for event in pygame.event.get():
if(event.type == pygame.QUIT):
pygame.quit()
sys.exit()
elif(event.type == pygame.KEYDOWN):
check_keydown_events(event, snake)
def check_keydown_events(event, snake):
if(event.key == pygame.K_RIGHT and snake.moving_left != True):
snake.moving_right = True
snake.moving_up = False
snake.moving_down = False
snake.direction = 270
elif(event.key == pygame.K_LEFT and snake.moving_right != True):
snake.moving_left = True
snake.moving_up = False
snake.moving_down = False
snake.direction = 90
elif(event.key == pygame.K_UP and snake.moving_down != True):
snake.moving_up = True
snake.moving_left = False
snake.moving_right = False
snake.direction = 0
elif(event.key == pygame.K_DOWN and snake.moving_up != True):
snake.moving_down = True
snake.moving_left = False
snake.moving_right = False
snake.direction = 180
(3)处理当蛇的移动机蛇走出边界的情况(snake.py)。
当蛇出了一侧边界,我们就让它在对侧边界相应的位置再次出现。蛇一次的移动距离固定为组成蛇图片每个正方形的边长,蛇的速度 = 步长 * 频率。
蛇的移动方式,是让蛇的头部作出移动,然后蛇身体的每一个方形图片移动到它们前一个图形的位置上。
class snake():
# ......
def update(self):
screen_rect = self.screen.get_rect()
time_passed = self.clock.tick(self.ai_settings.snake_speed_factor)
# move snake
if(self.moving_right):
if(self.head_rect.right < screen_rect.right):
self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
self.head_rect.centerx += self.ai_settings.step
else:
self.head_rect.right = 0
elif(self.moving_left):
if(self.head_rect.left > 0):
self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
self.head_rect.centerx -= self.ai_settings.step
else:
self.head_rect.left = screen_rect.right
elif(self.moving_up):
if(self.head_rect.top > 0):
self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
self.head_rect.centery -= self.ai_settings.step
else:
self.head_rect.top = screen_rect.bottom
elif(self.moving_down):
if(self.head_rect.bottom < screen_rect.bottom):
self.snake_body = [(self.head_rect.x, self.head_rect.y)] + self.snake_body[:-1]
self.head_rect.centery += self.ai_settings.step
else:
self.head_rect.bottom = 0