C语言
主页 > 软件编程 > C语言 >

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

2022-02-25 | 秩名 | 点击:

效果

游戏方式

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

说明

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

原文链接:https://blog.csdn.net/slandarer/article/details/121059293
相关文章
最新更新