千家信息网

Python干货实战之如何实现八音符酱小游戏

发表于:2024-11-28 作者:千家信息网编辑
千家信息网最后更新 2024年11月28日,这篇文章主要介绍"Python干货实战之如何实现八音符酱小游戏",在日常操作中,相信很多人在Python干货实战之如何实现八音符酱小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
千家信息网最后更新 2024年11月28日Python干货实战之如何实现八音符酱小游戏

这篇文章主要介绍"Python干货实战之如何实现八音符酱小游戏",在日常操作中,相信很多人在Python干货实战之如何实现八音符酱小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python干货实战之如何实现八音符酱小游戏"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • 导语?

  • 正文?

    • ?一、准备中

      • 1.1 游戏规则?

      • 1.2 素材图片?

    • ?二、环境

      • 2.1 小介绍?

      • 2.2 配置环境?

    • ?三、正式敲代码

      • 3.1 定义小黑八音符类:?

      • 3.2 定义block类:?

      • 3.3 实现游戏主循环:?

    • ?四、效果展示


导语?

这款游戏需要操作者发声来控制人物,同时还得掌握好声音的力度...偷偷玩.jpg

操作起来全都靠吼,走位全都靠音调,再多骚操作都无用,小编只能劝告大家,不要在晚上玩,大概会被邻居误会吧~

正文?

?一、准备中

1.1 游戏规则?

不同于以往电脑键盘操作,亦不同于网络手游触屏操作,这款游戏的操作方法竟然是声音。

玩家可以通过调整声音的大小来控制音符酱的跳跃。简单来说。声音越大,音符酱跳的越高。

如果只发出微弱的声音, 音符酱就只会缓慢的移动。是不是超级有意思!

1.2 素材图片?

?二、环境

2.1 小介绍?
Cocos2d模块:

Cocos2d是一个用于构建2D游戏、演示和其他图形/交互应用程序的框架。

它可以在Windows、OSX和Linux上工作,它可以供用python语言编写的应用程序使用。

Pyaudio模块:

Pyaudio库,使用这个可以进行录音,播放,生成wav文件等等。PyAudio 提供了 PortAudio

的 Python 语言版本,这是一个跨平台的音频 I/O 库,使用 PyAudio 你可以在 Python 程

序中播放和录制音频。为PoTaTudio提供Python绑定,跨平台音频I/O库。使用PyAudio,您可

以轻松地使用Python在各种平台上播放和录制音频,例如GNU/Linux、微软Windows和苹果Mac

OS X/MACOS。

2.2 配置环境?

本文涉及环境:Python3、Pycharm、cocos2d模块;pyaudio模块;以及一些Python自带的模块。

模块安装:

pip install +模块名 或带豆瓣镜像源 pip install -i https://pypi.douban.com/simple/ +模块名

?三、正式敲代码

3.1 定义小黑八音符类:?

利用cocos2d模块来定义主角类是一件非常轻松的事情。你只需要继承sprites类,然后告诉sprites

类需要执行什么操作即可。根据八音符的游戏规则,我们赋予小黑跳跃、下降和静止的能力,同

时,我们规定小黑在空中时无法进行跳跃。具体代码如下:

import cocos  '''小黑类'''class Pikachu(cocos.sprite.Sprite):    def __init__(self, imagepath, **kwargs):        super(Pikachu, self).__init__(imagepath)        # 锚点        self.image_anchor = 0, 0        # 初始重置        self.reset(False)        # 更新        self.schedule(self.update)    '''声控跳跃'''    def jump(self, h):        if self.is_able_jump:            self.y += 1            self.speed -= max(min(h, 10), 7)            self.is_able_jump = False    '''着陆后静止'''    def land(self, y):        if self.y > y - 25:            self.is_able_jump = True            self.speed = 0            self.y = y    '''更新(重力下降)'''    def update(self, dt):        self.speed += 10 * dt        self.y -= self.speed        if self.y < -85:            self.reset()    '''重置'''    def reset(self, flag=True):        if flag: self.parent.reset()        # 是否可跳跃        self.is_able_jump = False        # 速度        self.speed = 0        # 位置        self.position = 80, 280
3.2 定义block类:?

初始化界面小黑要有一段站立的地方,对于地面,刚开始的时候先得有一段长点的平地缓冲一下,

让玩家先试试自己的嗓音,然后再随机生成跳跃块,让玩家展示自己的歌喉。

具体代码如下:

import cocosimport random  '''地面块'''class Block(cocos.sprite.Sprite):    def __init__(self, imagepath, position, **kwargs):        super(Block, self).__init__(imagepath)        self.image_anchor = 0, 0        x, y = position        if x == 0:            self.scale_x = 4.5            self.scale_y = 1        else:            self.scale_x = 0.5 + random.random() * 1.5            self.scale_y = min(max(y - 50 + random.random() * 100, 50), 300) / 100.0            self.position = x + 50 + random.random() * 100, 0
3.3 实现游戏主循环:?
import cfgimport cocosimport structfrom modules import *from cocos.sprite import Spritefrom pyaudio import PyAudio, paInt16  '''定义声控游戏类'''class VCGame(cocos.layer.ColorLayer):    def __init__(self):        super(VCGame, self).__init__(255, 255, 255, 255, 800, 600)        # frames_per_buffer        self.num_samples = 1000        # 声控条        self.vbar = Sprite(cfg.BLOCK_IMAGE_PATH)        self.vbar.position = 20, 450        self.vbar.scale_y = 0.1        self.vbar.image_anchor = 0, 0        self.add(self.vbar)        # 皮卡丘        self.pikachu = Pikachu(cfg.PIKACHU_IMAGE_PATH)        self.add(self.pikachu)        # 地面        self.floor = cocos.cocosnode.CocosNode()        self.add(self.floor)        position = 0, 100        for i in range(120):            b = Block(cfg.BLOCK_IMAGE_PATH, position)            self.floor.add(b)            position = b.x + b.width, b.height        # 声音输入        audio = PyAudio()        self.stream = audio.open(format=paInt16, channels=1, rate=int(audio.get_device_info_by_index(0)['defaultSampleRate']), input=True, frames_per_buffer=self.num_samples)        # 屏幕更新        self.schedule(self.update)    '''碰撞检测'''    def collide(self):        diffx = self.pikachu.x - self.floor.x        for b in self.floor.get_children():            if (b.x <= diffx + self.pikachu.width * 0.8) and (diffx + self.pikachu.width * 0.2 <= b.x + b.width):                if self.pikachu.y < b.height:                    self.pikachu.land(b.height)                    break    '''定义游戏规则'''    def update(self, dt):        # 获取每帧的音量        audio_data = self.stream.read(self.num_samples)        k = max(struct.unpack('1000h', audio_data))        self.vbar.scale_x = k / 10000.0        if k > 3000:            self.floor.x -= min((k / 20.0), 150) * dt        # 皮卡丘跳跃        if k > 8000:            self.pikachu.jump((k - 8000) / 1000.0)        # 碰撞检测        self.collide()    '''重置'''    def reset(self):        self.floor.x = 0  '''run'''if __name__ == '__main__':    cocos.director.director.init(caption="xiaohei Go Go Go ")    cocos.director.director.run(cocos.scene.Scene(VCGame()))

?四、效果展示

到此,关于"Python干货实战之如何实现八音符酱小游戏"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0