广告位联系
返回顶部
分享到

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

C语言 来源:互联网 作者:秩名 发布时间:2022-02-25 14:05:56 人浏览
摘要

效果 游戏方式 给电脑插上耳机后叫喊叭 ! 说明 1)使用此代码应首先安装: Audio Toolbox工具箱,博主使用的版本为: Audio Toolbox 版本 3.0 (R2021a) 2)为保证游戏加载完所有素材后再开始,故

效果

游戏方式

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

说明

1)使用此代码应首先安装:

Audio Toolbox工具箱,博主使用的版本为:

Audio Toolbox 版本 3.0 (R2021a)

2)为保证游戏加载完所有素材后再开始,故设置了加载完成界面后停滞3秒再开始运行游戏

若一进入界面就挂了,应是资源加载太久,请关掉窗口后尝试重新运行

工具箱主要部分代码

1)基础设置

这里懒得改了直接照抄的语音命令识别的截断数据,大家可以依据自己需要进行更改:

1

2

3

4

[audio_t,fs] = audioread('stop_command.flac');

classificationRate = 20;

adr=audioDeviceReader('SampleRate',fs,'SamplesPerFrame',floor(fs/classificationRate));

audioBuffer=dsp.AsyncBuffer(fs);

声音信号绘图:

1

2

3

4

5

6

7

8

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.

即一个设备被开启两次

因此需要设置如下回调避免该情况:

1

2

3

4

5

6

7

8

9

set(gcf,'tag','co','CloseRequestFcn',@clo);

function clo(~,~)

    stop(game)

    delete(game)

    release(adr)

     

    delete(findobj('tag','co'));

    clf,close,clc

end

完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/slandarer/article/details/121059293
相关文章
  • C++中类的六大默认成员函数的介绍

    C++中类的六大默认成员函数的介绍
    一、类的默认成员函数 二、构造函数Date(形参列表) 构造函数主要完成初始化对象,相当于C语言阶段写的Init函数。 默认构造函数:无参的构
  • C/C++实现遍历文件夹最全方法总结介绍

    C/C++实现遍历文件夹最全方法总结介绍
    一、filesystem(推荐) 在c++17中,引入了文件系统,使用起来非常方便 在VS中,可以直接在项目属性中调整: 只要是C++17即以上都可 然后头文件
  • C语言实现手写Map(数组+链表+红黑树)的代码

    C语言实现手写Map(数组+链表+红黑树)的代码
    要求 需要准备数组集合(List) 数据结构 需要准备单向链表(Linked) 数据结构 需要准备红黑树(Rbtree)数据结构 需要准备红黑树和链表适配策略
  • MySQL系列教程之使用C语言来连接数据库

    MySQL系列教程之使用C语言来连接数据库
    写在前面 知道了 Java中使用 JDBC编程 来连接数据库了,但是使用 C语言 来连接数据库却总是连接不上去~ 立即安排一波使用 C语言连接 MySQL数
  • 基于C语言实现简单学生成绩管理系统

    基于C语言实现简单学生成绩管理系统
    一、系统主要功能 1、密码登录 2、输入数据 3、查询成绩 4、修改成绩 5、输出所有学生成绩 6、退出系统 二、代码实现 1 2 3 4 5 6 7 8 9 10 11
  • C语言实现共享单车管理系统

    C语言实现共享单车管理系统
    1.功能模块图; 2.各个模块详细的功能描述。 1.登陆:登陆分为用户登陆,管理员登陆以及维修员登录,登陆后不同的用户所执行的操作
  • C++继承与菱形继承的介绍

    C++继承与菱形继承的介绍
    继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,增加
  • C/C++指针介绍与使用介绍

    C/C++指针介绍与使用介绍
    什么是指针 C/C++语言拥有在程序运行时获得变量的地址和操作地址的能力,这种用来操作地址的特殊类型变量被称作指针。 翻译翻译什么
  • C++进程的创建和进程ID标识介绍
    进程的ID 进程的ID,可称为PID。它是进程的唯一标识,类似于我们的身份证号是唯一标识,因为名字可能会和其他人相同,生日可能会与其他
  • C++分析如何用虚析构与纯虚析构处理内存泄漏

    C++分析如何用虚析构与纯虚析构处理内存泄漏
    一、问题引入 使用多态时,如果有一些子类的成员开辟在堆区,那么在父类执行完毕释放后,没有办法去释放子类的内存,这样会导致内存
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计