Python游戏编程之旅(9):嗷大喵快跑小游戏开发实例
admin
2023-07-31 00:46:38
0

本系列博客介绍以python+pygame库进行小游戏的开发。有写的不对之处还望各位海涵。

前几期博客我们一起学习了,pygame中的冲突检测技术以及一些常用的数据结构。

这次我们来一起做一个简单的酷跑类游戏综合运用以前学到的知识。

程序下载地址:http://yunpan.cn/cLIcJgTvq4tZS 访问密码 901f

源代码网盘地址:http://yunpan.cn/cLIc67S4nNRFY 访问密码 c139

github地址:https://github.com/XINCGer/catRunFast

效果图:

现在我们来分析一下制作流程:

游戏中一共有嗷大喵,恶龙,火焰,爆炸动画和果实(就是上方蓝色的矩形块)这几种精灵。这里我们使用到了前几期博客中的MyLibrary.py。上述这几个精灵都是 MySprite类实例化的对象。

为了方便管理。我们建立了几个精灵组,并且将一些精灵塞到了里面:

123456789101112131415161718192021222324 #创建精灵组group = pygame.sprite.Group()group_exp = pygame.sprite.Group()group_fruit = pygame.sprite.Group()#创建怪物精灵dragon = MySprite()dragon.load(\”dragon.png\”, 260, 150, 3)dragon.position = 100, 230group.add(dragon) #创建爆炸动画explosion = MySprite()explosion.load(\”explosion.png\”,128,128,6)#创建玩家精灵player = MySprite()player.load(\”sprite.png\”, 100, 100, 4)player.position = 400, 270group.add(player) #创建子弹精灵arrow = MySprite()arrow.load(\”flame.png\”, 40, 16, 1)arrow.position = 800,320group.add(arrow)

在程序开始的时候我们可以看到有一个欢迎界面,为了简单我这里是直接在ps里面做好了图片,然后加载到程序中的:

1 interface = pygame.image.load(\”interface.png\”)

界面上面还有一个按钮,当鼠标经过的时候,会变成灰底的,因此我们设计一个button类:

简单来说就是预先加载一张正常状态下在的button图片和一个按下状态的button图片,然后判断鼠标的pos是否和button的位置有重合,如果有则显示button被按下时的图片。

关于button的设计我参考了这位博友的教程:http://www.cnblogs.com/SRL-Southern/p/4949624.html,他的教程写的非常不错。

123456789101112131415161718192021222324252627282930313233 #定义一个按钮类class Button(object):    def __init__(self, upimage, downimage,position):        self.imageUp = pygame.image.load(upimage).convert_alpha()        self.imageDown = pygame.image.load(downimage).convert_alpha()        self.position = position        self.game_start = False            def isOver(self):        point_x,point_y = pygame.mouse.get_pos()        x, y = self. position        w, h = self.imageUp.get_size()         in_x = x w/2 < point_x < x + w/2        in_y = y h/2 < point_y < y + h/2        return in_x and in_y     def render(self):        w, h = self.imageUp.get_size()        x, y = self.position                if self.isOver():            screen.blit(self.imageDown, (xw/2,yh/2))        else:            screen.blit(self.imageUp, (xw/2, yh/2))    def is_start(self):        if self.isOver():            b1,b2,b3 = pygame.mouse.get_pressed()            if b1 == 1:                self.game_start = True                bg_sound.play_pause()                btn_sound.play_sound()                bg_sound.play_sound()

可以看到这个button类里面我还添加了一个isStart的方法,他是用来判断是否开始游戏的。当鼠标的位置与button重合,且按下鼠标左键的时候,游戏就开始。

(将game_start变量置为True)然后通过btn_sound.play_sound(),bg_sound.play_sound() 这两句来播放按钮被按下的声音和游戏的背景音乐。

关于pygame中声音的操作,我稍后介绍一下。

可以看到程序中还有一个不停滚动的地图,让我们来实现这个滚动地图类:

1234567891011121314151617 #定义一个滚动地图类class MyMap(pygame.sprite.Sprite):        def __init__(self,x,y):        self.x = x        self.y = y        self.bg = pygame.image.load(\”background.png\”).convert_alpha()    def map_rolling(self):        if self.x < 600:            self.x = 600        else:            self.x -=5    def map_update(self):        screen.blit(self.bg, (self.x,self.y))    def set_pos(x,y):        self.x =x        self.y =y

创建两个地图对象:

123 #创建地图对象bg1 = MyMap(0,0)bg2 = MyMap(600,0)

在程序中直接调用update和rolling方法就可以让地图无限的滚动起来了。

1234 bg1.map_update()bg2.map_update()bg1.map_rolling()bg2.map_rolling()

你看明白这个无限滚动地图是如何工作的了吗。首先渲染两张地图背景,一张展示在屏幕上面,一张在屏幕之外预备着(我们暂时看不到),如下图所示:

然后两张地图一起以相同的速度向左移动:

当地图1完全离开屏幕范围的时候,再次将它的坐标置为600,0(这样就又回到了状态1):

这样通过两张图片的不断颠倒位置,然后平移,在我们的视觉中就形成了一张不断滚动的地图了。

下面介绍一下如何在pygame中加载并且使用声音:

1.初始化音频模块:

我们要使用的音频系统包含在了pygame的pygame.mixer模块里面。因此在使用音频之前要初始化这个模块:

1 pygame.mixer.init()

这个初始化模块语句在程序中执行一次就好。

2.加载音频文件:

使用的是pygame.mixer.Sound类来加载和管理音频文件,pygame支持两种音频文件:未压缩的WAV和OGG音频文件,如果要播放长时间的音乐,我推荐你使用OGG格式音频文件,因为它的体积比较小,适合长时间的加载和播放。当你要播放比较短的音频的时候可以选择WAV。

1 hit_au = pygame.mixer.Sound(\”exlposion.wav\”)

3.播放音乐:

上面的pygame.mixer.Sound函数返回了一个sound对象,我们可以使用play和stop方法来播放和停止播放音乐。

但是这里我们介绍一种更为高级的用法,使用pygame.mixer.Channel,这个类提供了比sound对象更为丰富的功能。

首先我们先申请一个可用的音频频道:

1 channel = pygame.mixer.find_channel(True)

一旦有了频道之后我们就可以使用Channel.play()方法来播放一个sound对象了。

相关内容

热门资讯

500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...