利用 pygame 开发一款游戏:「跳跳兔」(二)

本文详细讲解如何利用 pygame 框架开发一款名为「跳跳兔」的游戏,包括创建玩家类,实现玩家在游戏屏幕中的移动,以及通过键盘控制玩家的上下跳动。通过实例代码展示了 pygame 中元素的管理与运动控制,让读者了解 pygame 游戏开发的基本流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

本节来看一下如何创建一个玩家对象并让其在游戏框中运动。

玩家类

从简到难,先通过一个简单的方块来表示一个玩家。

在 pygame 中,所有的对象都称为元素,玩家是一个元素,游戏中的怪物也是一个元素,而所有的元素都要通过 pygame.sprite.Sprite来控制,下面就来创建一个简单的玩家类。

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 50)) # self.image表示元素本身
        self.image.fill(GREEN) # 元素本身填充为绿色
        self.rect = self.image.get_rect() # 获得该元素对应的方块
        self.rect.center = (WIDTH /2, HEIGHT / 2) # 将该元素放置在窗口中间(方块代表这元素)
    # 更新角色 - 移动
    def update(self):
        self.rect.x += 5
        if self.rect.left > WIDTH:
            self.rect.right = 0

我们定义了 Player 类,它继承于 pygame.sprite.Sprite,在 __init__()初始化方法中,调用了 pygame.sprite.Sprite 中的初始化方法,完成基本的初始化。

随后,调用了 pygame.Surface () 方法创建了一个 50x50 的正方形,然后将其填充为绿色。最后就是将 Player 类这个绿色的方法放在游戏框的正中间。

除了定义 __init__()方法,Player 类中还定义了 update () 方法,该方法就是让绿色方块沿 x 轴平移,当绿色方块的 left 超出游戏框时,就将 right 置为 0,这样就会达到走马灯的效果。

让玩家运动起来

光定义玩家类是无法让玩家元素平移运动的,回顾一下第一篇 pygame 文章,游戏本质就是循环,每次循环都要处理相应的逻辑,循环中逻辑的不同,造成了不同的游戏,所以为了让玩家元素可以移动,还需要实现这个循环。

首先,依旧是初始化相关的对象。

pygame.init() # pygame初始化
pygame.mixer.init() # mixer在pygame中用于处理一切音频相关的东西
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 初始化窗口
pygame.display.set_caption('My Game') # 标题名
clock = pygame.time.Clock() # 计时器,主要用于控制界面刷新的频率
# 在一个游戏中,通过一个元素组来表示该游戏中所有的角色
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player) # 添加到元素组中

与此前不同,因为多了玩家元素,所以需要初始化 pygame.sprite.Group (),然后将玩家对象添加到元素组中,pygame 要求我们通过元素组的方式来操作不同的元素。

初始化完成后,直接一个无限循环,代码如下

# 所有游戏都是一个循环, 循环中通常由三个部分组成,事件输入、元素状态更新、绘制
running = True
while running:
    # 帧率
    clock.tick(FPS)
    # 处理事件输入
    for event in pygame.event.get():
        if event.type == pygame.QUIT: #如果点击 x 按钮,游戏退出,即跳出循环
            running = False
    all_sprites.update() # 更新角色
    # 绘制与渲染(依旧是黑色背景)
    screen.fill(BLACK)
    all_sprites.draw(screen) #绘制所有元素到界面中
    # 翻转绘画板,更新界面,绘制任何内容,都需要这个步骤,不然绘制的内容在背面,玩家是不可见的
    pygame.display.flip()

为了方便大家理解,代码中我依旧给出了详细的注释,唯一不同就是多了事件输入的处理逻辑以及角色更新的逻辑。

通过 pygame.event.get () 可以获得 pygame 可以接收到的所有事件,在这个循环中,判断了事件类型,如果点击了窗口关闭按钮,就将 running 设置为 False,结束无限循环。

此外,调用了元素组中的 update () 方法,对所有元素的状态进行更新,而当下元素组中只有玩家对象,所有玩家对象的状态被更新了,简单而言,玩家此时沿 x 轴移动了 5 个像素。随后的代码都与第一篇相同,不再赘述。

此时运行整个完整的代码,绿色方块就会在游戏屏幕中移动,实现跑马灯效果了。

更进一步

玩家类是一个绿色方块显得太过简陋,这里将其替换为一张图片,此外让玩家可以上下跳动,修改后,玩家类代码如下:

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        # pygame加载图像元素时,记得要使用convert()方法将图像转为pygame容易操控的对象,否则整个游戏加载会变慢
        self.image = pygame.image.load(os.path.join(img_folder, 'p1_jump.png')).convert()
        self.image.set_colorkey(BLACK) # 将图像矩阵中除图像外周围的元素都设置为透明的
        self.rect = self.image.get_rect() # 获得该元素对应的方块
        self.rect.center = (WIDTH /2, HEIGHT / 2) # 将该元素放置在窗口中间(方块代表这元素)
        self.y_speed = 5
    # 更新玩家状态
    def update(self):
        self.rect.x += 5
        self.rect.y += self.y_speed
        if self.rect.bottom > HEIGHT - 200:
            self.y_speed = -5
        if self.rect.top < 200:
            self.y_speed = 5
        if self.rect.left > WIDTH:
            self.rect.right = 0

上述代码中,利用 pygame.image.load () 方法实现图像元素的加载,需要注意,加载完后,一定要使用 convert () 方法将其转为 pygame 容易操作的对象 (这是个 Ticks),接着还需要使用 set_colorkey () 方法将图像元素外的其他元素都设置为透明,不然显示在 pygame 游戏框中就会是一个正方形,正方形中有张图片,非常的丑。

此外,update () 方法也走了一些逻辑修改,让玩家元素除了在 x 轴移动外,还实现其在 y 轴移动,移动的方式是上下跳动的形式,最终效果如下。


本节介绍了 pygame 怎么样去管理元素,在下一节中,将介绍 pygame 如何控制元素移动,即通过键盘控制游戏框中元素的移动。

如果文章对你有所帮助,请点「在看」给作者一点鼓励,叩谢豪恩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒编程-二两

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值