基于Matlab制作一款簡(jiǎn)單的龍舟小游戲
效果圖:
沒(méi)找到合適的背景就自己畫了個(gè),大家如果有更好看的可以換一下。。。


步驟
1 創(chuàng)建Axes及圖片導(dǎo)入
窗口創(chuàng)建:
Mainfig=figure('units','pixels','position',[50 100 760 400],...
'Numbertitle','off','menubar','none','resize','off',...
'name','dragonBoat');
axes('parent',Mainfig,'position',[0 0 1 1],...
'XLim', [0 760],...
'YLim', [0 400],...
'NextPlot','add',...
'layer','bottom',...
'Visible','on',...
'YDir','reverse',...
'XTick',[], ...
'YTick',[]);
圖片導(dǎo)入:
[bkg_C,~,~]=imread('river.png');
[boat_C,~,boat_Alp]=imread('boat.png');
[stone_C,~,stone_Alp]=imread('stone.png');
2 創(chuàng)建timer函數(shù)移動(dòng)背景
DrawBkgHdl=image([0 760],[0 400],bkg_C);
t=0;
tempBkg_C=[bkg_C,bkg_C];
fps = 20;
game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragongame);
start(game)
function dragongame(~,~)
t=t+6;
modt=mod(t,720);
newBkg_C=tempBkg_C(:,1+modt:684+modt,:);
set(DrawBkgHdl,'CData',newBkg_C)
end

3 繪制石塊并移動(dòng)
其實(shí)是5個(gè)石塊來(lái)回變位置,當(dāng)一個(gè)石塊位置減小到負(fù)數(shù)就把數(shù)值增加并重新繪制
stonePos=[600;870;1140;1410];
stonePos=[stonePos,randi([90,330],[4,1])];
for i=1:size(stonePos,1)
drawStoneHdl(i)=image([stonePos(i,1)-39 stonePos(i,1)+39],[stonePos(i,2)-20 stonePos(i,2)+20],stone_C,'AlphaData',stone_Alp);
end
function dragongame(~,~)
%這里是之前寫的背景部分代碼
%。。。。。。。。。。。
%。。。。。。。。。。。
stonePos(:,1)=stonePos(:,1)-20/3;
stonePos(stonePos(:,1)<0,2)=randi([90,330],[1,1]);
stonePos(stonePos(:,1)<0,1)=stonePos(stonePos(:,1)<0,1)+1080;
for ii=1:size(stonePos,1)
set(drawStoneHdl(ii),'XData',[stonePos(ii,1)-39 stonePos(ii,1)+39],...
'YData',[stonePos(ii,2)-20 stonePos(ii,2)+20]);
end
end

4 繪制船并創(chuàng)建鼠標(biāo)回調(diào)
boatPos=[380,200];
DrawBoatHdl=image([boatPos(1)-75 boatPos(1)+75],[boatPos(2)-50 boatPos(2)+50],boat_C,'AlphaData',boat_Alp);
set(gcf,'WindowButtonMotionFcn',@moveBoat,'tag','mov')
function moveBoat(~,~)
xy=get(gca,'CurrentPoint');
temp_y=xy(1,2);
temp_y(temp_y<100)=90;
temp_y(temp_y>340)=330;
boatPos=[380,temp_y];
set(DrawBoatHdl,'YData',[temp_y-50 temp_y+50]);
end

