我正在pygame中创建一个蛇游戏。基本上,我希望我的蛇形物体一直在移动。
然而,我希望能够在按键时改变对象的移动方向。
现在,我可以移动对象,但我必须按住某个键,或者按住该键。这不是一个持续的运动。
我的目标是让蛇的物体一直朝一个方向移动,只需按下一个键就可以改变它的移动方向。这可能吗?
这是我的目标代码:
class Snake:
def __init__(self, block_size, surface, x_loc, y_loc):
self.block_size = block_size
self.surface = surface # red
self.x_loc = x_loc
self.y_loc = y_loc
def draw(self, window):
window.blit(self.surface, (self.x_loc, self.y_loc))
def collide(self, obj):
pass
def move_x_left(self, surface, x_loc, y_loc):
window.blit(surface, (self.x_loc, self.y_loc))
self.x_loc -= 20
def move_y_up(self, surface, x_loc, y_loc):
window.blit(surface, (self.x_loc, self.y_loc))
self.y_loc -= 20
def move_x_right(self, surface, x_loc, y_loc):
window.blit(surface, (self.x_loc, self.y_loc))
self.x_loc += 20
def move_y_down(self, surface, x_loc, y_loc):
window.blit(surface, (self.x_loc, self.y_loc))
self.y_loc += 20
这是我的主要功能中的游戏循环
while game_running:
snake.draw(window)
redraw_window()
clock.tick(FPS) # tick the clock based on our FPS rate.
# snake.move_y_down(mask, snake.x_loc, snake.y_loc)
for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game.
if event.type == pygame.QUIT:
pygame.quit()
exit()
keys = pygame.key.get_pressed()
if keys[pygame.K_RIGHT]:
snake.move_x_right(mask, snake.x_loc, snake.y_loc)
if keys[pygame.K_LEFT]:
snake.move_x_left(mask, snake.x_loc, snake.y_loc)
if keys[pygame.K_DOWN]:
snake.move_y_down(mask, snake.x_loc, snake.y_loc)
if keys[pygame.K_UP]:
snake.move_y_up(mask, snake.x_loc, snake.y_loc)
FPS速率为60。仍然不确定我是如何/是否正确地实现这一点的,但无论如何,这可能与这个问题无关。
您可以创建一个变量来跟踪蛇的移动方向并保持该方向的移动。
将方向变量添加到snake类
class Snake:
def __init__(self, block_size, surface, x_loc, y_loc):
# omited code
self.direction = None
检查是否按键,并相应地设置变量:
# SET A CERTAIN DIRECTION IF A CERTAIN KEY IS PRESSED
if keys[pygame.K_RIGHT]:
snake.direction = "right"
if keys[pygame.K_LEFT]:
snake.direction = "left"
if keys[pygame.K_DOWN]:
snake.direction = "down"
if keys[pygame.K_UP]:
snake.direction = "up"
然后简单地朝着这个方向移动每帧
# MOVE ACCORDING TO DIRECTION
if snake.direction == "right":
snake.move_x_right(mask, snake.x_loc, snake.y_loc)
if snake.direction == "left":
snake.move_x_left(mask, snake.x_loc, snake.y_loc)
if snake.direction == "down":
snake.move_y_down(mask, snake.x_loc, snake.y_loc)
if snake.direction == "up":
snake.move_y_up(mask, snake.x_loc, snake.y_loc)
重写代码:
while game_running:
snake.draw(window)
for event in pygame.event.get(): # if we hit "x" to close out the game, close out the game.
if event.type == pygame.QUIT:
pygame.quit()
exit()
keys = pygame.key.get_pressed()
if snake.direction == "right":
snake.move_x_right(mask, snake.x_loc, snake.y_loc)
if snake.direction == "left":
snake.move_x_left(mask, snake.x_loc, snake.y_loc)
if snake.direction == "down":
snake.move_y_down(mask, snake.x_loc, snake.y_loc)
if snake.direction == "up":
snake.move_y_up(mask, snake.x_loc, snake.y_loc)
if keys[pygame.K_RIGHT]:
snake.direction = "right"
if keys[pygame.K_LEFT]:
snake.direction = "left"
snake.move_x_left(mask, snake.x_loc, snake.y_loc)
if keys[pygame.K_DOWN]:
snake.direction = "down"
if keys[pygame.K_UP]:
snake.direction = "up"
我不能测试这个代码,因为我没有你的其余代码,但你明白了。
您可以通过定义一个函数来实现这一点,该函数可以在每个游戏刻度上运行
def move_snake:
speed = 20
window.blit(surface, (self.x_loc, self.y_loc))
self.x_loc += speed * x_heading
self.y_loc += speed * y_heading
然后,您可以在每次向上或向下按键时将y的标题更改为0,将x更改为1或-1,反之亦然。
如果你的游戏节拍链接到你的fps,你可能需要更正速度以反映你的游戏场景。:(
编辑:您可以将速度和标题定义为蛇本身的属性,以便更好地对代码进行分组。