使用Matlab制作簡易版八分音符醬游戲
效果


游戲方式
給電腦插上耳機后叫喊叭 !
說明
1)使用此代碼應首先安裝:
Audio Toolbox工具箱,博主使用的版本為:
Audio Toolbox 版本 3.0 (R2021a)
2)為保證游戲加載完所有素材后再開始,故設置了加載完成界面后停滯3秒再開始運行游戲
若一進入界面就掛了,應是資源加載太久,請關(guān)掉窗口后嘗試重新運行
工具箱主要部分代碼
1)基礎設置
這里懶得改了直接照抄的語音命令識別的截斷數(shù)據(jù),大家可以依據(jù)自己需要進行更改:
[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實類的刪除,否則會出現(xiàn)如下提示bug:A given audio device may only be opened once.
即一個設備被開啟兩次
因此需要設置如下回調(diào)避免該情況:
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 創(chuàng)建
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 創(chuàng)建(主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 創(chuàng)建(聲波顯示axes創(chuàng)建)
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')
% 繪圖函數(shù)句柄
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;
% 窗口主要回調(diào)=============================================================
[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
到此這篇關(guān)于使用Matlab制作簡易版八分音符醬游戲的文章就介紹到這了,更多相關(guān)Matlab游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談C++ Explicit Constructors(顯式構(gòu)造函數(shù))
下面小編就為大家?guī)硪黄獪\談C++ Explicit Constructors(顯式構(gòu)造函數(shù))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C語言中的內(nèi)存管理之掌握動態(tài)分配的技巧(最新推薦)
在C語言編程中,內(nèi)存管理是一項至關(guān)重要的技能,它直接關(guān)系到程序的性能和穩(wěn)定性,特別是在處理大型數(shù)據(jù)集或需要靈活內(nèi)存布局的場景下,本文將深入探討C語言中的動態(tài)內(nèi)存分配技巧,幫助開發(fā)者更好地掌握這一核心技能2025-03-03

