关于python:03游戏主角动起来啦python游戏开发红伞伞

3次阅读

共计 2291 个字符,预计需要花费 6 分钟才能阅读完成。

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

0. 前言

hello,小伙伴们!我是带你们一起写游戏的猫姐。
明天咱们接着做小朋友吃蘑菇的小游戏!
上一集咱们做了一个小方块,并显示到了游戏窗口,可别小看这个小方块呀,它就是游戏配角的真身 !明天咱们接着来写代码, 实现通过键盘的方向键,管制小方块的挪动,成果是这样的。

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)

最初,在 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()

好了,当初咱们把程序运行起来,看看成果吧。
当按方向键时,完了,又出问题了。程序并没有依照我的意思动起来。

这是因为,每通过一次 while 循环,都须要进行屏幕刷新。在 while 循环外面,还要增加一行代码:

screen.fill("black")

再次运行程序:

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)

咱们再运行程序,看看成果!当咱们按键盘的上下左右箭头时,方块也能失常的挪动了,是不是很神奇。

不晓得大家有没有发现一个问题,当方块上下左右挪动时,方块会跑到窗口里面去,你晓得怎么解决这个问题吗?
关注猫姐,下一集咱们来解决这个 bug!

正文完
 0