作者:玻璃小屋

前言

关注了一下小游戏排行榜,发现了榜单前20中有一款音乐游戏,而且占榜时间挺长的了。作为小白的我花了一周时间研究了一下,出了个demo,并将自己的心得整理出来与大家共同进步。


效果展示

先看一下效果:
视频链接

注:大家可以点击上边的视频连接观看,或者浏览器输入https://www.bilibili.com/video/BV1xK411T7pX/进行观看


正文

1.音乐

在开是做之前首先需要确定一点,音乐与游戏的结合,到底应该怎样将音乐的节奏感体现到游戏中,也就是如何将音乐进行处理解析,得到自己想要的数据。

在明确了目标之后,开始查资料。

第一个看到的文章:打代码这么累,来首Believer放松下!Cocos3D!,效果很震撼,而且同样也是Creator3D做的,所以自己也充满了信心可以做出来。尝试着使用文章中的方法自己写了一下,好像只支持部分浏览器,小游戏平台是不能运行的。

继续接着查资料,但是在接下来的查找资料过程中并不是很顺利,没有找到相关的例子,资料以及js相关的音效处理库,所以立马将在游戏内部处理解析音效的方法排除,转换思路,在游戏外部处理音乐,等到想要的数据,配置为关卡信息,然后在游戏内部进行读取显示。

librosa librosa链接

确定好新思路立马开始着手,因为自己自学了一点python基础,所以第一时间想到了这个功能强大的语言,而且很容易就找到了自己想要的东西

librosa

librosa是一个非常强大的python语音信号处理的第三方库,功能强大,具体有多强大大家可以自己上网查一下,在这里我只将基础的,或者用到的写一下

  • 读取音频
path:音乐文件路径
y, sr = librosa.load(path)
y:音频时间序列
sr:音频的采样率
  • 获取音频的时长
path:音乐文件路径
#获取音乐时间
musicTimer=librosa.get_duration(filename=path)
#将时间转化为帧数
musicFrame=librosa.time_to_frames(musicTimer)注:时间转化为帧数,得到的帧数不一定是按照每秒60帧计算的。
  • 获取节拍信息
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)
tempo 估计的整体速度(以每分钟对应的节拍数)
beat_frames:获取的每个拍子相对应的帧数
  • 获取音乐峰值对应的帧索引


在上边的图中会发现,每一段都会出现一个相对最高的点,这就是峰值,也是咱们游戏中需要用到的重要数据

获取音乐峰值对应的帧索引(得到的是一个组帧索引)
onset_env = librosa.onset.onset_strength(y=y, sr=sr,hop_length=512,aggregate=np.median)
对获取的峰值对用的帧索引数据进行处理选择,等的想要的数据
peaks = librosa.util.peak_pick(onset_env, 3, 3,3, 5, 0.5, 12)
#将帧索引转化为时间
peaks_to_timer= librosa.frames_to_time(peaks, sr=sr)
peaks_to_timer为获取的音乐中经过处理删选的一组数据,数据中记录了每个峰值对应的音乐播放时间点(单位秒)

整个python脚本代码:

#coding=utf-8
import librosa
import os
import json
import numpy as npdef save_data(data):f=open("level.json","w")f.write(json.dumps(data)+",")f.close()def analysis(nameKey,path,configJosn):y, sr = librosa.load(path)tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)#获取音乐时间musicTimer=librosa.get_duration(filename=path)#将时间转化为帧数musicFrame=librosa.time_to_frames(musicTimer)#获取每个节拍平均相隔几帧   每首歌的节拍是大概固定的beatsDis=musicFrame/len(beat_frames)# 峰值点 帧数onset_env = librosa.onset.onset_strength(y=y, sr=sr,hop_length=512,aggregate=np.median)peaks = librosa.util.peak_pick(onset_env, 3, 3,3, 5, 0.5, 12)peaks_to_timer= librosa.frames_to_time(peaks, sr=sr)dataStr="[0,"for item in peaks_to_timer:dataStr=dataStr+str(item)+","dataStr=dataStr[:len(dataStr)-1]dataStr=dataStr+"]"json={}json["timer"]=musicTimer# json["amp"]=ampStrjson["rhythm"]=dataStrconfigJosn[nameKey]=jsondef getFileList(configJosn):audioList = os.listdir('music')for tmp in audioList:audioPath = os.path.join('music', tmp)if audioPath.endswith('.mp3'):name=tmp[:tmp.find('.mp3')]print("print "+audioPath+" audio datas----")analysis(name,audioPath,configJosn)
if __name__=="__main__":configJosn={}getFileList(configJosn)save_data(configJosn)

得到的数据结构

{"1_0": {"timer": 83.0,"rhythm": "[0,0.2786394557823129,0.5804988662131519,.....]"},"1_1": {"timer": 89.6,"rhythm": "[0,0.2786394557823129,0.5804988662131519,.....]"},"1_2": {"timer": 60.9,"rhythm": "[0,0.2786394557823129,0.5804988662131519,.....]"}
}

ok了,关卡信息完毕,对我来说难点问题已经解决。

相关使用以文档和API为主,librosa API文档 大家有啥不懂的可以在文档中查找

2.游戏功能实现

通过上边的功能,我们已近在游戏外部获取到了音乐的相关时间以及峰值信息

