Python干货实战之八音符酱小游戏全过程详解


Posted in Python onOctober 24, 2021

导语?

Python干货实战之八音符酱小游戏全过程详解

嗨,大宝贝们,又到周末啦,今天你放假了嘛?

周末的日子总是无所事事,无所事事。一直在想做什么游戏,给大家来点儿新鲜感,这不?

玩游戏、找游戏、找素材、写代码,大家听说过这个游戏嘛?

声控2D动作小游戏它的名字叫做《不要停下来!八分音符酱♪》!

今天就来给大家肝一个仿八音符小游戏!

Python干货实战之八音符酱小游戏全过程详解

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

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

Python干货实战之八音符酱小游戏全过程详解

Python干货实战之八音符酱小游戏全过程详解

正文?

Python干货实战之八音符酱小游戏全过程详解

?一、准备中

1.1 游戏规则?

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

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

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

1.2 素材图片?

Python干货实战之八音符酱小游戏全过程详解

?二、环境

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 cocos
import 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 cfg
import cocos
import struct
from modules import *
from cocos.sprite import Sprite
from 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干货实战之八音符酱小游戏全过程详解

总结?

Python干货实战之八音符酱小游戏全过程详解

今天的木木子呢,也试玩了一下这个八分音符酱,因为是实在害怕同事会打我,所以就回家录了一下。没能通关,也没办法这个游戏实在不是我能驾驭的,玩了几局嗓子就要开始冒烟了~在这提醒好奇心比较强的宝宝们,一定不要在宿舍,夜晚,玩这个声控小游戏。否则,真的可能会被打!!

好啦,到这里就结束了,想玩的小伙伴儿可以偷偷在家里玩儿,记得小声点儿哈~?

到此这篇关于Python干货实战之八音符酱小游戏全过程详解的文章就介绍到这了,更多相关Python 小游戏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python实现博客文章爬虫示例
Feb 26 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
Apr 17 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
Aug 04 Python
python提取xml里面的链接源码详解
Oct 15 Python
PyCharm下载和安装详细步骤
Dec 17 Python
Python安装与卸载流程详细步骤(图解)
Feb 20 Python
pytorch之Resize()函数具体使用详解
Feb 27 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 #Python
python实现简单石头剪刀布游戏
Python 数据结构之十大经典排序算法一文通关
Python 的 sum() Pythonic 的求和方法详细
Oct 16 #Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Python实现老照片修复之上色小技巧
You might like
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
PHP 实例化类的一点摘记
2008/03/23 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
php中字符串和整数比较的操作方法
2019/06/06 PHP
PHP 实现重载
2021/03/09 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
2013/04/02 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
js实现数组冒泡排序、快速排序原理
2016/03/08 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
基于JQuery的购物车添加删除以及结算功能示例
2017/03/08 Javascript
详解Vue 开发模式下跨域问题
2017/06/06 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
通过angular CDK实现页面元素拖放的步骤详解
2020/07/01 Javascript
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
异步传递消息系统的作用
2016/05/01 面试题
采购求职信
2014/03/17 职场文书
体现团队精神的口号
2014/06/06 职场文书
研究生给导师的自荐信
2015/03/06 职场文书