Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2016, 21:08   #1
Dopf
Новичок
Джуниор
 
Регистрация: 02.11.2016
Сообщений: 2
По умолчанию Обработка столкновений, массивы(арканоид) Delphi7

Прошу помощи, только начинаю в программирование.
Пытаюсь создать арканоид, вроде бы почти всё еле еле но готово, но не работает функция столкновения шарика с блоками массива, шарик пролетает насквозь а должен разбивать блок и отскакивать от него, вот собственно код самой функции -
Код:
 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.
Dopf вне форума Ответить с цитированием
Старый 03.11.2016, 18:37   #2
Dopf
Новичок
Джуниор
 
Регистрация: 02.11.2016
Сообщений: 2
По умолчанию

Программисты добрые, подскажите
Dopf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи Delphi7. Полином,Массивы. Dikm Помощь студентам 1 14.03.2013 18:21
Обработка столкновений Granus Gamedev - cоздание игр: Unity, OpenGL, DirectX 34 22.07.2012 14:19
Обработка столкновений с блоками alonix Помощь студентам 14 15.04.2012 19:29
Обработка столкновений окружностей. Вадим Буренков Gamedev - cоздание игр: Unity, OpenGL, DirectX 18 08.03.2010 13:43
массивы в Delphi7 Rom1k Помощь студентам 3 13.12.2008 20:00