接下来只需要在游戏逻辑中根据跳台的尺寸大小,玩家的移动速度以及每个峰值对应的音乐播放时间去设置跳台的位置和调整摄像机等其他属性

demo链接:https://gitee.com/carlosyzy/Creator3D_MusicBall.git

3.微信公众号:搬砖小菜鸟

4.推荐

Creator3D:炫动球球(音乐游戏)实现分享相关推荐

  1. 给自己的博客网站加上酷炫的初音未来音乐游戏?

    先前在某个Q群里有位网友发了个链接,一点进去,发现是个极度让人耳目一新的初音未来音乐网页游戏. 为了让有幸看到这篇文章的看官也来体会下本人第一次玩时的激动,抛个链接--乐柔嘴巴.链接的具体地址是blo ...

  2. java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​ 坐标.大小.颜色.方向.速度 2.抽象类:Ball ​ 设计类:BallMain-创建窗体 ​ BallJPanel- ...

  3. 《球球大作战》游戏优化之路(下)

    演讲内容 大家好,我叫徐宇峰,负责<球球大作战>的性能优化. <球球大作战>现在拥有五亿多的玩家,为了吸引如此庞大的玩家群体,我们提供给玩家更炫更酷的皮肤,这些美轮美奂的皮肤, ...

  4. 《球球大作战》游戏优化之路(上)

    自从2015年<球球大作战>发布以来,现已拥有五亿多的玩家.如此庞大的玩家群体,对游戏的画面,性能要求是非常高的.在Unite Shanghai 2019大会中,<球球大作战> ...

  5. java做小窗体_java实现简单窗体小游戏----球球大作战

    java实现简单窗体小游戏----球球大作战 需求分析 1.分析小球的属性: ​坐标.大小.颜色.方向.速度 2.抽象类:Ball ​设计类:BallMain-创建窗体 ​BallJPanel-画小球 ...

  6. java欢乐球球_微信小游戏《欢乐球球》有哪些高分技巧?

    刚跳到5151的人来答题ヘ( ̄ω ̄ヘ)♪ 放上今日排行榜(* ̄︶ ̄) [回答的最后补了刚录的一小段视频] 一.一次尽可能落好几层,越多越好 欢乐球球的分数是累加的.举例,如果一次下落三层,得到1+2+ ...

  7. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5

    3D球闯关游戏是一款让人上瘾的球球跳跃闯关游戏,在音轨上不断跳跃,控制球球顺利到达终点,玩家需要在曼妙的背景音乐下找到自己的闯关节奏,大家只有找到了节奏才能更轻松的完成挑战,轻松点击球球就可以让它不断 ...

  8. 用scratch实现网上游戏“球球情侣2”

    网上有个"球球情侣2"的游戏,游戏中有两个不同颜色的球,玩者首先用鼠标画线画出球移动的路,分别单击两个球,使两球沿线移动,如果两球碰到一起,进入下一关.外孙女喜欢这个游戏,也想用s ...

  9. C++ 小游戏-球球飞车

    C++ 小游戏-球球飞车 功能实现 地图随机生成 彩色界面打印 按键检测 存档 商店 运行截图 核心代码展示 地图生成: void rand_map(int a,int pd) {srand(time ...

  10. 最新最酷Android手机游戏灵活的球球代码

    ********休闲娱乐灵活球球小游戏******** ==========================================我是分割线========================= ...

最新文章

  1. 惊艳!为艺术而生的算法
  2. 每日一皮:据说这是很多公司的办事流程
  3. 在计算机桌面怎么找打印机,win10系统电脑打印机图标找回来的教程
  4. 【 POJ - 2033 】Alphacode (dp,有坑)
  5. Redis学习笔记之Redis的对象
  6. linux下执行shell修改用户密码,[转] 关于linux下通过shell命令(自动)修改用户密码...
  7. 2022年1月国产数据库排行榜:TiDB霸榜两年势头不减,openGauss与OceanBase分数大涨...
  8. 通过Discuz!搭建一个主题社区
  9. VIm中Python自动补全插件Pydiction
  10. 数据分析sql面试必会6题经典_经典SQL面试题及答案分析
  11. Foobar2000是一款完全可定制的音乐播放器
  12. 适配器模式(Adapter模式)
  13. 日版iphone5 SB 配合REBELiOS卡贴破解电信3G步骤
  14. m 序列性质的简单证明
  15. html当当书网站 html网上在线书城 html在线小说书籍网页 当当书城网页设计
  16. git clone之报错git@gitee.com: Permission denied (publickey).fatal: Could not read from remote repositor
  17. python语言的变量_自兴人工智能------Python语言的变量认识及操作
  18. 数理统计——描述统计与Python实现
  19. 巧用千寻位置GNSS软件|CAD功能全解析
  20. 神经网络知识点汇总——FNN

热门文章

  1. 平面设计计算机基本配置,2017平面设计使用的电脑配置
  2. 将中文版pycharm改成英文版
  3. sql2016/2017 卸载安装
  4. 22数学建模美赛 22美赛C题
  5. 数据结构算法设计题汇总
  6. Delphi入门教程
  7. 《Doom启示录》(1-13)
  8. tftp上传下载命令
  9. EXTJS4.0视频教程(网盘下载)
  10. SQL 2008下载安装及问题解决