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正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
详细介绍Python的鸭子类型
Sep 12 Python
python if not in 多条件判断代码
Sep 21 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
python中 chr unichr ord函数的实例详解
Aug 06 Python
python的多重继承的理解
Aug 06 Python
Python及PyCharm下载与安装教程
Nov 18 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
Python+OpenCV感兴趣区域ROI提取方法
Jan 10 Python
Python 中Django验证码功能的实现代码
Jun 20 Python
Python如何对齐字符串
Jul 30 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 #Python
python实现简单石头剪刀布游戏
Python 数据结构之十大经典排序算法一文通关
Python 的 sum() Pythonic 的求和方法详细
Oct 16 #Python
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶
Python实现老照片修复之上色小技巧
You might like
强烈声明: 不要使用(include/require)_once
2013/06/06 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
php str_replace替换指定次数的方法详解
2017/05/05 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
jQuery点击头像上传并预览图片
2017/02/23 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
python多重继承新算法C3介绍
2014/09/28 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
Python的Django框架中自定义模版标签的示例
2015/07/20 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
python3编写ThinkPHP命令执行Getshell的方法
2019/02/26 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
python Protobuf定义消息类型知识点讲解
2021/03/02 Python
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
创意爱尔兰礼物:Creative Irish Gifts
2020/01/29 全球购物
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
公司年夜饭通知
2015/04/25 职场文书
欠条格式范本
2015/07/03 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
css中有哪些方式可以隐藏页面元素及区别
2022/06/16 HTML / CSS
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python