Python干货实战之八音符酱小游戏全过程详解
作者:顾木子吖 发布时间:2021-08-20 11:21:27
导语🎼
嗨,大宝贝们,又到周末啦,今天你放假了嘛?
周末的日子总是无所事事,无所事事。一直在想做什么游戏,给大家来点儿新鲜感,这不?
玩游戏、找游戏、找素材、写代码,大家听说过这个游戏嘛?
声控2D动作小游戏它的名字叫做《不要停下来!八分音符酱♪》!
今天就来给大家肝一个仿八音符小游戏!
这款游戏需要操作者发声来控制人物,同时还得掌握好声音的力度...偷偷玩.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 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()))
🎵四、效果展示
总结🎼
今天的木木子呢,也试玩了一下这个八分音符酱,因为是实在害怕同事会打我,所以就回家录了一下。没能通关,也没办法这个游戏实在不是我能驾驭的,玩了几局嗓子就要开始冒烟了~在这提醒好奇心比较强的宝宝们,一定不要在宿舍,夜晚,玩这个声控小游戏。否则,真的可能会被打!!
好啦,到这里就结束了,想玩的小伙伴儿可以偷偷在家里玩儿,记得小声点儿哈~🤫
来源:https://blog.csdn.net/weixin_55822277/article/details/120919888
猜你喜欢
- 本文实例讲述了Python3实现获取图片文字里中文的方法。分享给大家供大家参考,具体如下:一、运行环境(1) win10(2) pychar
- li {list-style-image: url(images/disc.gif);}li的这个样式定义是将列表项目使用图片来代替显示的小
- 很多时候,由于程序设计需要,要求在asp的include包含文件里调用动态的文件。如<!--#include file=&q
- python路径拼接使用:os.path.join()函数:连接两个或更多的路径名组件如果有一个组件是一个绝对路径,则在它之前的所有组件均会
- 這兩天﹐對xml作為數據庫產生了興趣﹐找了一些資料﹐也搞出了一點眉目﹐在這里記錄一下。算是對自己學習x
- 最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理。首先贴出网上找来的读
- 在SQL Server 2005中,它的另外一个强大的新特点是数据库快照。数据库快照是一个数据库的只读副本,它是数据库所有数据的映射,由快照
- 本文实例讲述了python实现的系统实用log类。分享给大家供大家参考。具体如下:每个系统都必不可少会需要一个log类,方便了解系统的运行状
- 目录selenium模块selenium基本概念基本使用基于浏览器自动化的操作selenium处理iframe:selenium模拟登陆QQ
- 本文实例借鉴mvc模式,核心数据为model,维护1个矩阵,0表无雷,1表雷,-1表已经检测过。本例使用python的tkinter做gui
- 内容摘要:ASP开发人员为了在他们的设计项目中获得更好的性能和可扩展性而不断努力。幸运地是,有许多书籍和站点在这方面提供了很好的建议。但是这
- 目标是想把在服务器上用pytorch训练好的模型转换为可以在移动端运行的tflite模型。最直接的思路是想把pytorch模型转换为tens
- 先学会文件的读写!比如像以前在学校读书的时候,第一门编程课设计要求是制作学生管理系统。这就需要使用文件来处理(也可以用数据库,但是一般C语言
- 提起Apple,大部分人都会提起Apple的设计,除了Apple里拥有一批天才设计师外,还因为乔布斯对于设计有着苛刻的要求。所以在IT界,A
- 1、关于参数的区别实例方法:定义实例方法是最少有一个形参 ---> 实例对象,通常用 self类方法:定义类方法的时候最少有一个形参
- 本教程为大家分享了Pycharm及Python安装的详细步骤,供大家参考,具体内容如下第一步:安装python1 首先进入网站下载:点击打开
- 如下所示:'''Created on 2018-4-20例子:每天凌晨3点执行func方法''
- 前言文接上回,我们已经使用gojs实现了一个最最最基本的树形布局。这次我们开始对图形的骨架进行一个内容展示上的丰富和显示风格上的美化。可以说
- 身体是革命的本钱,身体健康了我们才有更多精力做自己想做的事情,追求女神,追求梦想。然而程序员是一个苦比的职业,大部分时间都对着电脑,我现在颈
- 以titanic数据集为例。其中name列是字符串,现在想从其中提取title作为新的一列。例如:# create new Title co