03(游戏主角动起来啦!#python游戏开发#红伞伞)

声明: 原创不易,未经许可,不得转载

0.前言 hello,小伙伴们!我是带你们一起写游戏的猫姐。
今天我们接着做小朋友吃蘑菇的小游戏!
上一集我们做了一个小方块,并显示到了游戏窗口,可别小看这个小方块呀,它就是游戏主角的真身!今天我们接着来写代码,实现通过键盘的方向键,控制小方块的移动,效果是这样的。
03(游戏主角动起来啦!#python游戏开发#红伞伞)
文章图片

1.定义一个move函数 我们在Player类里面,定义一个move函数,通过pygame.keyget_pressed函数来获取用户的键盘输入,它会返回一个,由布尔类型值组成的序列,赋值给key_pressed。你们自己,可以将这个变量打印出来,看下到底是什么东东!

class Player(pygame.sprite.Sprite): def __init__(self): super(Player, self).__init__() self.image = pygame.Surface((60, 30)) self.image.fill("white") self.rect = self.image.get_rect(left=WIDTH//2, top=HEIGHT//2)def move(self): key_pressed = pygame.key.get_pressed()

2.接下来的工作安排 我们现在要做的工作是:
当按下键盘的左箭头时,方块向左移10个像素,
当按下右箭头时,方块向右移10个像素;
同理上下两个方向键,也是做相同的处理。
我们通过判断key_pressed,很容易知道用户是否按了方向键。
class Player(pygame.sprite.Sprite): def __init__(self): super(Player, self).__init__() self.image = pygame.Surface((60, 30)) self.image.fill("white") self.rect = self.image.get_rect(left=WIDTH//2, top=HEIGHT//2)def move(self): key_pressed = pygame.key.get_pressed() if key_pressed[K_UP]: self.rect.move_ip(0, -10)if key_pressed[K_LEFT]: self.rect.move_ip(-10, 0)

如果key_pressed的键是K_UP,也就是按下了键盘的向上箭头,则调用小方块的self.rect.move_ip函数,让小方块向上移动10个像素。
move_ip函数的括号里,第一个0表示的是x,即x不动,第二个数为-10,表示的是y,让方块向上移10个像素。
它是根据我们的坐标系来定的,游戏窗口的坐标系是这样的,原点在左顶点,为(0,0),向右走,x为正,向下走,y为正!
同理,当按下向左的箭头,则调用方块的self.rect.move_ip函数,括号里面传入的是(-10,0);
大家思考一下,方块向下,向右走的代码该怎么写呢?代码是这样的:
#... def move(self): key_pressed = pygame.key.get_pressed() #... if key_pressed[K_DOWN]: self.rect.move_ip(0, 10) #... if key_pressed[K_RIGHT]: self.rect.move_ip(10, 0)

【03(游戏主角动起来啦!#python游戏开发#红伞伞)】最后,在while循环里面,我们还需要调用player.move函数,我们的小方块才能动得起来呢!
while True: for event in pygame.event.get():0 if event.type == QUIT: sys.exit() player.update() player.move() pygame.display.update()

好了,现在我们把程序运行起来,看看效果吧。
当按方向键时,完了,又出问题了。程序并没有按照我的意思动起来。
03(游戏主角动起来啦!#python游戏开发#红伞伞)
文章图片

这是因为,每经过一次while循环,都需要进行屏幕刷新。在while循环里面,还要添加一行代码:
screen.fill("black")

再次运行程序:
03(游戏主角动起来啦!#python游戏开发#红伞伞)
文章图片

3.设置屏幕的刷新频率 我们可以看到,当按键盘的上下左右键时,方块跑得很快,这是什么原因呢?是因为,我们没有控制屏幕的刷新频率,也就是帧速率。
我加三行代码,解决这个问题:
pygame.init() WIDTH = 600 HEIGHT = 800 # 设置帧速率大小 FPS = 30 # 创建Clock对象 clock = pygame.time.Clock() screen = pygame.display.set_mode((WIDTH, HEIGHT))

然后在while循环里面,pygame.display.update更新语句的下面,调用clock.tick(FPS),就可以来控制屏幕的刷新频率了。
while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() screen.fill("black") for sprite in all_sprites: sprite.move() sprite.update() pygame.display.update() # 控制屏幕的刷新频率 clock.tick(FPS)

我们再运行程序,看看效果!当我们按键盘的上下左右箭头时,方块也能正常的移动了,是不是很神奇。
03(游戏主角动起来啦!#python游戏开发#红伞伞)
文章图片

不知道大家有没有发现一个问题,当方块上下左右移动时,方块会跑到窗口外面去,你知道怎么解决这个问题吗?
关注猫姐,下一集我们来处理这个bug!

    推荐阅读