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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
Python中的is和id用法分析
Jan 26 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
解决Python3.5+OpenCV3.2读取图像的问题
Dec 05 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
Django框架用户注销功能实现方法分析
May 28 Python
Django结合ajax进行页面实时更新的例子
Aug 12 Python
python list转置和前后反转的例子
Aug 26 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
python 回溯法模板详解
Feb 26 Python
Python数据分析入门之数据读取与存储
May 13 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 #Python
python实现简单石头剪刀布游戏
Python 数据结构之十大经典排序算法一文通关
Python 的 sum() Pythonic 的求和方法详细
Oct 16 #Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Python实现老照片修复之上色小技巧
You might like
php 按指定元素值去除数组元素的实现方法
2011/11/04 PHP
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
JQuery 拾色器插件发布-jquery.icolor.js
2010/10/20 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
Extjs中的GridPanel隐藏列会显示在menuDisabled中解决方法
2013/01/27 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
jquery单行文字向上滚动效果示例
2014/03/06 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
Vue无限滑动周选择日期的组件的示例代码
2018/07/18 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
2019/05/23 Python
Python类中方法getitem和getattr详解
2019/08/30 Python
Django通过json格式收集主机信息
2020/05/29 Python
linux面试题参考答案(2)
2015/12/06 面试题
优秀员工获奖感言
2014/03/01 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技