0%

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

前言

本节会增加计分机制,即跳跃了多少个平台,有多少积分,此外如果玩家掉落在游戏框外,玩家死亡,开始新的一局游戏。

增加积分机制

积分机制的原理其实很简单,通过pygame在游戏框中绘制相应的文字,当玩家跳跃到新平台时,积分发生相应的变更,en…逻辑太简单了,直接看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# main.py/Game

# 开始新游戏时
def new(self):
# 初始化积分
self.score = 0

def update(self):
# ...

# 玩家到达游戏框 1/4 处时(注意,游戏框,头部为0,底部为游戏框长度,到到游戏框的1/4处,表示已经到达了顶部一部分了)
if self.player.rect.top <= HEIGHT / 4:
# 玩家位置移动(往下移动)
self.player.pos.y += abs(self.player.vel.y)
# 平台在游戏框外时,将其注销,避免资源浪费
for plat in self.platforms:
# 平台移动位置(往下移动,移动的距离与玩家相同,这样玩家才能依旧站立在原本的平台上)
plat.rect.y += abs(self.player.vel.y)
if plat.rect.top >= HEIGHT:
plat.kill()
# 分数增加 - 平台销毁,分数相加
self.score += 10

在new()方法中,初始化了积分对象,然后在update()方法中更新。这里的计分方式不是玩家跳跃到一个新的平台就积分,而是旧的平台被销毁后,再计分。这就能避免玩家不向上跳跃,而一直在原地跳跃就能获得积分的情况。

接着就是绘制积分文字的逻辑,将其放置在draw()方法中实现.

1
2
3
4
5
6
7
8
9
10
# main.py/Game

def draw(self):
# 绘制
self.screen.fill(BLACK)
self.all_sprites.draw(self.screen)
# 绘制文字 - 具体的分数
self.draw_text(str(self.score), 22, WHITE, WIDTH / 2, 15)
# 翻转
pg.display.flip()

在draw()方法中,调用了self.draw_text()方法进行文字的显示,该方法代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# main.py/Game

def __init__(self):
# ...
# 设置绘制时使用的字体,你也可以直接使用系统本身的字体
self.font_name = pg.font.match_font(FONT_NAME)

# 绘制文字
def draw_text(self, text, size, color, x, y):
font = pg.font.Font(self.font_name, size) # 设置字体与大小
text_surface = font.render(text, True, color) # 设置颜色
text_rect = text_surface.get_rect() # 获得字体对象
text_rect.midtop = (x, y) # 定义位置
self.screen.blit(text_surface, text_rect) # 在屏幕中绘制字体

代码中给出了详细的注释,不再赘述。

增加了上面的代码,运行游戏,就会有相应的积分效果

玩家死亡

如果玩家这个方块位于游戏框范围外,该玩家就死亡了,将这个逻辑实现到Game类的update()方法中

1
2
3
4
5
6
7
8
9
10
#main.py/Game

def update(self):
# 死亡 - 玩家底部大于游戏框高度
if self.player.rect.bottom > HEIGHT:
for sprite in self.all_sprites:
sprite.rect.y -= max(self.player.vel.y, 10)
# 元素底部小于0 - 说明在游戏框外面,将其删除
if sprite.rect.bottom < 0:
sprite.kill()

一开始判断玩家对象方块的底部是否大于游戏框高度了,如果大于,说明玩家已经在游戏框最底部了,而且有一部分已经在游戏框外了,此时玩家死亡,游戏结束。

绘制游戏开始界面

你是否还记得第二节中给出的整体结构,其中包括了show_start_screen()方法与show_go_screen()方法,因为整体的运行逻辑如下:

1
2
3
4
5
6
7
g = Game()
g.show_start_screen() # 游戏开始前会执行的逻辑
while g.running:
g.new()
g.show_go_screen() # 一轮游戏结束后会执行的逻辑

pg.quit()

可以将游戏开始界面的绘制逻辑写到show_start_screen()方法中,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
# main.py/Game

# 开始游戏的钩子函数
def show_start_screen(self):
self.screen.fill(BGCOLOR) # 填充颜色
self.draw_text(TITLE, 48, WHITE, WIDTH / 2, HEIGHT / 4)
# 绘制文字
self.draw_text("Left and right button move, space bar jump", 22, WHITE, WIDTH / 2, HEIGHT / 2)
self.draw_text("Press any key to start the game", 22, WHITE, WIDTH / 2, HEIGHT * 3 / 4)
# 画布翻转
pg.display.flip()
self.wait_for_key() # 等待用户敲击键盘中的仍以位置

在show_start_screen()方法中,一开会先填充了整个背景颜色,然后调用了draw_text()方法绘制文字,这里如果使用中文是无法显示的,pygame中要显示中文,需要指定对应的系统字体,如系统中的「宋体」、「黑体」等,最后调用了wait_for_key()方法进行等待,该方法逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
# main.py/Game

def wait_for_key(self):
waiting = True
while waiting:
self.clock.tick(FPS)
for event in pg.event.get():
if event.type == pg.QUIT: # 点击退出,结束等待循环
waiting = False
self.running = False
if event.type == pg.KEYUP: # 按下键盘,结束等待循环
waiting = False

wait_for_key()方法的逻辑就是一个无限循环,只有用户点击关闭按钮或敲击键盘中的任意键才能退出这个循环。

退出循环后,才能进入真正的游戏循环开始游戏。

结尾

在本节中,我们实现了计分逻辑、死亡逻辑以及游戏启动时简单欢迎界面逻辑。

因为考虑到篇幅,文中没有给出完整的代码,但为了方便大家理解,我将相应的代码上传到了github

https://github.com/ayuLiao/jumprabbit

如果文章对你有帮助或你觉得有点意思,点击「在看」支持作者一波。