by 今天不飞了
春节在家闲着无聊写的,游戏本身没有可玩性,仅为给大家分享思路。
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