温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-03-02 16:49:43 来源:亿速云 阅读:210 作者:iii 栏目:开发技术

本文小编为大家详细介绍“怎么用Matlab制作黄金矿工小游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么用Matlab制作黄金矿工小游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    效果

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

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

    步骤

    图片准备

    本文所使用图片在这

    背景构建

    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)

    怎么用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;
    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

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

    点击下箭头移动爪子

    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

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

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI