使用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遊戲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!