广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >使用Matlab制作简易版八分音符酱游戏
  • 868
分享到

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

2024-04-02 19:04:59 868人浏览 泡泡鱼
摘要

目录效果游戏方式说明工具箱主要部分代码完整代码效果 游戏方式 给电脑插上耳机后叫喊叭 ! 说明 1)使用此代码应首先安装: Audio Toolbox工具箱,博主使用的版本为:

效果

游戏方式

给电脑插上耳机后叫喊叭 !

说明

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游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用Matlab制作简易版八分音符酱游戏

本文链接: https://www.lsjlt.com/news/140507.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Matlab制作简易版八分音符酱游戏
    目录效果游戏方式说明工具箱主要部分代码完整代码效果 游戏方式 给电脑插上耳机后叫喊叭 ! 说明 1)使用此代码应首先安装: Audio Toolbox工具箱,博主使用的版本为: ...
    99+
    2022-11-13
  • 如何使用Matlab制作简易版八分音符酱游戏
    这篇文章主要介绍“如何使用Matlab制作简易版八分音符酱游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用Matlab制作简易版八分音符酱游戏”文章能帮助大家解决问题。效果游戏方式给电脑插...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作