Einzelnen Beitrag anzeigen

leela
(Gast)

n/a Beiträge
 
#29

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf

  Alt 11. Jan 2005, 20:02
Okay, vergesst alles was auf den 2 Seiten bis jetzt gestanden hat :>
Ich hab nochmal neu angefangen. Hab vorhin mit malo per ICQ gesprochen und er meinte, dass er sein PongSpiel mit Shapes gemacht hat und eben nicht im Canvas.
Ich habs dann auch mal probiert und siehe da : Der Schläger und der Ball bewegen sich. Juchu! Ich musste eben schon kurz feiern.

So ich hab mich aber ein _wenig_ am http://www.delphipraxis.net/internal...highlight=pong orientiert. Nun ist dieses Spiel ja für 2 Spieler konstruiert, aber ich will ja nur einen Spieler.
Der Ball soll also an 3 Wänden abprallen, am Schläger abprallen und eben nur dann durchgehen, wenn da kein Schläger im Weg ist.

Delphi-Quellcode:
type
  TSpielfeld = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Ball: TShape;
    Spieler: TShape;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure bewegen;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Invert(invertx, inverty: Boolean); //Invertieren der Werte fuer das Verschieben
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
        Spielfeld: TSpielfeld;
     punkte: Integer = 0; //Punkte Sp1
   x: Integer = 10;//Verschieben des Balls um [x, y] Pixel
        y: Integer = 10;
   toleranz: Integer = 5; //Toleranz in Pixel beim Beruehren des Balls
   randy: Integer = 10; //Rand bis zu dem sich der Schlaeger bewegen kann
   randx: Integer = 8; // Rand vom Schlaeger bis zum Ende des Fensters links und rechts
   mvspieler: Integer = 10; //Bewegung des Schlaegers in Pixel pro Zeitinterval

implementation

{$R *.dfm}


procedure TSpielfeld.Invert(invertx, inverty: Boolean);
begin
   if invertx then x := -x;
   if inverty then y := -y;
end;

procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    Label1.Visible := False;
    Label2.Visible := False;
  case key of
    vk_space:
      begin
      Label1.Visible := False;
      Label2.Visible := False;
      bewegen;
      end;
    vk_up:
      begin
      Spieler.Tag:= -mvspieler;
      end;
    vk_down:
      begin
      Spieler.Tag:= mvspieler;
      end;
end;
end;

procedure TSpielfeld.bewegen;
begin
   if Ball.Left >= Spielfeld.ClientWidth - Spieler.Width - Ball.Width - randx then
      if (Ball.Top + Ball.Height div 2 >= Spieler.Top - toleranz) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 15) then begin
             Invert(True, False);
               y := -7;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 16) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 45) then begin
              Invert(True, False);
               y := -3;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 46) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 55) then begin
         Invert(True, False);
               y := 0;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 56) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + 85) then begin
              Invert(True, False);
               y := 3;
               x := x - 1;
          end else
          if (Ball.Top + Ball.Height div 2 >= Spieler.Top + 86) and (Ball.Top + Ball.Height div 2 <= Spieler.Top + Spieler.Height + toleranz) then begin
              Invert(True, False);
               y := 7;
               x := x - 1;
      end;

   //oberer und unterer Rand
   if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientHeight - Ball.Height) then
      Invert(False, True);
        if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.ClientWidth - Ball.Width) then
      Invert(False, True);
//hab hier schon versucht das mit der Breite irgendwie hinzubekommen, aber der Ball fliegt trotzdem durch
        if (Ball.Top <= 0) or (Ball.Top >= Spielfeld.Tag - Ball.Tag) then
      Invert(False, True);

   //Eigentliches Verschieben des Balls
   Ball.Left := Ball.Left + x;
   Ball.Top := Ball.Top + y;
end;

procedure TSpielfeld.Timer1Timer(Sender: TObject);
begin
Spielfeld.bewegen;
end;

procedure TSpielfeld.Timer2Timer(Sender: TObject);
begin
      if (Spieler.Top > randy) and (Spieler.Tag < 0) then Spieler.Top := Spieler.Top + Spieler.Tag;
      if (Spieler.Top < Spielfeld.ClientHeight - Spieler.Height - randy) and (Spieler.Tag > 0) then Spieler.Top := Spieler.Top + Spieler.Tag;
     end;

end.
Und wenn der Ball durchfliegt, sollte ein neuer Ball kommen... Kann ich dann irgendwie einen Befehl 'neustarten' einbauen? Wie ist der Befehl?

Ich hoffe ich hab mich jetzt klar genug ausgedrückt
Angehängte Dateien
Dateityp: rar spiel-shape_190.rar (164,6 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat