我正在为我的 A Level 项目制作自己的 Space Invaders 版本,但我被碰撞检测困住了。当子弹击中一名入侵者并且我真的被卡住时,我需要检测碰撞。
入侵者当前存储在二维数组中并在计时器上移动,代码如下:
for Row:=1 to 5 do
begin
frmGame.Canvas.FillRect(WaveArea)
for Column:=1 to 11 do
begin
frmGame.Canvas.Draw(30+Column*50+x, 180 Images[1].Picture.Graphic);
frmGame.Canvas.Draw(30+Column*50+x, 230 Images[2].Picture.Graphic);
end;
x:=x+xShift;
end;
if x>500 then
tmrMoveInvaders.Enabled:=False;
我写的碰撞代码不起作用,但我不知道为什么。这可能是使用二维数组将图像加载到表单上的方式,但我不确定。
碰撞过程的代码是:
Procedure Collision(img:TImage);
Var
TargetLeft,BulletLeft:integer;
TargetRight,BulletRight:integer;
TargetTop,BulletTop:integer;
TargetBottom,BulletBottom:integer;
Hit:boolean;
begin
with frmGame do
hit:=true;
TagetLeft:=img.Left;
BulletLeft:=shpBullet.Left;
TargetRight:=img.Left+46; //left + width of the image
BulletRight:=shpBullet.Left+8;
TargetTop:=img.Top;
BulletTop:=shpBullet.Top;
TargetBottom:=img.Top+42; //top + height of image
BulletBottom:=shpBullet.Top+15;
if (TargetBottom < BulletTop) then hit:=false;
if (TargetTop > BulletBottom) then hit:=false;
if (TargetRight < BulletLeft) then hit:=false;
if (TargetLeft > BulletRight) then hit:=false;
if not img.Visible then hit:=false;
if hit=true then
img.Visible:=false;
任何帮助将不胜感激。