Прошу помощи, только начинаю в программирование.
Пытаюсь создать арканоид, вроде бы почти всё еле еле но готово, но не работает функция столкновения шарика с блоками массива, шарик пролетает насквозь а должен разбивать блок и отскакивать от него, вот собственно код самой функции -
Код:
if (ball.Top <= Bricks[i].Top + Ball.Height) and (ball.Left >= Bricks[i].Left + Ball.Width) then
begin //если шарик попадает в Bricks то
Bricks[i].Visible := false;
end;
Еще есть вопрос как сделать так чтобы массив блоков появлялся сразу по открытию программы, я сумел реализовать только через нажатие кнопки.
Вот полный код программы:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
Raket: TShape; // платформа
Ball: TShape; // шар
Button1: TButton;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
PosX, Posy, VelX, Vely: single;
overlay:trect;
start:boolean;
BallMoving: Boolean;
Bricks: array[0..49] of TShape;
Button1:boolean;
implementation
{$R *.dfm}
procedure TForm1.Formcreate (Sender: TObject);
begin
Posx:=200; // стартовая точка шара на платформе
PosY:=472;
VelX:=5;
VelY:=5;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Raket.Left:= Mouse.CursorPos.X - Form1.ClientOrigin.X; //Mouse.CursorPos - позиция курсора, Form1.ClientOrigin - координаты Raket на экране
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer; // массив Bricks TShape
begin
BallMoving := False;
for i := 0 to 49 do
if Bricks[i] <> nil then
Bricks[i].Destroy;
for i := 0 to 9 do
begin
Bricks[i] := TShape.Create(Form1);
Bricks[i].Parent := Form1;
Bricks[i].Shape := stRectangle;
Bricks[i].Top := 30;
Bricks[i].Left := 49 * i;
Bricks[i].Width := 48;
Bricks[i].Height := 19;
Bricks[i].Brush.Color := clLime;
Bricks[i].Pen.Color := clGray;
end;
for i := 10 to 19 do
begin
Bricks[i] := TShape.Create(Form1);
Bricks[i].Parent := Form1;
Bricks[i].Shape := stRectangle;
Bricks[i].Top := 50;
Bricks[i].Left := 49 * (i - 10);
Bricks[i].Width := 48;
Bricks[i].Height := 19;
Bricks[i].Brush.Color := clYellow;
Bricks[i].Pen.Color := clGray;
end;
for i := 20 to 29 do
begin
Bricks[i] := TShape.Create(Form1);
Bricks[i].Parent := Form1;
Bricks[i].Shape := stRectangle;
Bricks[i].Top := 70;
Bricks[i].Left := 49 * (i - 20);
Bricks[i].Width := 48;
Bricks[i].Height := 19;
Bricks[i].Brush.Color := clWhite;
Bricks[i].Pen.Color := clGray;
end;
for i := 30 to 39 do
begin
Bricks[i] := TShape.Create(Form1);
Bricks[i].Parent := Form1;
Bricks[i].Shape := stRectangle;
Bricks[i].Top := 90;
Bricks[i].Left := 49 * (i - 30);
Bricks[i].Width := 48;
Bricks[i].Height := 19;
Bricks[i].Brush.Color := clFuchsia;
Bricks[i].Pen.Color := clGray;
end;
for i := 40 to 49 do
begin
Bricks[i] := TShape.Create(Form1);
Bricks[i].Parent := Form1;
Bricks[i].Shape := stRectangle;
Bricks[i].Top := 110;
Bricks[i].Left := 49 * (i - 40);
Bricks[i].Width := 48;
Bricks[i].Height := 19;
Bricks[i].Brush.Color := clSilver;
Bricks[i].Pen.Color := clGray;
if (ball.Top <= Bricks[i].Top + Ball.Height) and (ball.Left >= Bricks[i].Left + Ball.Width) then
begin //если шарик попадает в Bricks то
Bricks[i].Visible := false;
end;
{ if (Ball.Top + Raket.Height = Raket.Top) and (Ball.Left >= Raket.Left) and (Ball.Left + Ball.Width <= Raket.Left + Raket.Width + Ball.Width) or ((Ball.Top + Ball.Height = Raket.Top) and (Ball.Left <= Raket.Left) and (Ball.Left + Ball.Width >= Raket.Left)) then //если шарик столкнулся с платформой
PosY := -Posy;}
end;
Button1.Visible :=False; // создание массива при нажатии кнопки
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
PosX:= PosX + VelX; // ????? ???????
PosY:= PosY + VelY;
if PosX > ClientWidth - Ball.Width then // если шарик касается правого края то он отлетит в обратную сторону
VelX:= -VelX;
if PosY > ClientHeight - Ball.Height then // если шарик коснется нижнего края
begin
BallMoving := False; //
Timer1.Enabled := False; //
ShowMessage('Game Over'); //
//restart or close
{Ball.Destroy;}
{Raket.Destroy;}
end;
if PosX < 0 then
VelX:= -VelX;
if PosY < 0 then
VelY:= -VelY;
Ball.Left:= Round(PosX); //
Ball.Top := Round(PosY);
{
if (ball.Top <= Bricks[i].Top + Ball.Height) and (ball.Left >= Bricks[i].Left + Ball.Width) then
begin
Brick1.Visible := false; //1
end; }
if InterSectRect(Overlay, Raket.BoundsRect, Ball.BoundsRect) then
begin
{ VelX:= -VelX - Random(7); //
VelY:= -VelY - Random(4); } //
VelX:=VelX*cos(0-180) - Random(5); // неправильный рандом шарика
VelY:=VelY*sin(0-180) - Random(5);
end;
end;
end.