Столкновение шаров в Delphi (по принципу арканоида).срочно.

Тема в разделе "Delphi - FAQ", создана пользователем Scabby, 28 янв 2009.

  1. Scabby

    Scabby Гость

    здравствуйте. Мне требуется разработать программку (визуализация) по типу арканоида. Круги (шарики) должны двигаться по форме в 8 направлениях, сталкиваясь с другими шарами и со стенками формы отталкиваться, не сливаясь сдругими шарами и без разных странных приключений.
    Я смогла сделать только для одного шарика.Он движется во все направления и отталкивается от стенок. Программка полностью работает.Нет ни массивов, ни матриц.Но скорее всего как раз как-то нужно с матрицами или массивами оперировать.

    надо как-то сделать следущее:
    1. в написаннии алгоритма *рисования* n-количества шаров
    2.чтобы они все двигались
    3.отталкивались друг от друга и стенок.

    моя рабочая прога для 1 шарика

    [codebox]unit Unit1;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ExtCtrls, StdCtrls;
    type
    TDirection=(dLeft,dUpleft,dupright,dright,
    ddownright,ddownleft,ddown,dup);
    TBall=record
    Button1: TButton;
    id:byte;
    size:byte;
    Direction:TDirection;
    Speed:byte;
    Color:TColor;
    BorderColor:TColor;
    end;
    TForm1 = class(TForm)
    Paint: TButton;
    Image1: TImage;
    Timer1: TTimer;
    Timer2: TTimer;

    procedure Timer1Timer(Sender: TObject);

    procedure PaintClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);


    { Private declarations }
    public
    { Public declarations }

    end;

    var
    Form1: TForm1;
    MyBMP:TBitmap;
    ball:TBall;
    I:integer;
    x,y,x1,y1,n,b,k:integer;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    {n:=10; 'число шарок'

    r:=10;

    'радиус шаров }

    x:=120;
    y:=120;
    x1:=140;
    y1:=140;
    end;

    procedure TForm1.PaintClick(Sender: TObject);
    begin
    if( Timer1.Enabled ) Then
    Timer1.Enabled := false
    else
    Timer1.Enabled := true;
    randomize();

    Ball.Direction:= TDirection ( random(8) );

    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    MyBMP:=TBitmap.Create;
    MyBMP.Width:=500;
    MyBMP.Height:=500;
    MyBMP.Canvas.Pen.Color:=clRed;
    MyBMP.Canvas.Pen.Width:=1;
    MyBMP.Canvas.Brush.Color:=clRed;

    { for k:=1 to n do begin

    }

    case Ball.Direction of
    dLeft: begin
    x:=x-1;
    y:=y;
    x1:=x1-1;
    y1:=y1;

    end;

    dUpleft: begin
    x:=x-1;
    y:=y-1;
    x1:=x1-1;
    y1:=y1-1;
    end;

    dupright: begin
    x:=x+1;
    y:=y-1;
    x1:=x1+1;
    y1:=y1-1;
    end;

    dright: begin
    x:=x+1;
    y:=y;
    x1:=x1+1;
    y1:=y1;
    end;

    ddownright: begin
    x:=x+1;
    y:=y+1;
    x1:=x1+1;
    y1:=y1+1;
    end;

    ddownleft: begin
    x:=x-1;
    y:=y+1;
    x1:=x1-1;
    y1:=y1+1;
    end;
    ddown: begin
    x:=x;
    y:=y+1;
    x1:=x1;
    y1:=y1+1;
    end;

    dup: begin
    y:=y-1;
    x1:=x1;
    x:=x;
    y1:=y1-1;

    end;
    end;

    if x=0 then
    begin
    if( Ball.Direction = dLeft ) Then Ball.Direction:= dright;
    if( Ball.Direction = dUpleft ) Then Ball.Direction:= dupright;
    if( Ball.Direction = ddownleft ) Then Ball.Direction:= ddownright;
    end;

    if y=0 then
    begin
    if( Ball.Direction = dUpleft ) Then Ball.Direction:= ddownright;
    if( Ball.Direction = dup ) Then Ball.Direction:= ddown;
    if( Ball.Direction = dupright ) Then Ball.Direction:= ddownright;
    end;

    if x1 = Image1.Width then
    begin
    if( Ball.Direction = dright ) Then Ball.Direction:= dLeft;
    if( Ball.Direction = ddownright ) Then Ball.Direction:= ddownleft;
    if( Ball.Direction = dupright ) Then Ball.Direction:=dUpleft;
    end;

    if y1 = Image1.Height then
    begin
    if( Ball.Direction = ddown ) Then Ball.Direction:= dup;
    if( Ball.Direction = ddownleft ) Then Ball.Direction:= dUpleft;
    if( Ball.Direction = ddownright ) Then Ball.Direction:= dupright;
    end;

    MyBMP.Canvas.ellipse(x,y,x1,y1);
    Image1.Picture.Bitmap:=MyBMP;
    MyBMP.Free;

    end;

    end.

    [/codebox]
     
  2. BurcevD

    BurcevD Гость

    Вот есть такой вариант, правда шары не рисуются, а имеются как готовые компоненты SHape, но алгоритм можно взять этот
     

    Вложения:

    • AnyBalls.rar
      Размер файла:
      6,2 КБ
      Просмотров:
      158
  3. Scabby

    Scabby Гость

    cпасибо, попробую
     
  4. AlexandrI

    AlexandrI Гость

    Это как раз то, что я искал! Спасибо!
     
Загрузка...
Похожие Темы - Столкновение шаров Delphi
  1. admin
    Ответов:
    4
    Просмотров:
    3.342

Поделиться этой страницей