经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » MATLAB » 查看文章
基于Matlab制作一款简单的龙舟小游戏
来源:jb51  时间:2022/3/2 15:44:39  对本文有异议

效果图:

没找到合适的背景就自己画了个,大家如果有更好看的可以换一下。。。

步骤

1 创建Axes及图片导入

窗口创建:

  1. Mainfig=figure('units','pixels','position',[50 100 760 400],...
  2. 'Numbertitle','off','menubar','none','resize','off',...
  3. 'name','dragonBoat');
  4. axes('parent',Mainfig,'position',[0 0 1 1],...
  5. 'XLim', [0 760],...
  6. 'YLim', [0 400],...
  7. 'NextPlot','add',...
  8. 'layer','bottom',...
  9. 'Visible','on',...
  10. 'YDir','reverse',...
  11. 'XTick',[], ...
  12. 'YTick',[]);

图片导入:

  1. [bkg_C,~,~]=imread('river.png');
  2. [boat_C,~,boat_Alp]=imread('boat.png');
  3. [stone_C,~,stone_Alp]=imread('stone.png');

图片素材可以从这里拿哟

2 创建timer函数移动背景

  1. DrawBkgHdl=image([0 760],[0 400],bkg_C);
  2.  
  3. t=0;
  4. tempBkg_C=[bkg_C,bkg_C];
  5. fps = 20;
  6. game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragongame);
  7. start(game)
  8.  
  9. function dragongame(~,~)
  10. t=t+6;
  11. modt=mod(t,720);
  12. newBkg_C=tempBkg_C(:,1+modt:684+modt,:);
  13. set(DrawBkgHdl,'CData',newBkg_C)
  14. end

3 绘制石块并移动

其实是5个石块来回变位置,当一个石块位置减小到负数就把数值增加并重新绘制

  1. stonePos=[600;870;1140;1410];
  2. stonePos=[stonePos,randi([90,330],[4,1])];
  3. for i=1:size(stonePos,1)
  4. drawStoneHdl(i)=image([stonePos(i,1)-39 stonePos(i,1)+39],[stonePos(i,2)-20 stonePos(i,2)+20],stone_C,'AlphaData',stone_Alp);
  5. end
  6.  
  7. function dragongame(~,~)
  8.  
  9. %这里是之前写的背景部分代码
  10. %。。。。。。。。。。。
  11. %。。。。。。。。。。。
  12. stonePos(:,1)=stonePos(:,1)-20/3;
  13. stonePos(stonePos(:,1)<0,2)=randi([90,330],[1,1]);
  14. stonePos(stonePos(:,1)<0,1)=stonePos(stonePos(:,1)<0,1)+1080;
  15. for ii=1:size(stonePos,1)
  16. set(drawStoneHdl(ii),'XData',[stonePos(ii,1)-39 stonePos(ii,1)+39],...
  17. 'YData',[stonePos(ii,2)-20 stonePos(ii,2)+20]);
  18. end
  19. end

4 绘制船并创建鼠标回调

  1. boatPos=[380,200];
  2. DrawBoatHdl=image([boatPos(1)-75 boatPos(1)+75],[boatPos(2)-50 boatPos(2)+50],boat_C,'AlphaData',boat_Alp);
  3.  
  4. set(gcf,'WindowButtonMotionFcn',@moveBoat,'tag','mov')
  5.  
  6. function moveBoat(~,~)
  7. xy=get(gca,'CurrentPoint');
  8. temp_y=xy(1,2);
  9. temp_y(temp_y<100)=90;
  10. temp_y(temp_y>340)=330;
  11. boatPos=[380,temp_y];
  12. set(DrawBoatHdl,'YData',[temp_y-50 temp_y+50]);
  13. end

5 碰撞判断函数

  1. function flag=judge(Bpos,Spos)
  2. flag1=abs(Bpos(1)-Spos(:,1))<80;
  3. flag2=abs((Bpos(2)+35)-Spos(:,2))<30;
  4. flag3=flag1&flag2;
  5. flag=any(flag3);
  6. end

dragongame函数做如下改写

  1. function dragongame(~,~)
  2. %这里是之前一大堆代码
  3. %。。。。。。。。。。
  4. %。。。。。。。。。。
  5. %。。。。。。。。。。
  6.  
  7. if judge(boatPos,stonePos)
  8. stop(game)
  9. set(gcf,'WindowButtonMotionFcn',[]);
  10. text(50,200,'游戏结束','FontSize',54,'Color','w','tag','txt')
  11. end
  12. end

6 完整代码

  1. function dragonBoat
  2.  
  3.  
  4. Mainfig=figure('units','pixels','position',[50 100 760 400],...
  5. 'Numbertitle','off','menubar','none','resize','off',...
  6. 'name','dragonBoat');
  7. axes('parent',Mainfig,'position',[0 0 1 1],...
  8. 'XLim', [0 760],...
  9. 'YLim', [0 400],...
  10. 'NextPlot','add',...
  11. 'layer','bottom',...
  12. 'Visible','on',...
  13. 'YDir','reverse',...
  14. 'XTick',[], ...
  15. 'YTick',[]);
  16. [bkg_C,~,~]=imread('river.png');
  17. [boat_C,~,boat_Alp]=imread('boat.png');
  18. [stone_C,~,stone_Alp]=imread('stone.png');
  19.  
  20.  
  21. DrawBkgHdl=image([0 760],[0 400],bkg_C);
  22.  
  23. stonePos=[600;870;1140;1410];
  24. stonePos=[stonePos,randi([90,330],[4,1])];
  25. for i=1:size(stonePos,1)
  26. drawStoneHdl(i)=image([stonePos(i,1)-39 stonePos(i,1)+39],[stonePos(i,2)-20 stonePos(i,2)+20],stone_C,'AlphaData',stone_Alp);
  27. end
  28.  
  29. boatPos=[380,200];
  30. DrawBoatHdl=image([boatPos(1)-75 boatPos(1)+75],[boatPos(2)-50 boatPos(2)+50],boat_C,'AlphaData',boat_Alp);
  31.  
  32. t=0;
  33. tempBkg_C=[bkg_C,bkg_C];
  34. fps = 20;
  35. game = timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @dragongame);
  36. start(game)
  37.  
  38. text(10,20,['已前进',num2str(t),'米'],'FontSize',14,'Color','w','tag','txt');
  39.  
  40. set(gcf,'WindowButtonMotionFcn',@moveBoat,'tag','mov')
  41.  
  42.  
  43. function dragongame(~,~)
  44. t=t+6;
  45. modt=mod(t,720);
  46. newBkg_C=tempBkg_C(:,1+modt:684+modt,:);
  47. set(DrawBkgHdl,'CData',newBkg_C)
  48. stonePos(:,1)=stonePos(:,1)-20/3;
  49. stonePos(stonePos(:,1)<0,2)=randi([90,330],[1,1]);
  50. stonePos(stonePos(:,1)<0,1)=stonePos(stonePos(:,1)<0,1)+1080;
  51. for ii=1:size(stonePos,1)
  52. set(drawStoneHdl(ii),'XData',[stonePos(ii,1)-39 stonePos(ii,1)+39],...
  53. 'YData',[stonePos(ii,2)-20 stonePos(ii,2)+20]);
  54. end
  55. set(findobj('tag','txt'),'String',['已前进',num2str(t),'米']);
  56. if judge(boatPos,stonePos)
  57. stop(game)
  58. set(gcf,'WindowButtonMotionFcn',[]);
  59. text(50,200,'游戏结束','FontSize',54,'Color','w','tag','txt')
  60. end
  61. end
  62.  
  63. function moveBoat(~,~)
  64. xy=get(gca,'CurrentPoint');
  65. temp_y=xy(1,2);
  66. temp_y(temp_y<100)=90;
  67. temp_y(temp_y>340)=330;
  68. boatPos=[380,temp_y];
  69. set(DrawBoatHdl,'YData',[temp_y-50 temp_y+50]);
  70. end
  71.  
  72. function flag=judge(Bpos,Spos)
  73. flag1=abs(Bpos(1)-Spos(:,1))<80;
  74. flag2=abs((Bpos(2)+35)-Spos(:,2))<30;
  75. flag3=flag1&flag2;
  76. flag=any(flag3);
  77. end
  78. end

到此这篇关于基于Matlab制作一款简单的龙舟小游戏的文章就介绍到这了,更多相关Matlab龙舟游戏内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号