大家好,我是王某人。
估计好些宅在家里好几个月了,有点无聊。决定写了一个小游戏,名字叫做《小蜜蜂的丛林历险记》。
什么情况呢?
我来介绍一下游戏吧:有一天,小蜜蜂为了采集花蜜,决定穿越最凶险的丛林,抵达传说中的万花岛。丛林里有各种各样野蛮的虫子,如果不幸被这些虫子抓到了,小蜜蜂生命值就会损失,如果生命值损失没了,小蜜蜂就挂了,当然,在寻找万花岛的过程中,小蜜蜂也会遇到各种各样的帮助,比如说,如果小蜜蜂碰到了一个桃花,喝到了桃花蜜,她的生命值就会提高。如果碰到了梅花,小蜜蜂移动速度加快。
对了,我们还忘记了说一件事,那就是小蜜蜂到底有什么样的武器来对付这些毒虫呢!大家看下面:
小蜜蜂现在只有一种武器,那就是她射出的箭。当然了,随着关卡的不断深入,小蜜蜂还会不断地获得各种各样的新武器。比如.........我也没想好
现在是这个游戏的第一步,在将来,我们会不断的更新这个小游戏,不断添加各种各样的敌人。同时也赋予小蜜蜂越来越多的武器。
好吧!!!
开始啦!
我们来看看我们今天的主角:小蜜蜂:
然后小蜜蜂碰到的第一个敌人是:瓢虫:
现在是最简化版本的游戏,形式上和飞机大战差不多。按上下左右键,小蜜蜂就可以上下左右移动,如果按了空格键,小蜜蜂发射一支箭,射中了瓢虫,那么瓢虫直接死亡(瓢虫血比较薄)。当然,如果小蜜蜂被瓢虫碰到了,小蜜蜂也死亡。
在直接动手写程序以前,我们首先要做的是抠图,意思是把这些图片素材的背景变成透明的,记住,白色的背景不是透明的,白色是一种颜色,我们要的是透明,意思就是无色的。如果我们不扣图,图片素材里面有白色的背景,就会出现这样的情况。
大家可以看到,瓢虫就是没有抠图的效果,小蜜蜂是抠图以后的效果。网上有很多抠图的网站,但很多都是收费的,这里我写了一个python的代码,可以自动从白色的背景中抠图。代码如下:
from PIL import Image
def transPNG(srcImageName, dstImageName): img = Image.open(srcImageName) img = img.convert("RGBA") datas = img.getdata() newData = list() for item in datas: if item[0] > 225 and item[1] > 225 and item[2] > 225: newData.append((255, 255, 255, 0)) else: newData.append(item) img.putdata(newData) img.save(dstImageName, "PNG") transPNG('my_arrow.png','new_arrow')
然后我们就要开始正式的程序了。
关于小游戏,我们之前已经讲的很多了,比如说按键识别,大家很容易就能看懂。这个游戏比较特殊的地方在于,我们用了pygame里面的精灵和精灵组。这是pygame里面专门用来开发游戏的功能,可以大幅度节约你的代码。
另外就是,我们用到了类的继承,相信很多同学都学过。
我们首先定义一个精灵类:
class GrameSprite(pygame.sprite.Sprite): """"飞机大战游戏精灵类"""
def __init__(self, image_name, speed=1,speed1=1): # 调用父类方法 super().__init__() pygame.image.load(image_name).convert_alpha()
self.image = pygame.image.load(image_name).convert_alpha() self.rect = self.image.get_rect() self.speed = speed self.speed1=speed1
def update(self): self.rect.y += self.speed
这个精灵类包含一些基本的参数和功能。
首先,精灵类继承了GrameSprite(pygame.sprite.Sprite)。也就是说,我们定义的这个精灵,它继承了pygame里面的精灵的全部功能。我们还给它添加了一些新的功能。比如说speed,speed表示的是左右方向的速度,而speed1表示的是上下的速度。在update功能中,还定义了精灵的移动功能。
之后,我们定义小蜜蜂的类:
class Hero(GrameSprite): """英雄类"""
def __init__(self): super().__init__('./images/hero1.png', 0) self.rect.centerx = SCREEN_RECT.centerx self.rect.bottom = SCREEN_RECT.bottom - 120
# 创建子弹精灵组 self.bullet_group = pygame.sprite.Group()
def update(self): self.rect.x += self.speed self.rect.y += self.speed1 if self.rect.x < 0: self.rect.x = 0 elif self.rect.right > SCREEN_RECT.right: self.rect.right = SCREEN_RECT.right if self.rect.y>SCREEN_RECT.height: self.rect.bottom=SCREEN_RECT.height elif self.rect.y<0: self.rect.bottom=0
def fire(self): bullet = Bullet() bullet.rect.bottom = self.rect.y - 20 bullet.rect.centerx = self.rect.centerx self.bullet_group.add(bullet)
小蜜蜂就是英雄,她的功能有两个,一个是移动,另一个是开火。我们在__init__中读取小蜜蜂的图片,设置她的位置。self.rect表示的是包围小蜜蜂的矩形的四个边的坐标值,我们移动小蜜蜂,指的就是移动这些坐标值。移动坐标的值,我们做了一个专门的函数来处理。也就是update。
最后,小蜜蜂还有一个重要的功能就是开火(也就是射箭)。在这个函数中,我们首先要初始化一个子弹(箭),然后设置好这个子弹的位置,最后把这个子弹添加到子弹的精灵组里面。
然后,我们来讲一讲游戏的循环,和所有的游戏一样,这个游戏也是通过快速的帧率变化来展现出连贯的视频的。我们设置一个帧率,然后快速刷新,由于人眼的视觉暂留效应。这样看到的就是一个连续的视频了。
def start_game(self): while True: # 1.设置刷新帧率 self.clock.tick(FRAME_PER_SEC) # 2.事件监听 self.__event_handler() # 3.碰撞检测 self.__check_collide() # 4.更新/绘制精灵组 self.__update_sprites() # 5.更新显示 pygame.display.update()
在游戏中,我们可以将所有的代码简化为4步,分别是,事件监听,也就是查看我们的按键输入,之后移动各种游戏元素。用精灵组的自带功能进行碰撞检测(查看箭有没有碰到瓢虫,瓢虫有没有碰到蜜蜂)。最后更新精灵组(将射中的瓢虫删除,将箭也删除)。最后更新显示我们的界面。
最后,感兴趣的朋友可以先点个收藏+关注,之后有这样好玩的小游戏也可以分享给大家,我这里也整理了一套Python学习路线跟资料,比较适合新手,戳下面名片找小助理领取



