Einzelnen Beitrag anzeigen

Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

2D Game: Ball an einem Arc abprallen lassen (physikalisch)

  Alt 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!
  Mit Zitat antworten Zitat