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

  • Автор темы Scabby
  • Дата начала
S

Scabby

Гость
#1
здравствуйте. Мне требуется разработать программку (визуализация) по типу арканоида. Круги (шарики) должны двигаться по форме в 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]
 
B

BurcevD

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

Вложения

A

AlexandrI

Гость
#4
Это как раз то, что я искал! Спасибо!