網站首頁 編程語言 正文
效果
游戲方式
給電腦插上耳機后叫喊叭 !
說明
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
原文鏈接:https://blog.csdn.net/slandarer/article/details/121059293
相關推薦
- 2022-07-01 python讀取nc數據并繪圖的方法實例_python
- 2021-12-09 C++中的編譯與鏈接_C 語言
- 2022-12-12 python字符串中兩個大括號{{}}的使用及說明_python
- 2022-05-17 基于Pytorch的神經網絡之Regression的實現_python
- 2022-12-29 Android動態加載布局實現技巧介紹_Android
- 2022-04-28 oracle重置序列從0開始遞增1_oracle
- 2022-06-23 QT實現簡單計算器功能_C 語言
- 2022-11-08 Python?Pandas教程之series?上的轉換操作_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支