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中break语句的用法
May 14 Python
python异常和文件处理机制详解
Jul 19 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
django 修改server端口号的方法
May 14 Python
Python3使用pandas模块读写excel操作示例
Jul 03 Python
Sanic框架请求与响应实例分析
Jul 16 Python
Python中的元组介绍
Jan 28 Python
pytorch模型存储的2种实现方法
Feb 14 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
Mar 10 Python
python用opencv 图像傅里叶变换
Jan 04 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
一文搞懂Python Sklearn库使用
Aug 23 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 #Python
python实现简单石头剪刀布游戏
Python 数据结构之十大经典排序算法一文通关
Python 的 sum() Pythonic 的求和方法详细
Oct 16 #Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Python实现老照片修复之上色小技巧
You might like
JSON在PHP中的应用介绍
2012/09/08 PHP
php堆排序(heapsort)练习
2013/11/13 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
用jscript实现列出安装的软件列表
2007/06/18 Javascript
Javascript base64编码实现代码
2011/12/02 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
2013/11/18 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
javascript原型模式用法实例详解
2015/06/04 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
js+css实现回到顶部按钮(back to top)
2016/03/02 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
Angular 如何使用第三方库的方法
2018/04/18 Javascript
vue 纯js监听滚动条到底部的实例讲解
2018/09/03 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
express.js中间件说明详解
2019/03/19 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
逃课上网检讨书
2014/02/20 职场文书
永远跟党走演讲稿
2014/09/12 职场文书
降价通知函
2015/04/23 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
2015暑期社会实践调查报告
2015/07/14 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python