效果


步骤
图片准备
本文所使用图片在这
背景构建
- function goldMiner
- Mainfig=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)
-

绘制爪子
由于爪子要不断调整角度因此用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);
让爪子转起来
爪子旋转就是单纯的使用旋转矩阵:

- fps=20;
- game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @minergame);
- start(game)
-
- function minergame(~,~)
- if ~grabbing
- switch 1
- case thetaIndex==1,dir=1;
- case thetaIndex==50,dir=-1;
- end
- thetaIndex=thetaIndex+dir;
- theta=thetaList(thetaIndex);
- cost=cos(theta);
- sint=sin(theta);
- rotateX=cost.*xgrid+sint.*ygrid;
- rotateY=cost.*ygrid-sint.*xgrid;
- else
- end
- end

绘制石块
- 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;
- end
- stoneV=[-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))
- end
-
- function 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.Key
- case 'downarrow'
- grabbing=true;v=4;
- end
- end
-
- function minergame(~,~)
- if ~grabbing
- %这里是让爪子转动的一堆代码
- %。。。。。。。。。。。。。
- %。。。。。。。。。。。。。
- else
- cost=cos(theta);
- sint=sin(theta);
- clawPos=clawPos+[sint,cost].*v;
- end
- set(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)>480
- n=-1;
- end
- flagX=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);
- end
- end
抓取石块和显示金钱
- 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 ~grabbing
- switch 1
- case thetaIndex==1,dir=1;
- case thetaIndex==50,dir=-1;
- end
- thetaIndex=thetaIndex+dir;
- theta=thetaList(thetaIndex);
- cost=cos(theta);
- sint=sin(theta);
- rotateX=cost.*xgrid+sint.*ygrid;
- rotateY=cost.*ygrid-sint.*xgrid;
- else
- cost=cos(theta);
- sint=sin(theta);
- clawPos=clawPos+[sint,cost].*v;
-
- n=touchThing(clawPos+5.*[sint,cost]);
- if n==-1
- v=-abs(v);
- elseif n>0
- delete(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});
- end
-
- if clawPos(2)<=ropePos(2)
- clawPos=ropePos;
- grabbing=false;
- if holdOnType>0
- money=money+stonePrice(holdOnType);
- set(moneyStrHdl,'String',['$',num2str(money)])
- end
- holdOnType=0;
- set(drawHoldOnHdl,'XData',[0,1],...
- 'YData',[0,1],...
- 'CData',ones(1,1),...
- 'AlphaData',zeros(1,1));
- end
- if holdOnType~=0
- 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);
- end
- end
-
-
- set(drawClawHdl,'XData',rotateX+clawPos(1),'YData',rotateY+clawPos(2));
- set(drawLineHdl,'XData',[clawPos(1),ropePos(1)],'YData',[clawPos(2),ropePos(2)]);
- end

完整代码
- function goldMiner
- Mainfig=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;
- end
- stoneV=[-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))
- end
-
- function 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
-
- 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');
-
- %==========================================================================
- set(gcf, 'KeyPressFcn', @key)
- fps=20;
- game=timer('ExecutionMode', 'FixedRate', 'Period',1/fps, 'TimerFcn', @minergame);
- start(game)
-
- function minergame(~,~)
- if ~grabbing
- switch 1
- case thetaIndex==1,dir=1;
- case thetaIndex==50,dir=-1;
- end
- thetaIndex=thetaIndex+dir;
- theta=thetaList(thetaIndex);
- cost=cos(theta);
- sint=sin(theta);
- rotateX=cost.*xgrid+sint.*ygrid;
- rotateY=cost.*ygrid-sint.*xgrid;
- else
- cost=cos(theta);
- sint=sin(theta);
- clawPos=clawPos+[sint,cost].*v;
-
- n=touchThing(clawPos+5.*[sint,cost]);
- if n==-1
- v=-abs(v);
- elseif n>0
- delete(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});
- end
-
- if clawPos(2)<=ropePos(2)
- clawPos=ropePos;
- grabbing=false;
- if holdOnType>0
- money=money+stonePrice(holdOnType);
- set(moneyStrHdl,'String',['$',num2str(money)])
- end
- holdOnType=0;
- set(drawHoldOnHdl,'XData',[0,1],...
- 'YData',[0,1],...
- 'CData',ones(1,1),...
- 'AlphaData',zeros(1,1));
- end
- if holdOnType~=0
- 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);
- end
- end
-
-
- set(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)>480
- n=-1;
- end
- flagX=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);
- end
- end
-
- function key(~,event)
- switch event.Key
- case 'downarrow'
- grabbing=true;v=4;
- end
- end
- end
以上就是教你用Matlab制作黄金矿工小游戏的详细内容,更多关于Matlab黄金矿工游戏的资料请关注w3xue其它相关文章!