千家信息网

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

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍"如何使用Matlab制作简易版八分音符酱游戏"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"如何使用Matlab制作简易版八分音符酱游戏"文章
千家信息网最后更新 2025年11月13日如何使用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,clcend

完整代码

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,clcend    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            endend

关于"如何使用Matlab制作简易版八分音符酱游戏"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0