HackPython 改名为「懒编程」,纯粹是因为我有另外一个写杂文的号叫「懒写作」,此外,感觉「懒编程」比 HackPython 好记。

前言

在第 5 节内容中,实现了积分机制、玩家死亡逻辑以及游戏开始界面逻辑,本节继续完善游戏,来实现游戏结束逻辑与玩家图片化,不再使用方块。

游戏结束逻辑

回忆一下整体逻辑:

  1. g = Game()
  2. g.show_start_screen()
  3. while g.running:
  4. g.new()
  5. g.show_go_screen()
  6. pg.quit()

可以通过 showgoscreen () 方法实现游戏结束逻辑,代码如下:

  1. # main.py/Game
  2. # 每轮游戏结束后,都会调用该方法
  3. def show_go_screen(self):
  4. # game over/continue
  5. if not self.running: # 是否在运行
  6. return
  7. self.screen.fill(BGCOLOR) # 游戏框背景颜色填充
  8. # 绘制文字
  9. self.draw_text("GAME OVER", 48, WHITE, WIDTH / 2, HEIGHT / 4)
  10. self.draw_text("Score: " + str(self.score), 22, WHITE, WIDTH / 2, HEIGHT / 2)
  11. self.draw_text("Press a key to play again", 22, WHITE, WIDTH / 2, HEIGHT * 3 / 4)
  12. # 判断分数
  13. if self.score > self.highscore:
  14. self.highscore = self.score
  15. self.draw_text("NEW HIGH SCORE!", 22, WHITE, WIDTH / 2, HEIGHT / 2 + 40)
  16. # 记录新的最高分到文件中 - 持久化
  17. with open(os.path.join(self.dir, HS_FILE), 'w') as f:
  18. f.write(str(self.score))
  19. else:
  20. self.draw_text("High Score: " + str(self.highscore), 22, WHITE, WIDTH / 2, HEIGHT / 2 + 40)
  21. # 翻转
  22. pg.display.flip()
  23. # 等待敲击任意键,重新开始新的一轮游戏
  24. self.wait_for_key()

showgoscreen () 方法逻辑可以阅读详细的注释,不再赘述。

showgoscreen () 通过文件的方式来记录最高的分数,所以在游戏一开始,就需要从文件中读取此前的分数,好为这部分逻辑做判断,逻辑如下:

  1. class Game:
  2. def __init__(self):
  3. # ...
  4. # 加载最高分数
  5. self.load_data()
  6. def load_data(self):
  7. self.dir = os.path.dirname(__file__)
  8. filepath = os.path.join(self.dir, HS_FILE)
  9. with open(filepath, 'r') as f:
  10. try:
  11. self.highscore = int(f.read())
  12. except:
  13. self.highscore = 0

玩家图片化

一个正常的游戏,肯定要有相应的图片素材的,图片素材是否精美也是影响他人是否要玩你游戏的重要因素。

通常,一个游戏,会有多张大图,多个同类元素都放在这张大的 png 图片中,而不是每个元素都是一个 png 元素,通过这种方式,让整个游戏包更小。

如下,一张完整的图

与其对应的就是图中不同元素其坐标位置 (x,y) 以及元素图片大小

写一段从完整图片中获取对应元素的逻辑,代码如下:

  1. # sprites.py
  2. # 加载与解析精灵图片
  3. class Spritesheet:
  4. def __init__(self, filename):
  5. # 主要要使用convert()进行优化, convert()方法会 改变图片的像素格式
  6. # 这里加载了整张图片
  7. self.spritesheet = pg.image.load(filename).convert()
  8. # 从比较大的精灵表中,通过相应的xml位置,抓取出需要的元素
  9. def get_image(self, x, y, width, height):
  10. # 创建Surface对象(画板对象)
  11. image = pg.Surface((width, height))
  12. # blit — 画一个图像到另一个
  13. # 将整张图片中,对应位置(x,y)对应大小(width,height)中的图片画到画板中
  14. image.blit(self.spritesheet, (0, 0), (x, y, width, height))
  15. # pygame.transform.scale 缩放的大小
  16. # 这里将图片缩放为原来的一半
  17. image = pg.transform.scale(image, (width // 2, height // 2))
  18. return image

在__init__() 中,通过 pygame.image.load () 方法加载完整的图片,记得使用 convert () 方法进行优化,随后定义了 get_image () 方法,该方法的逻辑也很直接,先实例化 Surface 类,获得与图片大小相同的面板对象,然后,通过 blit () 方法将完整图片中对应位置与大小的元素剥离出来。

经过实践,原本图片元素太大,所以通过 pygame.transform.scale () 方法将图片元素缩小 2 倍。

编写完 Spritesheet 类后,在 Game 类的 load_data () 方法中实例化一下

  1. # main.py/Game
  2. def load_data(self): # 加载数据
  3. self.dir = os.path.dirname(__file__)
  4. filepath = os.path.join(self.dir, HS_FILE)
  5. with open(filepath, 'r') as f:
  6. try:
  7. self.highscore = int(f.read())
  8. except:
  9. self.highscore = 0
  10. img_dir = os.path.join(self.dir, 'img')
  11. # 加载精灵图片
  12. self.spritesheet = Spritesheet(os.path.join(img_dir, SPRITESHEET))

做完这些后,在 Player 类初始化时调用其中的 get_image () 方法就大功告成了。

  1. class Player(pg.sprite.Sprite):
  2. def __init__(self, game):
  3. pg.sprite.Sprite.__init__(self)
  4. self.game = game
  5. # 加载 bunny1_ready状态的兔子图片, xml文件中给出的(x,y)与(width,height)
  6. self.image = self.game.spritesheet.get_image(614, 1063, 120, 191)
  7. self.image.set_colorkey(BLACK)
  8. self.rect = self.image.get_rect()
  9. self.rect.center = (WIDTH / 2, HEIGHT / 2)
  10. self.pos = vec(WIDTH / 2, HEIGHT / 2)
  11. self.vel = vec(0, 0) # 速度
  12. self.acc = vec(0, 0) # 加速度

为了整体美观,修改了一下,游戏框整体的背景颜色,具体通过 self.screen.fill (BGCOLOR) 方法。

最后,效果如下:

结尾

在本节中,我们实现了游戏结束界面以及使用了玩家元素,后面,会进一步优化玩家元素,让玩家在左右移动时,是不同的图片,从而让整个游戏显得更加灵动。

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

https://github.com/ayuLiao/jumprabbit

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

pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)相关推荐

  1. pygame精灵组有哪些方法_小精灵科学室-如何在活动中提高幼儿的探究能力和科学探究活动?...

    小精灵幼儿科学发现室 幼儿科学教育的宗旨,幼儿科学活动的内容. 幼儿为什么要进行科学活动?科学活动的内容都有哪些?科学活动的理念是什么?如何开展科学活动的实施? 幼儿科学教育的宗旨:幼儿科学教育是指幼 ...

  2. pygame精灵组有哪些方法_pygame 的精灵使用

    pygame 的精灵使用 pygame.sprite.Sprite 是 pygame 中用来实现精灵的一个类,在使用时并不需要对它实例化,只需要继承它,然后按需写出自己的类,因此非常简单.使用. 1. ...

  3. pygame精灵组有哪些方法_pygame怎样实现精灵的行走及二段跳

    pygame制作游戏人物精灵的行走及二段跳实现方法 不得不承认<Python游戏编程入门>这本书翻译.排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里. 先是素材: 背景 ...

  4. python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐

    手机上面的开心消消乐,我想大部分人都是玩过的吧,今天小编就教大家如何用python开发这款游戏 不过只有十个关卡,不像手机里面那么多的关卡!不过游戏的画面和bgm都是同款的哦~ 效果图 基本配置 wi ...

  5. 利用Phaser开发微信小游戏(排行榜小结)

                                                                利用Phaser开发微信小游戏(排行榜小结) 小游戏中的开放数据域可用来保存游戏 ...

  6. 利用Python3开发一款小工具(界面的设计)

    前面在<利用Python3开发一款小工具(引言)>文章中,对我们的需求进行了分析.为了能够让用户运行该工具,因此我们需要一个ui界面,而python中常用的工具就是pyqt,本文将使用py ...

  7. 如何利用人工智能技术来快速开发一款游戏呢?

    使用人工智能技术来快速开发游戏的方法有很多,下面列举几种常见的做法: 使用游戏引擎和模板:有很多专门用于游戏开发的引擎和模板可以快速搭建游戏框架,比如 Unity.Unreal Engine 等.这样 ...

  8. Python编程从入门到实践---pygame精灵组

    初学Python,跟着书上的外星人项目,写了一下,碰到一个这样的问题: AttributeError: 'Alien' object has no attribute 'add_internal' 找 ...

  9. eltable刷新整个表格方法_利用SSAS实现PBI报表增量刷新

    欢迎访问我的博客网站阅读最新BI文章 对于经常处理大量数据且其Power BI报表不需要每次都刷新整个数据集的用户而言,增量刷新一直都是个问题,特别是对于那些没有条件使用Premium空间的用户以及在 ...

最新文章

  1. 721合约 erc eth_深入了解「智能合约」及主流平台「智能合约」的查询方法
  2. PHP——通过下拉列表选择时间(转)
  3. 【商务智能】数据预处理
  4. js array 对象
  5. 大数据泄露你的行踪?隐私不再是隐私
  6. Cool!15个超炫的 CSS3 文本特效【上篇】
  7. 计算机网络数据链路层 --- 后退n帧协议(GBN)
  8. ALC--软件定义架构的PLC
  9. 操作系统(7)-进程、线程、协程的区别
  10. bigdecimal不保留小数_为什么 0.1 + 0.2 = 0.3,原来你不知道
  11. Python一行代码
  12. hdu 1312深搜入门题
  13. 数据库备份和事务日志备份
  14. psasp和matlab,PSASP与Matlab/SimPowerSystems联合仿真接口方法研究
  15. 判断回文字符串-C语言
  16. 检查php语法错误,PHP检查语法错误技巧
  17. Mortal Kombat Tower(dp)
  18. php年龄计算器,js+html实现周岁年龄计算器
  19. 解决Win7笔记本下玩游戏的显示问题
  20. 为什么大家都在用 PDF? PDF 文档怎么修改?

热门文章

  1. 计算机程序CP电子文献,电子文献标识
  2. cass参考手册_CASS9.2参考手册
  3. 株洲市码高机器人编程_码高机器人教育
  4. 云计算的发展趋势_云计算的未来发展趋势
  5. oracle账户用root权限执行sh,安装Oracle执行orainstRoot.sh与root.sh作用
  6. 智能提示_文明放大镜·7 | 清新智能语音提示桩让你过马路除了看灯还可以听,赞...
  7. Ant Design引入Echarts
  8. JMeter的编码与HTTP请求
  9. java 发布应用_发布java应用程序的步骤
  10. PAT甲级1024 ASCII码与整数转换