服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 使用Matlab制作简易版八分音符酱游戏

使用Matlab制作简易版八分音符酱游戏

2022-10-07 16:17slandarer C/C++

八分音符酱作为一款声音控制类游戏,当时还是很受大家的喜爱的。本文将用Matlab制作一款简易版的八分音符酱游戏,感兴趣的可以学习一下

效果

使用Matlab制作简易版八分音符酱游戏

使用Matlab制作简易版八分音符酱游戏

 

游戏方式

给电脑插上耳机后叫喊叭 !

 

说明

1)使用此代码应首先安装:

Audio Toolbox工具箱,博主使用的版本为:

Audio Toolbox 版本 3.0 (R2021a)

2)为保证游戏加载完所有素材后再开始,故设置了加载完成界面后停滞3秒再开始运行游戏

若一进入界面就挂了,应是资源加载太久,请关掉窗口后尝试重新运行

 

工具箱主要部分代码

1)基础设置

这里懒得改了直接照抄的语音命令识别的截断数据,大家可以依据自己需要进行更改:

[audio_t,fs] = audioread('stop_command.flac');
classificationRate = 20;
adr=audioDeviceReader('SampleRate',fs,'SamplesPerFrame',floor(fs/classificationRate));
audioBuffer=dsp.AsyncBuffer(fs);

声音信号绘图:

if ishandle(fig)
  audio_t=adr();
  write(audioBuffer,audio_t);
  audio_y=read(audioBuffer,fs,fs-adr.SamplesPerFrame);
  audio_x=(0:(length(audio_y)-1))./(length(audio_y)-1);
  audioHdl.XData=audio_x;
  audioHdl.YData=audio_y;
end

注意:

代码后必须要进行声音采集设备的释放及timer实类的删除,否则会出现如下提示bug:A given audio device may only be opened once.

即一个设备被开启两次

因此需要设置如下回调避免该情况:

set(gcf,'tag','co','CloseRequestFcn',@clo);
function clo(~,~)
  stop(game)
  delete(game)
  release(adr)
  
  delete(findobj('tag','co'));
  clf,close,clc
end

 

完整代码

function audioGame
%@author:slandarer
%使用工具箱情况:
%Audio Toolbox 版本 3.0 (R2021a)

% figure 创建
fig=figure('Units','normalized','Position',[0.2 0.2 0.6 0.5]);
fig.NumberTitle='off';
fig.MenuBar='none';
fig.Resize='off';
fig.Name='audio Game by slandarer';


% axes_1 创建(主axes)
ax_1=axes(fig);
ax_1.Position=[0 0 1 1];
ax_1.XTick=[];
ax_1.YTick=[];
ax_1.ZTick=[];
ax_1.XLim=[0 600];
ax_1.YLim=[0 200];
hold(ax_1,'on')


% axes_2 创建(声波显示axes创建)
ax_2=axes(fig);
ax_2.Position=[0.7 0.8 0.3 0.2];
ax_2.XTick=[];
ax_2.YTick=[];
ax_2.ZTick=[];
ax_2.XLim=[0 1];
ax_2.YLim=[-1 1];
ax_2.Box='on';
ax_2.LineWidth=2;
ax_2.Color=[250,250,247]./255;
hold(ax_2,'on')


% 绘图函数句柄
groundHdl=fill(ax_1,[0,600,600,0],[0,0,65,65],[0,64,115]./255);
holeHdl_1=fill(ax_1,[0,50,50,0]+500,[0,0,65,65],[1 1 1],'EdgeColor',[1 1 1]);
holeHdl_2=fill(ax_1,[0,50,50,0]+800,[0,0,65,65],[1 1 1],'EdgeColor',[1 1 1]);
holeHdl_3=fill(ax_1,[0,50,50,0]+1100,[0,0,65,65],[1 1 1],'EdgeColor',[1 1 1]);
audioHdl=plot(ax_2,[0,1],[0,0],'Color',[0,64,115]./255);

roleHdl_a=scatter(ax_1,100,95,300,'filled','CData',[0,64,115]./255);
roleHdl_b=fill(ax_1,[-5 0 5]+100,[90,65,90],[0,64,115]./255);

% 基础属性
role.y=0;
role.v=0;
role.a=-2;


% 窗口主要回调=============================================================
[audio_t,fs] = audioread('stop_command.flac');
classificationRate = 20;
adr=audioDeviceReader('SampleRate',fs,'SamplesPerFrame',floor(fs/classificationRate));
audioBuffer=dsp.AsyncBuffer(fs);

