前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pygame-KidsCanCode系列jumpy-part6-主角挂掉重新开始

pygame-KidsCanCode系列jumpy-part6-主角挂掉重新开始

作者头像
菩提树下的杨过
发布2019-09-12 15:42:33
4420
发布2019-09-12 15:42:33
举报

游戏的虚拟世界中,最让人happy的一个因素就是主角挂了,而且重来,只要restart就行了,不象现实中人的生命只有1次。回顾上节的效果,如果方块向下落时,挡板没接住,整个游戏就跪了:

如果我们希望方块挂了之后,可以重新来过,可以这样做,修改Game类的update方法:

代码语言:javascript
复制
    def update(self):
        self.all_sprites.update()
        if self.player.vel.y > 0:
            hits = pg.sprite.spritecollide(self.player, self.platforms, False)
            if hits:
                self.player.pos.y = hits[0].rect.top
                self.player.vel.y = 0
        if self.player.rect.top < HEIGHT / 4:
            self.player.pos.y += abs(self.player.vel.y)
            for plat in self.platforms:
                plat.rect.top += abs(self.player.vel.y)
                if plat.rect.top > HEIGHT:
                    plat.kill()
        # 如果方块跌落到屏幕之外
        if self.player.rect.bottom > HEIGHT:
            # 为了让体验更好,整个屏幕上滚,然后将所有方块干掉
            for sprite in self.all_sprites:
                sprite.rect.top -= max(self.player.vel.y, 5)
                if sprite.rect.bottom < 0:
                    sprite.kill()
            # 如果1个档板都没有了,游戏结束,然后run()本次运行结束,下一轮主循环进来时,new()重新初始化,所有sprite实例重新初始化,满血复活
            if len(self.platforms) <= 0:
                self.playing = False

        while len(self.platforms) <= 5:
            width = random.randint(50, 100)
            p = Platform(random.randint(0, WIDTH - width),
                         random.randint(-70, -30),
                         width, 10)
            self.platforms.add(p)
            self.all_sprites.add(p)

效果如下:

可以看到,方块挂了后,屏幕自动下滚,然后重新开始了。

再来讨论另一个问题:游戏得分。 每跳一级,应该给于玩家一定的奖励(比如:得分),然后在屏幕上显示出来。

先定义一个显示文字的函数:(main.py中)

代码语言:javascript
复制
    def draw_text(self, text, size, color, x, y):
        font = pg.font.SysFont(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)

self.font_name在初始化时指定:

代码语言:javascript
复制
    def __init__(self):
        pg.init()
       ...
        self.font_name = FONT_NAME

为了方便调整,可以在settings.py中定义字体名:

代码语言:javascript
复制
# Player properties
...
FONT_NAME = "Menlo"
...

得分值score在new()中初始化:(main.py中)

代码语言:javascript
复制
    def new(self):
        self.score = 0
        ...
        self.run()

跳跃过程中,屏幕会下滚(包括所有档板),如果档板下移到屏幕外,得分+10(注:不能在方块与档板碰撞时+分,不然如果方块跳上一块档板,再跳下来,再跳上去,反复上下跳,可以不断刷得分)

代码语言:javascript
复制
    def update(self):
        self.all_sprites.update()
        ...
        if self.player.rect.top < HEIGHT / 4:
            self.player.pos.y += abs(self.player.vel.y)
            for plat in self.platforms:
                plat.rect.top += abs(self.player.vel.y)
                if plat.rect.top > HEIGHT:
                    plat.kill()
                    # 得分+10
                    self.score += 10
       ...

最后main.py中的draw函数中,实时显示得分:

代码语言:javascript
复制
    def draw(self):
        self.screen.fill(BLACK)
        ...
        self.draw_text(str(self.score), 22, WHITE, WIDTH / 2, 15)
        ...
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-01-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档