日期:2025/04/05 05:58来源:未知 人气:55
最近在学习pygame这个PYTHON的第三方库。但是光看书里的代码,不自己动手写,只怕是学不到代码的精髓。最近最火的不过今年冬奥咱国家的吉祥物“冰墩墩”,干脆就码一个和国家吉祥物有关的游戏代码。
冰墩墩的一些介绍,摘自百度百科:
冰墩墩(英文:Bing Dwen Dwen,汉语拼音:bīng dūn dūn),是2022年北京冬季奥运会的吉祥物。将熊猫形象与富有超能量的冰晶外壳相结合,头部外壳造型取自冰雪运动头盔,装饰彩色光环,整体形象酷似航天员。
游戏的简介和截图:
埋头写了两三天,算是写出点游戏的样子,游戏的玩法借鉴手游滑雪大冒险 ,玩家只要按住键盘的空格键让控制的滑雪的冰墩墩越过迎来的障碍物(岩石)就OK,有点无脑,或者吃到迎来的竹笋。
游戏中的背景呀、作为障碍物的岩石呀、冰墩墩手上的滑雪杖,脚下的滑雪板呀,这些素材都是来自网站爱给网。
都是免费素材,白嫖得合情合理。至于冰墩墩这个角色的素材,就有点难搞了。在网上能找到的都是不能作为精灵序列的。连引用都会涉及到版权。
动手PS做一些帧图了。在网上找到的可以用的冰墩墩素材如下:
把上面的图片中左侧的冰墩墩造型抠出来,加上找来的素材滑雪板和滑雪杖,修修改改,做出如下的精灵序列图:
为了游戏的娱乐效果,用了网上的熊猫头表情包,做了些表示跳跃和摔倒的冰墩墩帧造型。最后写好游戏代码,运行游戏,效果截图如下:
对游戏代码和用到的帧图有兴趣的朋友可以私信小编获取,条件估计就是有python的环境和下载pygame第三方库。路径都是用相对路径写的,应该不会影响到游戏。对了,我加上了滑雪大冒险的背景音乐“TrubleMarker”,所以,运行游戏出现BGM也不用惊讶(嘿嘿)
下面是略略介绍游戏中的代码编写,感兴趣的朋友可以略略看下。
游戏代码
1、如何实现游戏运行中的无限的背景图:
在pygame里,或者说在大多数的游戏里(像很早很早的超级玛丽),里面移动人物的原理,不是真的改变人物在屏幕的位置,而是移动角色后面的背景图片。根据相对位移的原理,通过向后拉背景图,那么角色在我们看来,就是在向前移动。
这次的冰墩墩滑雪,因为能力有限,只能做出在水平面上的滑雪效果。这次的冰墩墩向前滑雪的效果,也是利用相对位移的原理,让角色在原地变化帧造型,地图就不断往后跑。
代码的实现,首先要有一张宽长一点的PNG图片(素材来源爱给网):
图片的特点是左边和右边可以接合在一块,而没有违和感的(本来可以的)。我们要做的,就是让图片作为surface对象填到屏幕上,当一张图到达屏幕的边界要跑出时,就换另一张图在后面接上。
写上如下的代码,把本地的图片导入:
在游戏运行前设置背景图运动的位置和速度常量:
从上面的代码里,可知变量background1和background2是对应同一张图片,但是从不同的位置贴上游戏屏幕,但是有相同的速度。这样,当图1跑出屏幕,图2就会补上。但是图2跑完,屏幕就空出来了。
那我们就设置当图2要跑完时,图1的位置接到图2的后面,图1跑完后,图2再接到图1的后面,这样,屏幕上一直填有背景图,就简单达到无限背景图的目的。
2、如何实现冰墩墩精灵的帧循环:
上面介绍过用PS和图片素材做出冰墩墩滑雪的简单帧造型。如何在游戏里做出帧图的循环调用和贴上屏幕?
结合书本的知识,我们可以先建立一个继承pygame精灵类的精灵类,这个自己写的精灵类实现帧导入和循环的功能,然后在主程序代码里调用。
在建立的MySprite类里,写入一个load自定义方法,用来导入本地图片成为surface对象,将一系列连贯的帧造型导入到一个列表里,导入前,可以做些图片缩放和去除底色的操作。之后,就把这个列表通过索引赋值给属性self.image,再获取rect属性,修改rect的x,y值为想在屏幕出现的位置。后者的功能实现交给另一个自定义方法update。
之后,调用pygame的精灵组,把冰墩墩精灵添加到组里,最后调用精灵组的draw方法,就能让精灵出现在屏幕想要的位置上了!
我这里的帧图是一个造型一张图的,就直接用os模块简单地把每张图都存为surface对象,再放进列表里。
小编只是一个python新手,注释习惯上写很多(阿巴阿巴)。
我们用pygame自带的方法设置一个计时闹钟ticks,这个闹钟,当游戏运行时,就开始计时。我们用它来设置更新帧索引的时间差:
在MySprite类里的update自定义方法里,设置一个记录上次更换帧索引的时间的变量self.last_frame_time。设置更换帧索引的时间差为0.2秒:
这里要注意的是self.last_frame_time = current_time要写在if语句里,也不难理解。
最后,在主程序里调用类,建立精灵组,将冰墩墩精灵放进组里,用draw方法在屏幕上画上精灵。
3、做出岩石障碍物精灵:
因为要对岩石和我们的冰墩墩做出碰撞检测,所以,岩石要和背景图分开(自说自话)。按照书里的逻辑,我们写一个实现岩石精灵需要的功能的类:MyEmeny类。
要实现的,就是当冰墩墩精灵和岩石碰撞后,岩石会消失,新的岩石会在不久后出现。但冰墩墩精灵成功跳过岩石后,依旧会有新的岩石在不久后出现。
岩石的素材同样是来自爱给网(免费素材就是棒!)。
同样是在类里设置一个load自定义方法导入本地的图片,转化为surface对象,中间对图片进行去除底色和适当缩放。
surface有了,再来就是把它赋给一个精灵对象,作为image,获得其rect属性,让我们可以设置其在屏幕上的位置和速度。
实现碰撞后,旧的岩石消失,新的岩石出现:
这里的游戏逻辑还是很简单的,我们知道,pygame的碰撞检测方法检测到碰撞后,会返回一个bool值。根据这个值,我们写一个if模块,实现碰撞后才会发生的功能,就是岩石精灵跑到屏幕外边去!这样,不就是旧的岩石(碰撞的岩石)消失,新的岩石在之后继续出现。
上图,设置新的岩石精灵在屏幕上出现的位置,是在屏幕外慢慢移动进来的(阿巴阿巴)。
在update自定义方法里,写入碰撞为Ture的if语句块,实现更新岩石位置的功能。别忘记在upfate方法前,写上赋给岩石移动的速度类属性,如下图:
最后,是在主程序里调用这个类,在将其加入到精灵组里,再画出就可以了。
当冰墩墩精灵成功跳过障碍物后,旧岩石的消失和新岩石的出现怎么实现?这个也简单,还是在类里写一个if语句,当岩石的位置偏离屏幕的左侧时,更新岩石精灵的坐标到屏幕的右侧外。
4、总结:
其实,代码里重要的游戏逻辑还有很多,比如按键信息、更换跳跃和摔倒的帧造型,加载音频等等。但是篇幅有限,这里就不展开说明。想研究的,私信编者,回复关键词pygame滑雪小游戏 就可以得到游戏帧图和代码。里面编者这个python小白写了很多代码注释,辅助阅读(阿巴阿巴)。
最后,谢谢观看,祝大家工作顺利,身体健康!