5 碰撞判斷函數(shù)
function flag=judge(Bpos,Spos)
flag1=abs(Bpos(1)-Spos(:,1))<80;
flag2=abs((Bpos(2)+35)-Spos(:,2))<30;
flag3=flag1&flag2;
flag=any(flag3);
end
dragongame函數(shù)做如下改寫
function dragongame(~,~)
%這里是之前一大堆代碼
%。。。。。。。。。。
%。。。。。。。。。。
%。。。。。。。。。。
if judge(boatPos,stonePos)
stop(game)
set(gcf,'WindowButtonMotionFcn',[]);
text(50,200,'游戲結(jié)束','FontSize',54,'Color','w','tag','txt')
end
end
6 完整代碼
function dragonBoat
Mainfig=figure('units','pixels','position',[50 100 760 400],...
'Numbertitle','off','menubar','none','resize','off',...
'name','dragonBoat');
axes('parent',Mainfig,'position',[0 0 1 1],...
'XLim', [0 760],...
'YLim', [0 400],...
'NextPlot','add',...
'layer','bottom',...
'Visible','on',...
'YDir','reverse',...
'XTick',[], ...
'YTick',[]);
[bkg_C,~,~]=imread('river.png');
[boat_C,~,boat_Alp]=imread('boat.png');
[stone_C,~,stone_Alp]=imread('stone.png');
DrawBkgHdl=image([0 760],[0 400],bkg_C);
stonePos=[600;870;1140;1410];
stonePos=[stonePos,randi([90,330],[4,1])];
for i=1:size(stonePos,1)
drawStoneHdl(i)=image([stonePos(i,1)-39 stonePos(i,1)+39],[stonePos(i,2)-20 stonePos(i,2)+20],stone_C,'AlphaData',stone_Alp);
end
boatPos=[380,200];
DrawBoatHdl=image([boatPos(1)-75 boatPos(1)+75],[boatPos(2)-50 boatPos(2)+50],boat_C,'AlphaData',boat_Alp);
t=0;
tempBkg_C=[bkg_C,bkg_C];
fps = 20;
game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragongame);
start(game)
text(10,20,['已前進(jìn)',num2str(t),'米'],'FontSize',14,'Color','w','tag','txt');
set(gcf,'WindowButtonMotionFcn',@moveBoat,'tag','mov')
function dragongame(~,~)
t=t+6;
modt=mod(t,720);
newBkg_C=tempBkg_C(:,1+modt:684+modt,:);
set(DrawBkgHdl,'CData',newBkg_C)
stonePos(:,1)=stonePos(:,1)-20/3;
stonePos(stonePos(:,1)<0,2)=randi([90,330],[1,1]);
stonePos(stonePos(:,1)<0,1)=stonePos(stonePos(:,1)<0,1)+1080;
for ii=1:size(stonePos,1)
set(drawStoneHdl(ii),'XData',[stonePos(ii,1)-39 stonePos(ii,1)+39],...
'YData',[stonePos(ii,2)-20 stonePos(ii,2)+20]);
end
set(findobj('tag','txt'),'String',['已前進(jìn)',num2str(t),'米']);
if judge(boatPos,stonePos)
stop(game)
set(gcf,'WindowButtonMotionFcn',[]);
text(50,200,'游戲結(jié)束','FontSize',54,'Color','w','tag','txt')
end
end
function moveBoat(~,~)
xy=get(gca,'CurrentPoint');
temp_y=xy(1,2);
temp_y(temp_y<100)=90;
temp_y(temp_y>340)=330;
boatPos=[380,temp_y];
set(DrawBoatHdl,'YData',[temp_y-50 temp_y+50]);
end
function flag=judge(Bpos,Spos)
flag1=abs(Bpos(1)-Spos(:,1))<80;
flag2=abs((Bpos(2)+35)-Spos(:,2))<30;
flag3=flag1&flag2;
flag=any(flag3);
end
end

到此這篇關(guān)于基于Matlab制作一款簡(jiǎn)單的龍舟小游戲的文章就介紹到這了,更多相關(guān)Matlab龍舟游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
簡(jiǎn)單對(duì)比C語(yǔ)言中的fputs()函數(shù)和fputc()函數(shù)
這篇文章主要介紹了簡(jiǎn)單對(duì)比C語(yǔ)言中的fputs()函數(shù)和fputc()函數(shù),注意其之間的區(qū)別,需要的朋友可以參考下2015-08-08
詳解C語(yǔ)言中Char型指針數(shù)組與字符數(shù)組的區(qū)別
這篇文章主要介紹了詳解C語(yǔ)言中Char型指針數(shù)組與字符數(shù)組的區(qū)別的相關(guān)資料,希望通過(guò)本文能幫助到大家掌握理解這部分內(nèi)容,需要的朋友可以參考下2017-10-10
基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂(lè)系統(tǒng)
C++中的Beep 函數(shù)是一個(gè)發(fā)出嗡鳴聲的函數(shù),本文將利用這個(gè)函數(shù)實(shí)現(xiàn)制作一個(gè)簡(jiǎn)單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12
VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程
這篇文章主要介紹了VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程,涉及VC針對(duì)系統(tǒng)進(jìn)程的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05
詳解C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能(2)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)推箱子的基本功能的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02
c++中的volatile和variant關(guān)鍵字詳解
大家好,本篇文章主要講的是c++中的volatile和variant關(guān)鍵字詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01