pause(3)
fps=20;
game=timer('ExecutionMode','FixedRate','Period',1/fps,'TimerFcn',@audioMainGame);
start(game)

set(gcf,'tag','co','CloseRequestFcn',@clo);
function clo(~,~)
  stop(game)
  delete(game)
  release(adr)
  
  delete(findobj('tag','co'));
  clf,close,clc
end

  function audioMainGame(~,~)
      holeHdl_1.XData=holeHdl_1.XData-5;
      holeHdl_2.XData=holeHdl_2.XData-5;
      holeHdl_3.XData=holeHdl_3.XData-5;
      
      if holeHdl_1.XData(1)<-50,holeHdl_1.XData=holeHdl_1.XData+900;end
      if holeHdl_2.XData(1)<-50,holeHdl_2.XData=holeHdl_2.XData+900;end
      if holeHdl_3.XData(1)<-50,holeHdl_3.XData=holeHdl_3.XData+900;end
      
      if ishandle(fig)
          audio_t=adr();
          write(audioBuffer,audio_t);
          audio_y=read(audioBuffer,fs,fs-adr.SamplesPerFrame);
          audio_x=(0:(length(audio_y)-1))./(length(audio_y)-1);
          audioHdl.XData=audio_x;
          audioHdl.YData=audio_y;
          
          if any(audio_y>0.2)&&role.y>-1&&role.y<1
              role.v=20;
          end
          role.v=role.v+role.a;
          role.v(role.v<-5)=-5;
          role.y=role.y+role.v;
          
          flag1=holeHdl_1.XData(1)<=95&holeHdl_1.XData(2)>=105;
          flag2=holeHdl_2.XData(1)<=95&holeHdl_2.XData(2)>=105;
          flag3=holeHdl_3.XData(1)<=95&holeHdl_3.XData(2)>=105;
          if (~flag1)&&(~flag2)&&(~flag3)
              role.y(role.y<0)=0;
              roleHdl_a.YData=95+role.y;
              roleHdl_b.YData=[90,65,90]+role.y;
          else
              if role.y<=-1
                  stop(game)
                  for i=1:10
                      roleHdl_a.YData=(95+role.y)-i*(65+role.y)/10;
                      roleHdl_b.YData=[90,65,90]+role.y-i*(65+role.y)/10;
                      pause(0.1)
                  end
              else
                  roleHdl_a.YData=95+role.y;
                  roleHdl_b.YData=[90,65,90]+role.y;
              end
          end
      end
      
  end

end

到此这篇关于使用Matlab制作简易版八分音符酱游戏的文章就介绍到这了,更多相关Matlab游戏内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/slandarer/article/details/121059293

延伸 · 阅读

精彩推荐
  • C/C++理解C++编程中的std::function函数封装

    理解C++编程中的std::function函数封装

    这篇文章主要介绍了理解C++编程中的std::function函数封装,std::function是C++11标准中的新特性,需要的朋友可以参考下...

    NSBeidou11462021-03-31
  • C/C++C++冒泡排序及其优化算法

    C++冒泡排序及其优化算法

    这篇文章主要为大家介绍了C++冒泡排序及其优化算法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    笑霸final4542022-03-07
  • C/C++new和malloc的区别深入解析

    new和malloc的区别深入解析

    以下是分别是对new和malloc的区别进行了详细的分析及介绍,需要的朋友可以过来参考下...

    C语言教程网8602020-12-25
  • C/C++C++联合体union用法实例详解

    C++联合体union用法实例详解

    这篇文章主要介绍了C++联合体union用法,较为详细的分析了C++中联合体的概念、实用技巧及相关注意事项,需要的朋友可以参考下...

    巫祝11152021-02-26
  • C/C++浅谈C++继承中的名字查找

    浅谈C++继承中的名字查找

    下面小编就为大家带来一篇浅谈C++继承中的名字查找。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网8492021-04-27
  • C/C++C++ OpenCV模拟实现微信跳一跳

    C++ OpenCV模拟实现微信跳一跳

    这篇文章主要介绍了使用C++和OpenCV模拟实现微信跳一跳功能,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以...

    大千小熊4352022-07-16
  • C/C++C++实现井字棋游戏

    C++实现井字棋游戏

    这篇文章主要为大家详细介绍了C++实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    L...P4802021-09-18
  • C/C++详谈c++11 final与override说明符

    详谈c++11 final与override说明符

    下面小编就为大家带来一篇详谈c++11 final与override说明符。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网9042021-04-27