ich bin gerade dabei ein kleines Spiel zu programmieren. Im Spiel müssen beliebig viele Kreise erzeugt werden, die dann bewegt werden.
Lösung ist ja eigentlich ganz einfach: record mit Shape und weiteren EIgenschaften des Shapes erstellen, alles als dynamisches Array deklarieren, fertig ist der Lack.
Allerdings habe ich (nach geraumer Zeit, zugegeben) festgestellt, dass es eine Stelle im Code gibt, an dem sich die Größe des Arrays mit den Shapes explosionsartig erhöht, obwohl ich kein SetLength() benutze.
Dies ist der Code:
Code: Alles auswählen
type
TGerm = record //Germ=Bakterie -> ein Shape ist eine Bakterie #nurzurinfo :p
Shape: TShape;
m: extended;
Xo, Yo: integer;
end;
procedure TForm1.StartGame;
var Shapes: array of TGerm;
i, lasti, x: integer;
begin
Stop:=false;
{Create necessary shapes}
SetLength(Shapes, StrToInt(Edit1.Text));
if StrToInt(Edit1.Text)>300 then
begin
CenterLabel(Label1, Field, Label1.Caption);
Label1.Caption:='Lade Spiel';
Label1.Visible:=true;
end;
i:=-1;
lasti:=0;
repeat
Application.ProcessMessages;
if (Label1.Visible=true) and (i=lasti+100) then //kleine Animation, nichts wichtiges
begin
Application.ProcessMessages;
if (Label1.Caption='Lade Spiel.') or (Label1.Caption='Lade Spiel..')
or (Label1.Caption='Lade Spiel') then
begin
Label1.Caption:=Label1.Caption+'.';
end
else
begin
Label1.Caption:='Lade Spiel';
end;
lasti:=i;
end;
Shapes[i].Shape:=TShape.Create(Form1);
Shapes[i].Shape.Parent:=Form1;
Shapes[i].Shape.Left:=random(Field.Width-StrToInt(Edit2.Text))+Field.Left;
Shapes[i].Shape.Top:=random(Field.Height-StrToInt(Edit2.Text))+Field.Top;
Shapes[i].Shape.Shape:=stCircle;
Shapes[i].Shape.Width:=StrToInt(Edit2.Text);
Shapes[i].Shape.Height:=StrToInt(Edit2.Text);
Shapes[i].Shape.Brush.Color:=RGB(Random(256), Random(256), Random(256));
Shapes[i].Shape.Pen.Style:=psClear;
Shapes[i].Xo:=Shapes[i].Shape.Left+Round(Shapes[i].Shape.Width/2); //hier verändert sich die Größe ein wenig
Shapes[i].Yo:=Shapes[i].Shape.Top+Round(Shapes[i].Shape.Height/2); //hier explodiert die Größe
i:=i+1;
until (i=StrToInt(Edit1.Text)-1) or (Stop=true);
//und so weiter und so fort
Grüße
ConcAPPtLab