pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)
HackPython 改名为「懒编程」,纯粹是因为我有另外一个写杂文的号叫「懒写作」,此外,感觉「懒编程」比 HackPython 好记。
前言
在第 5 节内容中,实现了积分机制、玩家死亡逻辑以及游戏开始界面逻辑,本节继续完善游戏,来实现游戏结束逻辑与玩家图片化,不再使用方块。
游戏结束逻辑
回忆一下整体逻辑:
g =
Game()
g.show_start_screen()
while g.running:
g.new()
g.show_go_screen()
pg.quit()
可以通过 showgoscreen () 方法实现游戏结束逻辑,代码如下:
# main.py/Game
# 每轮游戏结束后,都会调用该方法
def show_go_screen(self):
# game over/continue
if
not self.running:
# 是否在运行
return
self.screen.fill(BGCOLOR)
# 游戏框背景颜色填充
# 绘制文字
self.draw_text("GAME OVER",
48, WHITE, WIDTH /
2, HEIGHT /
4)
self.draw_text("Score: "
+ str(self.score),
22, WHITE, WIDTH /
2, HEIGHT /
2)
self.draw_text("Press a key to play again",
22, WHITE, WIDTH /
2, HEIGHT *
3
/
4)
# 判断分数
if self.score > self.highscore:
self.highscore = self.score
self.draw_text("NEW HIGH SCORE!",
22, WHITE, WIDTH /
2, HEIGHT /
2
+
40)
# 记录新的最高分到文件中 - 持久化
with open(os.path.join(self.dir, HS_FILE),
'w')
as f:
f.write(str(self.score))
else:
self.draw_text("High Score: "
+ str(self.highscore),
22, WHITE, WIDTH /
2, HEIGHT /
2
+
40)
# 翻转
pg.display.flip()
# 等待敲击任意键,重新开始新的一轮游戏
self.wait_for_key()
showgoscreen () 方法逻辑可以阅读详细的注释,不再赘述。
showgoscreen () 通过文件的方式来记录最高的分数,所以在游戏一开始,就需要从文件中读取此前的分数,好为这部分逻辑做判断,逻辑如下:
class
Game:
def __init__(self):
# ...
# 加载最高分数
self.load_data()
def load_data(self):
self.dir = os.path.dirname(__file__)
filepath = os.path.join(self.dir, HS_FILE)
with open(filepath,
'r')
as f:
try:
self.highscore = int(f.read())
except:
self.highscore =
0
玩家图片化
一个正常的游戏,肯定要有相应的图片素材的,图片素材是否精美也是影响他人是否要玩你游戏的重要因素。
通常,一个游戏,会有多张大图,多个同类元素都放在这张大的 png 图片中,而不是每个元素都是一个 png 元素,通过这种方式,让整个游戏包更小。
如下,一张完整的图
与其对应的就是图中不同元素其坐标位置 (x,y) 以及元素图片大小
写一段从完整图片中获取对应元素的逻辑,代码如下:
# sprites.py
# 加载与解析精灵图片
class
Spritesheet:
def __init__(self, filename):
# 主要要使用convert()进行优化, convert()方法会 改变图片的像素格式
# 这里加载了整张图片
self.spritesheet = pg.image.load(filename).convert()
# 从比较大的精灵表中,通过相应的xml位置,抓取出需要的元素
def get_image(self, x, y, width, height):
# 创建Surface对象(画板对象)
image = pg.Surface((width, height))
# blit — 画一个图像到另一个
# 将整张图片中,对应位置(x,y)对应大小(width,height)中的图片画到画板中
image.blit(self.spritesheet,
(0,
0),
(x, y, width, height))
# pygame.transform.scale 缩放的大小
# 这里将图片缩放为原来的一半
image = pg.transform.scale(image,
(width //
2, height //
2))
return image
在__init__() 中,通过 pygame.image.load () 方法加载完整的图片,记得使用 convert () 方法进行优化,随后定义了 get_image () 方法,该方法的逻辑也很直接,先实例化 Surface 类,获得与图片大小相同的面板对象,然后,通过 blit () 方法将完整图片中对应位置与大小的元素剥离出来。
经过实践,原本图片元素太大,所以通过 pygame.transform.scale () 方法将图片元素缩小 2 倍。
编写完 Spritesheet 类后,在 Game 类的 load_data () 方法中实例化一下
# main.py/Game
def load_data(self):
# 加载数据
self.dir = os.path.dirname(__file__)
filepath = os.path.join(self.dir, HS_FILE)
with open(filepath,
'r')
as f:
try:
self.highscore = int(f.read())
except:
self.highscore =
0
img_dir = os.path.join(self.dir,
'img')
# 加载精灵图片
self.spritesheet =
Spritesheet(os.path.join(img_dir, SPRITESHEET))
做完这些后,在 Player 类初始化时调用其中的 get_image () 方法就大功告成了。
class
Player(pg.sprite.Sprite):
def __init__(self, game):
pg.sprite.Sprite.__init__(self)
self.game = game
# 加载 bunny1_ready状态的兔子图片, xml文件中给出的(x,y)与(width,height)
self.image = self.game.spritesheet.get_image(614,
1063,
120,
191)
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.rect.center =
(WIDTH /
2, HEIGHT /
2)
self.pos = vec(WIDTH /
2, HEIGHT /
2)
self.vel = vec(0,
0)
# 速度
self.acc = vec(0,
0)
# 加速度
为了整体美观,修改了一下,游戏框整体的背景颜色,具体通过 self.screen.fill (BGCOLOR) 方法。
最后,效果如下:
结尾
在本节中,我们实现了游戏结束界面以及使用了玩家元素,后面,会进一步优化玩家元素,让玩家在左右移动时,是不同的图片,从而让整个游戏显得更加灵动。
因为考虑到篇幅,文中没有给出完整的代码,但为了方便大家理解,我将相应的代码上传到了 github
https://github.com/ayuLiao/jumprabbit
如果文章对你有帮助或你觉得有点意思,点击「在看」支持作者一波。
pygame精灵组有哪些方法_利用 pygame 开发一款游戏:「跳跳兔」(六)相关推荐
- pygame精灵组有哪些方法_小精灵科学室-如何在活动中提高幼儿的探究能力和科学探究活动?...
小精灵幼儿科学发现室 幼儿科学教育的宗旨,幼儿科学活动的内容. 幼儿为什么要进行科学活动?科学活动的内容都有哪些?科学活动的理念是什么?如何开展科学活动的实施? 幼儿科学教育的宗旨:幼儿科学教育是指幼 ...
- pygame精灵组有哪些方法_pygame 的精灵使用
pygame 的精灵使用 pygame.sprite.Sprite 是 pygame 中用来实现精灵的一个类,在使用时并不需要对它实例化,只需要继承它,然后按需写出自己的类,因此非常简单.使用. 1. ...
- pygame精灵组有哪些方法_pygame怎样实现精灵的行走及二段跳
pygame制作游戏人物精灵的行走及二段跳实现方法 不得不承认<Python游戏编程入门>这本书翻译.排版非常之烂,但是里面的demo还是很好的,之前做了些改编放到这里. 先是素材: 背景 ...
- python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐
手机上面的开心消消乐,我想大部分人都是玩过的吧,今天小编就教大家如何用python开发这款游戏 不过只有十个关卡,不像手机里面那么多的关卡!不过游戏的画面和bgm都是同款的哦~ 效果图 基本配置 wi ...
- 利用Phaser开发微信小游戏(排行榜小结)
利用Phaser开发微信小游戏(排行榜小结) 小游戏中的开放数据域可用来保存游戏 ...
- 利用Python3开发一款小工具(界面的设计)
前面在<利用Python3开发一款小工具(引言)>文章中,对我们的需求进行了分析.为了能够让用户运行该工具,因此我们需要一个ui界面,而python中常用的工具就是pyqt,本文将使用py ...
- 如何利用人工智能技术来快速开发一款游戏呢?
使用人工智能技术来快速开发游戏的方法有很多,下面列举几种常见的做法: 使用游戏引擎和模板:有很多专门用于游戏开发的引擎和模板可以快速搭建游戏框架,比如 Unity.Unreal Engine 等.这样 ...
- Python编程从入门到实践---pygame精灵组
初学Python,跟着书上的外星人项目,写了一下,碰到一个这样的问题: AttributeError: 'Alien' object has no attribute 'add_internal' 找 ...
- eltable刷新整个表格方法_利用SSAS实现PBI报表增量刷新
欢迎访问我的博客网站阅读最新BI文章 对于经常处理大量数据且其Power BI报表不需要每次都刷新整个数据集的用户而言,增量刷新一直都是个问题,特别是对于那些没有条件使用Premium空间的用户以及在 ...
最新文章
- 721合约 erc eth_深入了解「智能合约」及主流平台「智能合约」的查询方法
- PHP——通过下拉列表选择时间(转)
- 【商务智能】数据预处理
- js array 对象
- 大数据泄露你的行踪?隐私不再是隐私
- Cool!15个超炫的 CSS3 文本特效【上篇】
- 计算机网络数据链路层 --- 后退n帧协议(GBN)
- ALC--软件定义架构的PLC
- 操作系统(7)-进程、线程、协程的区别
- bigdecimal不保留小数_为什么 0.1 + 0.2 = 0.3,原来你不知道
- Python一行代码
- hdu 1312深搜入门题
- 数据库备份和事务日志备份
- psasp和matlab,PSASP与Matlab/SimPowerSystems联合仿真接口方法研究
- 判断回文字符串-C语言
- 检查php语法错误,PHP检查语法错误技巧
- Mortal Kombat Tower(dp)
- php年龄计算器,js+html实现周岁年龄计算器
- 解决Win7笔记本下玩游戏的显示问题
- 为什么大家都在用 PDF? PDF 文档怎么修改?
热门文章
- 计算机程序CP电子文献,电子文献标识
- cass参考手册_CASS9.2参考手册
- 株洲市码高机器人编程_码高机器人教育
- 云计算的发展趋势_云计算的未来发展趋势
- oracle账户用root权限执行sh,安装Oracle执行orainstRoot.sh与root.sh作用
- 智能提示_文明放大镜·7 | 清新智能语音提示桩让你过马路除了看灯还可以听,赞...
- Ant Design引入Echarts
- JMeter的编码与HTTP请求
- java 发布应用_发布java应用程序的步骤
- PAT甲级1024 ASCII码与整数转换