怎么用Matlab制作黄金矿工小游戏
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文小编为大家详细介绍"怎么用Matlab制作黄金矿工小游戏",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Matlab制作黄金矿工小游戏"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
千家信息网最后更新 2026年11月02日怎么用Matlab制作黄金矿工小游戏
本文小编为大家详细介绍"怎么用Matlab制作黄金矿工小游戏",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么用Matlab制作黄金矿工小游戏"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
效果
步骤
图片准备
本文所使用图片在这
背景构建
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)绘制爪子
由于爪子要不断调整角度因此用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;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)) 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 endfunction 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 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)) 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) 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 ~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 endend读到这里,这篇"怎么用Matlab制作黄金矿工小游戏"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。
爪子
小游戏
矿工
黄金
制作
图片
文章
石块
代码
内容
步骤
矩阵
石头
角度
速度
移动
调整
妥当
就是
思路
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州紫鲸互联网科技有限公司
互联网科技工作委员会副主任毛军
国智互联网科技
互联网科技行业发展
互联网扶贫科技
互联网 卓越科技
卓越科技(互联网 )
南京欣网互联网科技
大白互联网科技
互联网科技公司的市场部门
宁波青枫互联网科技有限公司
新兴科技互联网创新大赛颁奖典礼
链环科技传统企业怎么转型互联网
互联网行业科技股
合肥互联网科技公司公章图片
风投北京互联网科技
互联网科技手机排行榜
求路客互联网科技电话
第三届互联网大会安防黑科技
承德科技产业互联网平台
网络科技有限互联网
银优互联网科技有限公司
福州新华互联网科技学校 知乎
常德市电业局互联网科技部
港股科技和互联网
天津腾达互联网科技有限公司
徐州市互联网科技有限公司
保险科技服务互联网营销体系
每天都有哪些好的互联网科技
易租星互联网科技有限公司