教你用Matlab制作黄金矿工小游戏
目录
- 效果
- 步骤
- 图片准备
- 背景构建
- 绘制爪子
- 让爪子转起来
- 绘制石块
- 点击下箭头移动爪子
- 爪子与石头和边缘碰触判断
- 抓取石块和显示金钱
- 完整代码
效果
![教你用Matlab制作黄金矿工小游戏](https://img.it610.com/image/info11/85fbd96fac7249449b19ed47c2d26167.jpg)
文章图片
步骤
图片准备
本文所使用图片在这
背景构建
function goldMinerMainfig=figure('units','pixels','position',[50 100 750 500],...'Numbertitle','off','menubar','none','resize','off',...'name','goldMiner'); axes('parent',Mainfig,'position',[0 0 1 1],...'XLim', [0 750],...'YLim', [0 500],...'NextPlot','add',...'layer','bottom',...'Visible','on',...'YDir','reverse',...'XTick',[], ...'YTick',[]); bkgPic=imread('.\pic\bkg.png'); image([0,750],[0,500],bkgPic)[manPic,~,manAlp]=imread('.\pic\man.png'); image([400-60,400+60],[49.5-45,49.5+45],manPic,'AlphaData',manAlp)
![教你用Matlab制作黄金矿工小游戏](https://img.it610.com/image/info11/895148b195be403da43880a1c421f1a7.jpg)
文章图片
绘制爪子
由于爪子要不断调整角度因此用surface格式绘制,我们需要将爪子图片矩阵范围调整至[0,1],并将透明处数值调成nan
[clawPic,~,clawAlp]=imread('.\Pic\claw.png'); clawPic=double(clawPic)./255; clawPicR=clawPic(:,:,1); clawPicG=clawPic(:,:,2); clawPicB=clawPic(:,:,3); clawPicR(clawAlp<1)=nan; clawPicG(clawAlp<1)=nan; clawPicB(clawAlp<1)=nan; clawPic(:,:,1)=clawPicR; clawPic(:,:,2)=clawPicG; clawPic(:,:,3)=clawPicB; clawPos=[380,75]; ropePos=[380,75]; [xgrid,ygrid]=meshgrid((1:size(clawAlp,2))./2,(1:size(clawAlp,1))./2); xgrid=xgrid-size(clawAlp,2)/4; thetaList=linspace(-2*pi/5,2*pi/5,50); thetaIndex=1; theta=thetaList(thetaIndex); %当前爪子转动角度v=0; %爪子下移速度dir=1; %1或-1爪子转动方向grabbing=false; %是否正在抓取石块cost=cos(theta); sint=sin(theta); rotateX=cost.*xgrid+sint.*ygrid; rotateY=cost.*ygrid-sint.*xgrid; drawClawHdl=surface(rotateX+clawPos(1),rotateY+clawPos(2),...zeros(size(clawAlp)),clawPic,...'EdgeColor','none'); drawLineHdl=plot([clawPos(1),ropePos(1)],[clawPos(2),ropePos(2)],'k','LineWidth',2);
让爪子转起来
【教你用Matlab制作黄金矿工小游戏】爪子旋转就是单纯的使用旋转矩阵:
![教你用Matlab制作黄金矿工小游戏](https://img.it610.com/image/info11/6ab1e73b5ea94e24874083b9bacae77c.jpg)
文章图片
fps=20; game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @minergame); start(game)function minergame(~,~)if ~grabbingswitch 1case thetaIndex==1,dir=1; case thetaIndex==50,dir=-1; endthetaIndex=thetaIndex+dir; theta=thetaList(thetaIndex); cost=cos(theta); sint=sin(theta); rotateX=cost.*xgrid+sint.*ygrid; rotateY=cost.*ygrid-sint.*xgrid; elseendend
绘制石块
stoneName={'gold','gold','stone1','stone2','diamond'}; stonePic{length(stoneName)}=[]; stoneAlp{length(stoneName)}=[]; for i=1:length(stoneName)[C,~,Alp]=imread(['.\pic\',stoneName{i},'.png']); stonePic{i}=C; stoneAlp{i}=Alp; endstoneV=[-2,-3,-3,-3,-5]; %拿起石头后爪子移动速度stonePrice=[800,500,200,100,1000]; stoneSize=[50,50; 30,30; 24,20; 15,12; 8,8]; stonePos=[200,300; 400,350; 500,200; 50,240; 50,300; 700,420; 170,180]; stoneType=[1,2,3,4,5,1,2]; stoneTag=1:length(stoneType); stoneXrange=[stonePos(:,1)-stoneSize(stoneType',1),stonePos(:,1)+stoneSize(stoneType',1)]; stoneYrange=[stonePos(:,2)-stoneSize(stoneType',2),stonePos(:,2)+stoneSize(stoneType',2)]; for i=1:length(stoneTag)drawStone(stonePos(i,:),stoneType(i),stoneTag(i))endfunction drawStone(pos,i,j)image([-stoneSize(i,1),stoneSize(i,1)]+pos(1),...[-stoneSize(i,2),stoneSize(i,2)]+pos(2),...stonePic{i},...'AlphaData',stoneAlp{i},...'UserData',j)end
点击下箭头移动爪子
set(gcf, 'KeyPressFcn', @key) function key(~,event)switch event.Keycase 'downarrow'grabbing=true; v=4; endendfunction minergame(~,~)if ~grabbing%这里是让爪子转动的一堆代码%。。。。。。。。。。。。。%。。。。。。。。。。。。。elsecost=cos(theta); sint=sin(theta); clawPos=clawPos+[sint,cost].*v; endset(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2)); set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]); end
爪子与石头和边缘碰触判断
function n=touchThing(clawPos)n=0; if clawPos(1)<20||clawPos(1)>730||clawPos(2)>480n=-1; endflagX=clawPos(1)>=stoneXrange(:,1)&clawPos(1)<=stoneXrange(:,2); flagY=clawPos(2)>=stoneYrange(:,1)&clawPos(2)<=stoneYrange(:,2); flagXY=flagX&flagY; if any(flagXY)n=find(flagXY); endend
抓取石块和显示金钱
holdOnType=0; drawHoldOnHdl=image([0,1],[0,1],ones(1,1),'AlphaData',zeros(1,1)); text(10,40,'Money:','FontSize',20,'Color',[1 1 1],'FontName','Cambria','FontWeight','bold')money=0; moneyStrHdl=text(110,40,'$0','FontSize',20,'Color',[0.5137 0.7882 0.2157],'FontName','Cambria','FontWeight','bold'); function minergame(~,~)if ~grabbingswitch 1case thetaIndex==1,dir=1; case thetaIndex==50,dir=-1; endthetaIndex=thetaIndex+dir; theta=thetaList(thetaIndex); cost=cos(theta); sint=sin(theta); rotateX=cost.*xgrid+sint.*ygrid; rotateY=cost.*ygrid-sint.*xgrid; elsecost=cos(theta); sint=sin(theta); clawPos=clawPos+[sint,cost].*v; n=touchThing(clawPos+5.*[sint,cost]); if n==-1v=-abs(v); elseif n>0delete(findobj('UserData',stoneTag(n))); v=stoneV(stoneType(n)); holdOnType=stoneType(n); stonePos(n,:)=[]; stoneType(n)=[]; stoneTag(n)=[]; stoneXrange(n,:)=[]; stoneYrange(n,:)=[]; set(drawHoldOnHdl,...'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost,...'CData',stonePic{holdOnType},'AlphaData',stoneAlp{holdOnType}); endif clawPos(2)<=ropePos(2)clawPos=ropePos; grabbing=false; if holdOnType>0money=money+stonePrice(holdOnType); set(moneyStrHdl,'String',['$',num2str(money)])endholdOnType=0; set(drawHoldOnHdl,'XData',[0,1],...'YData',[0,1],...'CData',ones(1,1),...'AlphaData',zeros(1,1)); endif holdOnType~=0set(drawHoldOnHdl,...'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost); endendset(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2)); set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]); end
完整代码
function goldMinerMainfig=figure('units','pixels','position',[50 100 750 500],...'Numbertitle','off','menubar','none','resize','off',...'name','goldMiner'); axes('parent',Mainfig,'position',[0 0 1 1],...'XLim', [0 750],...'YLim', [0 500],...'NextPlot','add',...'layer','bottom',...'Visible','on',...'YDir','reverse',...'XTick',[], ...'YTick',[]); bkgPic=imread('.\pic\bkg.png'); image([0,750],[0,500],bkgPic)[manPic,~,manAlp]=imread('.\pic\man.png'); image([400-60,400+60],[49.5-45,49.5+45],manPic,'AlphaData',manAlp)[clawPic,~,clawAlp]=imread('.\Pic\claw.png'); clawPic=double(clawPic)./255; clawPicR=clawPic(:,:,1); clawPicG=clawPic(:,:,2); clawPicB=clawPic(:,:,3); clawPicR(clawAlp<1)=nan; clawPicG(clawAlp<1)=nan; clawPicB(clawAlp<1)=nan; clawPic(:,:,1)=clawPicR; clawPic(:,:,2)=clawPicG; clawPic(:,:,3)=clawPicB; clawPos=[380,75]; ropePos=[380,75]; [xgrid,ygrid]=meshgrid((1:size(clawAlp,2))./2,(1:size(clawAlp,1))./2); xgrid=xgrid-size(clawAlp,2)/4; thetaList=linspace(-2*pi/5,2*pi/5,50); thetaIndex=1; theta=thetaList(thetaIndex); v=0; dir=1; grabbing=false; cost=cos(theta); sint=sin(theta); rotateX=cost.*xgrid+sint.*ygrid; rotateY=cost.*ygrid-sint.*xgrid; drawClawHdl=surface(rotateX+clawPos(1),rotateY+clawPos(2),...zeros(size(clawAlp)),clawPic,...'EdgeColor','none'); drawLineHdl=plot([clawPos(1),ropePos(1)],[clawPos(2),ropePos(2)],'k','LineWidth',2); %stone part======================================================stoneName={'gold','gold','stone1','stone2','diamond'}; stonePic{length(stoneName)}=[]; stoneAlp{length(stoneName)}=[]; for i=1:length(stoneName)[C,~,Alp]=imread(['.\pic\',stoneName{i},'.png']); stonePic{i}=C; stoneAlp{i}=Alp; endstoneV=[-2,-3,-3,-3,-5]; stonePrice=[800,500,200,100,1000]; stoneSize=[50,50; 30,30; 24,20; 15,12; 8,8]; stonePos=[200,300; 400,350; 500,200; 50,240; 50,300; 700,420; 170,180]; stoneType=[1,2,3,4,5,1,2]; stoneTag=1:length(stoneType); stoneXrange=[stonePos(:,1)-stoneSize(stoneType',1),stonePos(:,1)+stoneSize(stoneType',1)]; stoneYrange=[stonePos(:,2)-stoneSize(stoneType',2),stonePos(:,2)+stoneSize(stoneType',2)]; for i=1:length(stoneTag)drawStone(stonePos(i,:),stoneType(i),stoneTag(i))endfunction drawStone(pos,i,j)image([-stoneSize(i,1),stoneSize(i,1)]+pos(1),...[-stoneSize(i,2),stoneSize(i,2)]+pos(2),...stonePic{i},...'AlphaData',stoneAlp{i},...'UserData',j)endholdOnType=0; drawHoldOnHdl=image([0,1],[0,1],ones(1,1),'AlphaData',zeros(1,1)); text(10,40,'Money:','FontSize',20,'Color',[1 1 1],'FontName','Cambria','FontWeight','bold')money=0; moneyStrHdl=text(110,40,'$0','FontSize',20,'Color',[0.5137 0.7882 0.2157],'FontName','Cambria','FontWeight','bold'); %==========================================================================set(gcf, 'KeyPressFcn', @key)fps=20; game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @minergame); start(game)function minergame(~,~)if ~grabbingswitch 1case thetaIndex==1,dir=1; case thetaIndex==50,dir=-1; endthetaIndex=thetaIndex+dir; theta=thetaList(thetaIndex); cost=cos(theta); sint=sin(theta); rotateX=cost.*xgrid+sint.*ygrid; rotateY=cost.*ygrid-sint.*xgrid; elsecost=cos(theta); sint=sin(theta); clawPos=clawPos+[sint,cost].*v; n=touchThing(clawPos+5.*[sint,cost]); if n==-1v=-abs(v); elseif n>0delete(findobj('UserData',stoneTag(n))); v=stoneV(stoneType(n)); holdOnType=stoneType(n); stonePos(n,:)=[]; stoneType(n)=[]; stoneTag(n)=[]; stoneXrange(n,:)=[]; stoneYrange(n,:)=[]; set(drawHoldOnHdl,...'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost,...'CData',stonePic{holdOnType},'AlphaData',stoneAlp{holdOnType}); endif clawPos(2)<=ropePos(2)clawPos=ropePos; grabbing=false; if holdOnType>0money=money+stonePrice(holdOnType); set(moneyStrHdl,'String',['$',num2str(money)])endholdOnType=0; set(drawHoldOnHdl,'XData',[0,1],...'YData',[0,1],...'CData',ones(1,1),...'AlphaData',zeros(1,1)); endif holdOnType~=0set(drawHoldOnHdl,...'XData',[-stoneSize(holdOnType,1),stoneSize(holdOnType,1)]+clawPos(1)+norm(stoneSize(holdOnType,:))*sint,...'YData',[-stoneSize(holdOnType,2),stoneSize(holdOnType,2)]+clawPos(2)+norm(stoneSize(holdOnType,:))*cost); endendset(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2)); set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]); endfunction n=touchThing(clawPos)n=0; if clawPos(1)<20||clawPos(1)>730||clawPos(2)>480n=-1; endflagX=clawPos(1)>=stoneXrange(:,1)&clawPos(1)<=stoneXrange(:,2); flagY=clawPos(2)>=stoneYrange(:,1)&clawPos(2)<=stoneYrange(:,2); flagXY=flagX&flagY; if any(flagXY)n=find(flagXY); endendfunction key(~,event)switch event.Keycase 'downarrow'grabbing=true; v=4; endendend
以上就是教你用Matlab制作黄金矿工小游戏的详细内容,更多关于Matlab黄金矿工游戏的资料请关注脚本之家其它相关文章!
推荐阅读
- JavaScript|JavaScript常见数组方法,教你如何转置矩阵
- 如何利用Matlab绘制出好看的火山图
- excite与matlab联合仿真|excite与matlab联合仿真,只有你想不到,没有EXCITE做不到的瞬态工况模拟
- 机器人教育|在学习少儿编程中体会AI乐趣
- 商业知识|那些年那些人创业失败的经验教训
- 数学建模|matlab的基本使用
- spring|什么是IOC(教你手撸一个IOC容器)
- java|节后上班第一天公司要你用SpringBoot实现万能文件在线预览
- 人工智能|参赛指南 | 教育部白名单竞赛少年硅谷 AI算法竞技赛
- opencv|opencv.js 之官网教程翻译加代码