我可以通过按键改变 pygame 对象的恒定移动方向吗?



我正在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,你可能需要更正速度以反映你的游戏场景。:(

编辑:您可以将速度和标题定义为蛇本身的属性,以便更好地对代码进行分组。

最新更新