我制作了类似于飞鸟的小游戏,可以使用鼠标和键盘上下飞行。
我不会发布完整的代码,因为它是一个大学项目,我不想因任何可能的抄袭而被抓住。
我做的是,我使用了两个对象:
一个矩形作为鸟:
r= rectangle('Position', pos, 'curvature', [0.99,0.1], 'FaceColor', 'r', 'EraseMode','xor');
用于表示墙壁的粗线:
line([ 100 100], [10 400], 'color', 'm', 'LineWidth', 10, 'EraseMode', 'background')
我的问题:
问题是鸟穿过墙壁,好像墙壁是透明的。正如你可以想象的那样,当鸟儿撞到墙上时(不是通过它们),我想要打破游戏并展示类似<#> 游戏结束&#34;之类的东西。当鸟(物体1)与墙壁(其他物体)碰撞时,如何使我的游戏中断?
非常感谢您阅读我的问题!
答案 0 :(得分:2)
您需要使用交叉算法来检查其中一条墙线(检查四次)与矩形的交点。矩形基本上也由4行组成,这意味着您应该检查4条矩形线与4条墙线(如果使用线 - 线交叉算法)。
E.g。检查此主题: How to find the intersection point between a line and a rectangle?
这基本上是一个简单的数学方程式,请参阅https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection。
答案 1 :(得分:2)
如果您安装了Mapping Toolbox,它会提供一个名为polyxpoly
的函数,允许您与polylines相交,这样您就可以找到整个矩形与每个墙的交点,而您不会不得不担心分割矩形的每个边缘。
这里有一个与一面墙碰撞的完整工作示例:
% Bird (rectangle).
% Position.
xr = 30;
yr = 100;
% Length of rectangle edges.
deltaxr = 10;
deltayr = 10;
% Vector for rectangle object.
vr = [xr, yr, deltaxr, deltayr];
% Bird polyline.
a = [xr, yr];
b = [xr + deltaxr, yr];
c = [xr + deltaxr, yr + deltayr];
d = [xr, yr + deltayr];
r = [a; b; c; d];
% Wall (line).
% Wall polyline.
l = [40 0; 40 105];
% Draw objects.
r1 = rectangle('Position',vr,'LineWidth',2);
line(l(:,1), l(:,2),'LineWidth',2,'Color','r');
axis equal;
% Find intersections.
[xi,yi] = polyxpoly(r(:,1),r(:,2),l(:,1),l(:,2));
% Are there any intersections? If so, GAME OVER.
if ~isempty(xi)
% Stop the game and display GAME OVER.
text(xr-20,yr-20,'GAME OVER','Color','b','FontSize', 20);
end
您可以尝试使用不同的鸟类位置来测试碰撞检测: