教你用Matlab制作黄金矿工小游戏
短信预约 -IT技能 免费直播动态提醒
效果
步骤
图片准备
本文所使用图片在这
背景构建
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黄金矿工游戏的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341