網(wǎng)站首頁 編程語言 正文
效果
游戲方式
給電腦插上耳機(jī)后叫喊叭 !
說明
1)使用此代碼應(yīng)首先安裝:
Audio Toolbox工具箱,博主使用的版本為:
Audio Toolbox 版本 3.0 (R2021a)
2)為保證游戲加載完所有素材后再開始,故設(shè)置了加載完成界面后停滯3秒再開始運(yùn)行游戲
若一進(jìn)入界面就掛了,應(yīng)是資源加載太久,請(qǐng)關(guān)掉窗口后嘗試重新運(yùn)行
工具箱主要部分代碼
1)基礎(chǔ)設(shè)置
這里懶得改了直接照抄的語音命令識(shí)別的截?cái)鄶?shù)據(jù),大家可以依據(jù)自己需要進(jìn)行更改:
[audio_t,fs] = audioread('stop_command.flac'); classificationRate = 20; adr=audioDeviceReader('SampleRate',fs,'SamplesPerFrame',floor(fs/classificationRate)); audioBuffer=dsp.AsyncBuffer(fs);
聲音信號(hào)繪圖:
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
注意:
代碼后必須要進(jìn)行聲音采集設(shè)備的釋放及timer實(shí)類的刪除,否則會(huì)出現(xiàn)如下提示bug:A given audio device may only be opened once.
即一個(gè)設(shè)備被開啟兩次
因此需要設(shè)置如下回調(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); % 基礎(chǔ)屬性 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
原文鏈接:https://blog.csdn.net/slandarer/article/details/121059293
相關(guān)推薦
- 2022-08-21 Python?Map函數(shù)保姆級(jí)使用教程_python
- 2022-05-27 python繪制棉棒圖的方法詳解_python
- 2022-03-19 Go?語言的?:=的具體使用_Golang
- 2022-07-07 python中的format是什么意思,format怎么用_python
- 2023-10-11 nginx:connect() failed (111: Connection refused) w
- 2022-12-19 QT實(shí)現(xiàn)自定義Http客戶端的示例代碼_C 語言
- 2022-06-01 基于Android實(shí)現(xiàn)可滾動(dòng)的環(huán)形菜單效果_Android
- 2022-07-11 python連接clickhouse的端口問題及解決_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支