文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么用Matlab制作黄金矿工小游戏

2023-06-29 08:29

关注

本文小编为大家详细介绍“怎么用Matlab制作黄金矿工小游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用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)

怎么用Matlab制作黄金矿工小游戏

绘制爪子

由于爪子要不断调整角度因此用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制作黄金矿工小游戏

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

怎么用Matlab制作黄金矿工小游戏

绘制石块

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

怎么用Matlab制作黄金矿工小游戏

点击下箭头移动爪子

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

怎么用Matlab制作黄金矿工小游戏

爪子与石头和边缘碰触判断

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

怎么用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)[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制作黄金矿工小游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