【MATLAB小游戏】青蛙吃苍蝇

【MATLAB小游戏】青蛙吃苍蝇

by 今天不飞了

春节在家闲着无聊写的,游戏本身没有可玩性,仅为给大家分享思路。
MATLAB可以设计一些低性能的游戏。


内容

在这里插入图片描述

视频链接《MATLAB可以写游戏吗?可以。》

代码

function FrogAndFly()
clc
%% {窗口初始化}
axesrange = [-10 10 -10 10]*4;
figure('position',[300 100 700 700],'color','w','menubar','none')
set(gcf,'WindowButtonMotionFcn',@currentPt);
set(gcf,'WindowButtonDownFcn',@ButtonDownFcn);
ax = axes('position',[.05 .05 .9 .85],'xcolor','none','ycolor','none'); hold all;
axis(ax,axesrange); box off;
colormap(ax,'hot');
caxis(ax,[.5 2]);

%% {对象初始化}
% 青蛙
[x,y,hp] = meshgrid(1:-0.01:-1,1:-0.01:-1,0);
img1 = imread('frog.png');
h1 = surf(x*20,y*20-5,hp,'EdgeAlpha',0);
set(h1,'CData',img1,'FaceColor','texturemap');

% 苍蝇
img2 = imread('fly.jpg');
[x,y,hp] = meshgrid(1:-0.02:-1,1:-0.02:-1,0);
flyx = x*2;
flyy = y*2;
ball = surf(flyx+20,flyy+20,hp,'EdgeAlpha',0);
set(ball,'CData',img2,'FaceColor','texturemap');

% 眼睛
num = 18;
out1 = drawcircle(1,num);
rw = 4.4;
rk = 2;
eyek1pos = [-8.5,5.8];
eyew1 = plot(out1(:,1)*rw+eyek1pos(1),out1(:,2)*rw+eyek1pos(2),'-','Color',[1,1,1]*0.6);
eyek1 = plot(out1(:,1)*rk+eyek1pos(1),out1(:,2)*rk+eyek1pos(2),'k-','LineWidth',12);
eyek2pos = [9,5.8];
eyew2 = plot(out1(:,1)*rw+eyek2pos(1),out1(:,2)*rw+eyek2pos(2),'-','Color',[1,1,1]*0.6);
eyek2 = plot(out1(:,1)*rk+eyek2pos(1),out1(:,2)*rk+eyek2pos(2),'k-','LineWidth',12);

% 嘴巴
rm = 2;
out2 = drawcircle(0.5,num);
mouthpos = [0.4,4];
mouth = plot(out2(:,1)*rm+mouthpos(1),out2(:,2)*rm+mouthpos(2),'r-','LineWidth',2);
state = 1;

%% {执行}
while 1
    if ~isvalid(ax)
        break
    end
    drawnow
end

	% 鼠标移动
    function currentPt(~,~)
        cp = get(gca,'currentpoint');
        p = cp(1,1:2);
        p = [min(max(p(1),axesrange(1)),axesrange(2)),...
            min(max(p(2),axesrange(3)),axesrange(4))];
        ball.XData = flyx+p(1);
        ball.YData = flyy+p(2);
        
        w = 2;
        p1 = p-eyek1pos;
        if norm(p1)>rw-rk
            v = p1/norm(p1);
            eyek1.XData = out1(:,1)*rk+eyek1pos(1)+v(1)*w;
            eyek1.YData = out1(:,2)*rk+eyek1pos(2)+v(2)*w;
        else
            eyek1.XData = out1(:,1)*rk+eyek1pos(1)+p1(1);
            eyek1.YData = out1(:,2)*rk+eyek1pos(2)+p1(2);
        end
        p2 = p-eyek2pos;
        if norm(p2)>rw-rk
            v = p2/norm(p2);
            eyek2.XData = out1(:,1)*rk+eyek2pos(1)+v(1)*w;
            eyek2.YData = out1(:,2)*rk+eyek2pos(2)+v(2)*w;
        else
            eyek2.XData = out1(:,1)*rk+eyek2pos(1)+p2(1);
            eyek2.YData = out1(:,2)*rk+eyek2pos(2)+p2(2);
        end
    end

	% 鼠标点击
    function ButtonDownFcn(~,~)
        if state
            state = 0;
            cp = get(gca,'currentpoint');
            p = cp(1,1:2);
            p = [min(max(p(1),axesrange(1)),axesrange(2)),...
                min(max(p(2),axesrange(3)),axesrange(4))];
            ball.XData = flyx+p(1);
         ball.YData = flyy+p(2);
            p1 = p-mouthpos;
            xy = out2*rm+mouthpos;
            if norm(p1)>rm
                % 最近
                dis = sqrt(sum((xy(1:num,:)-p).^2,2));
                [dis,idx] = sort(dis);
                dis = dis(1:floor(num/2));
                idx = idx(1:floor(num/2));
                % 方向
                tmp = xy(idx,:);
                v = (p-tmp(1,:)).*(mat2gray(dis(1)./dis)*0.9+0.1);
                
                TT = sqrt(ceil(norm(v(1,:))))+8;
                for t = 1:TT
                    xy(idx,:) = xy(idx,:)+v/TT;
                    xy(num+1,:) = xy(1,:);
                    mouth.XData = xy(:,1);
                    mouth.YData = xy(:,2);
                    pause(0.005)
                    drawnow
                end
                
                for t = 1:TT
                    xy(idx,:) = xy(idx,:)-v/TT;
                    xy(num+1,:) = xy(1,:);
                    mouth.XData = xy(:,1);
                    mouth.YData = xy(:,2);
                    pause(0.005)
                    drawnow
                end
            end
            state = 1;
        end
    end

end

% 画圈圈函数
function out = drawcircle(w,n)
t = 0:2*pi/n:2*pi;
x = cos(t);
y = sin(t)*w;
out = [x(:),y(:)];
end

图片

请添加图片描述
请添加图片描述


其他

大概没有什么bug

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值