Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
Delphi 2007 Professional
|
2D Game: Ball an einem Arc abprallen lassen (physikalisch)
26. Feb 2010, 17:20
Hallo, ich bin gerade dabei, ein 2D Spiel zu erstellen. Es soll eine Art Slime-Soccer-Klon werden.
Ich habe einen Timer, der erst prüft, ob die Spielfigur bewegt werden muss und sie dann bewegt und dann die Prozedur "Zeichne" aufruft, die das Ganze dann auf einem Image darstellt. Hier mein bisheriger Quelltext:
Delphi-Quellcode:
var
Form1: TForm1;
X1,X2,Y1,Y2,BX,BY: integer;
W,A,D,I,J,L, Hoch1, Hoch2:Boolean; //Speichern, ob die Tasten gedrückt sind.
implementation
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Spieler 1 : W A D
if Key = 87 then W:=True;
if Key = 65 then begin A:=True; D:=False; end;
if Key = 68 then begin D:=True; A:=False; end;
// Spieler 2 : I J L
if Key = 73 then I:=True;
if Key = 74 then begin J:=True; L:=False; end;
if Key = 76 then begin L:=True; J:=False; end;
end;
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Spieler 1 : W A D
if Key = 87 then W:=False;
if Key = 65 then A:=False;
if Key = 68 then D:=False;
// Spieler 2 : I J L
if Key = 73 then I:=False;
if Key = 74 then J:=False;
if Key = 76 then L:=False;
//Spieler 1 : S
if Key = 83 then Hoch1:=False;
//Spieler 2 : K
if Key = 75 then Hoch2:=False;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if W then if Y1=Bild.height-30 then Hoch1:=True;
//Hoch1 bearbeiten
begin
if Y1=Bild.height-210 then Hoch1:=False;
if Hoch1 then
begin
Y1:=Y1-2;
if Y1>Bild.height-190 then Y1:=Y1-2;
end
else
begin
if Y1<Bild.height-30 then
begin
Y1:=Y1+2;
if Y1>Bild.height-190 then Y1:=Y1+2;
end;
end;
end;
//Links/rechts Spieler 1 bearbeiten
if (A) and (X1>0) then
begin
//Links
X1:=X1-3;
end;
if (D) and (X1<Bild.width-60) then
begin
//Links
X1:=X1+3;
end;
if I then if Y2=Bild.height-30 then Hoch2:=True;
//Hoch2 bearbeiten
begin
if Y2=Bild.height-210 then Hoch2:=False;
if Hoch2 then
begin
Y2:=Y2-2;
if Y2>Bild.height-190 then Y2:=Y2-2;
end
else
begin
if Y2<Bild.height-30 then
begin
Y2:=Y2+2;
if Y2>Bild.height-190 then Y2:=Y2+2;
end;
end;
end;
//Links rechts Spieler 2
if (J) and (X2>0) then
begin
//Links
X2:=X2-3;
end;
if (L) and (X2<Bild.width-60) then
begin
//Links
X2:=X2+3;
end;
Zeichne;
end;
procedure TForm1.Zeichne;
begin
Bild.Canvas.Brush.color:=Clwhite;
Bild.Canvas.Fillrect(Rect(0,0,Bild.width,Bild.height));
//Spieler 1
Bild.Canvas.Brush.color:=clnavy;
Bild.Canvas.Arc(X1,Y1,X1+60,Y1+60,X1+60,Y1+29,X1,Y1+29);
Bild.Canvas.MoveTo(X1,Y1+28);
Bild.Canvas.LineTo(X1+60,Y1+28);
Bild.Canvas.FloodFill(X1+30,Y1+25,clblack,fsborder);
Bild.Canvas.FloodFill(X1+58,Y1+25,clblack,fsborder);
Bild.Canvas.FloodFill(X1+2,Y1+25,clblack,fsborder);
//Spieler 2
Bild.Canvas.Brush.color:=clmaroon;
Bild.Canvas.Arc(X2,Y2,X2+60,Y2+60,X2+60,Y2+29,X2,Y2+29);
Bild.Canvas.MoveTo(X2,Y2+28);
Bild.Canvas.LineTo(X2+60,Y2+28);
Bild.Canvas.FloodFill(X2+30,Y2+25,clblack,fsborder);
Bild.Canvas.FloodFill(X2+58,Y2+25,clblack,fsborder);
Bild.Canvas.FloodFill(X2+2,Y2+25,clblack,fsborder);
//Ball
Bild.Canvas.Brush.color:=clblack;
Bild.Canvas.Ellipse(BX-10,BY-10,BX+10,BY+10);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Y1:=Bild.height-30;
X1:=100;
Y2:=Bild.height-30;
X2:=600;
end;
Soweit kein Problem. Ich habe jetzt also eine rote und eine blaue Spielfigur, die man bewegen kann und einen Ball der auf dem Canvas hängt.
Jetzt muss ich nur noch den Ball in Bewegung bekommen. Dieser soll physikalisch halbwechs korrekt (Winkel und Geschwindigkeit) von den Spielfiguren abprallen. Außerdem soll er von der Torlatte abprallen (existiert hier noch nicht, soll einfach ein Rechteck sein, was am Bildrand hängt).
Liebe Grüße!
|