Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilfe! (https://www.delphipraxis.net/37701-ping-pong-spiel-vereinfacht-brauche-aber-trotzdem-hilfe.html)

leela 10. Jan 2005 20:52

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Ne, geht nicht.

malo 10. Jan 2005 21:01

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
EDIT: Mist gelöscht, ich sollte zum Augenarzt :wall:

//edit2: doch, das muss doch gehen. Du hast eine TSpielfeld-Procedures deklariert, da musst du auch eine TSpielfeld-Procedure implementieren ;)

leela 10. Jan 2005 21:18

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Naja dann gehts wahrscheinlich nur nicht, dass ich damit was machen möchte...

Delphi-Quellcode:
    vk_down: // "runtertaste gedrückt"
    begin
     with TSpielfeld.spieler do // paddle bewegen <- DA FEHLER
         begin
         y1:=y1-10;
         y2:=y2-10;
         end;
    end;
Das geht ja nicht.
[Fehler] Unit1.pas(152): Diese Form des Methodenaufrufs ist nur für Klassenmethoden erlaubt

Also muss ich doch eine Klasse festlegen..
Kann ich das denn irgendwo noch anders implementieren, dass er eben die y-Werte von der Prozedur verändert, wenn ich die Pfeiltasten hoch oder runter gehe..?

malo 11. Jan 2005 13:39

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Das liegt vielleicht daran, dass deine Klasse TSpieler keine Klasse von TSpielfeld ist. Versuch mal das TSpielfeld wegzulassen, also so:

Delphi-Quellcode:
vk_down: // "runtertaste gedrückt"
    begin
     with Tspieler do // paddle bewegen
         begin
         y1:=y1-10;
         y2:=y2-10;
         end;
    end;
:zwinker:

leela 11. Jan 2005 16:24

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also nun geht gar nichts mehr. Ich habs erstmal wieder so gemacht, dass er wenigstens startet und dann nicht der Debugger nervt. ._. Ich lad nochmal das Programm hoch... Die Sachen, die noch in den geschweiften Klammern sind, muss ich irgendwo mit reinbringen...

Delphi-Quellcode:
type
//anfang.. mit uses etc.

  TSpielfeld = class(TForm)
    .... unwichtig
//HIER tSpielerKlasse!!
    type
    tSpieler = class
    x1,x2,y1,y2:integer;
    procedure SpielerErstellen;
    end;
    type
    tBall = class
    x,y,vx,vy,r:Single;
    farbe:tColor;
    procedure init(fNeu:tColor;xNeu,yNeu,vxNeu,vyNeu,rNeu:Single);
    procedure ZeigeDich;
    procedure BewegeDich;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Spielfeld: TSpielfeld;
  ball:tBall;
  spieler:tSpieler;
  punkt:integer = 0;
  BallimSpiel:boolean = false;
  x1,y1,x2,y2:integer;

implementation

{$R *.dfm}

// Muss ich hier noch was verändern? Hier deklarier ich eben die Prozedur.. Nur.. wie ruf ich sie am besten auf und wann?
procedure tSpieler.SpielerErstellen;
begin
with Spielfeld.Bild.Canvas do
    begin
    brush.Color:= clBlue;
    rectangle(x1,y1,x2,y2);
    pen.width:=1;
    brush.style:=bsSolid;
    pen.Mode:= pmNOTXOR;
    end;
x1:=670;
y1:=100;
x2:=680;
y2:=210;
end;

procedure tBall.init(fNeu:tColor;xNeu,yNeu,vxNeu,vyNeu,rNeu:Single);
begin
farbe:= fNeu;
r:= rNeu;
x:= xNeu;
y:= yNeu;
vx:= vxNeu;
vy:=vyNeu;
end;

procedure tBall.ZeigeDich;
begin
with Spielfeld.Bild.Canvas do
    begin
    brush.color:= clRed;
    ellipse(Round (x-r),Round(y-r),Round(x+r),Round(y+r))
    end;
end;

procedure tBall.BewegeDich;
begin
  x:=x+vx;
  y:=y+vy;
  with Spielfeld.Bild do
  begin
    if (x>width+r-1) then
    begin
      inc(punkt);
      Spielfeld.Label3.Caption:=IntToStr(punkt);
      BallimSpiel:=false; // es kann ein neuer ball gestartet werden
         if punkt=10 then
         Showmessage ('Game Over');
    end;
    if x<r+1 then
    begin
      x:=r+1;
      vx:=-vx
    end;
    if (y>height-r-1) then
    begin
      y:= height-r-1;
      vy:=-vy
    end;
    if y< r+1 then
    begin
      y := r+1;
      vy:= -vy
    end
  end
end;

procedure TSpielfeld.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case key of
    vk_space:
    begin
      if BallimSpiel then
        exit;
      with Bild.Canvas do
      begin
        brush.Color:= clWhite;
        rectangle(0,0,Bild.width,Bild.height);
        pen.width:=1;
        brush.style:=bsSolid;
        pen.Mode:= pmNOTXOR;
      end;
      BallimSpiel:=true;
      Ball.init(clWhite,100,200,5,5,15);
      Ball.ZeigeDich;
    end;

//hier soll der Spieler sich eben bewegen.. Nur meckert er da immer mit den Variablen rum, dass ich die nicht richtig deklariert hab.. Und wie sprech ich die Prozedur an? 'with procedure tSpieler do' ? das kann nicht richtig sein, weil das hab ich ja alles schon probiert.. Es nervt, wenn man immer alles ausprobieren muss =(

    vk_down: // "runtertaste gedrückt"
    begin
     {with tSpieler do // paddle bewegen
         begin
         y1:=y1-10;
         y2:=y2-10;
         end; }
    end;
    vk_up: // "hochtaste gedrückt"
    begin
      // paddle bewegen
    end;
  end;
end;

procedure TSpielfeld.Timer1Timer(Sender:TObject);
begin
  if BallimSpiel then
  begin
    {spieler.SpielerErstellen;}
    Ball.ZeigeDich;
    Ball.BewegeDich;
    Ball.ZeigeDich;
  end;
end;

//so hier eben der Schluss...
Ich häng nochmal das komplette Programm mit an. Bitte Leute, ich brauch eure Hilfe. =|

Achja, damits vielleicht schneller geht.. Meine ICQ : 103057471

malo 11. Jan 2005 16:42

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Erstmal: Sag bitte nicht immer nur "geht nicht" und "nun geht gar nichts mehr". Unsere Glaskugeln sagen uns nicht, welcher Fehler da steht ;) Bitte Fehlermeldungen immer genau benennen und sagen, wo der Fehler auftritt. Danke.

Zweitens: Bitte poste nicht immer den ganzen Quelltext, sondern kopier dir genau die Stellen heraus, die nicht funktionieren ;)

Zu den Problemen:

Zitat:

Zitat von leela
Muss ich hier noch was verändern? Hier deklarier ich eben die Prozedur.. Nur.. wie ruf ich sie am besten auf und wann?

Du deklarierst sie nicht, du impelentierst sie da ;) Aber das nur am Rande.
Die Procedure rufst du auf, wenn du sie brauchst. Wenn sie direkt zu Beginn aufgerufen werden soll, dann nutze das OnCreate bzw. OnShow-Event.

Zitat:

Zitat von leela
hier soll der Spieler sich eben bewegen.. Nur meckert er da immer mit den Variablen rum, dass ich die nicht richtig deklariert hab.. Und wie sprech ich die Prozedur an? 'with procedure tSpieler do' ? das kann nicht richtig sein, weil das hab ich ja alles schon probiert.. Es nervt, wenn man immer alles ausprobieren muss =(

bei WELCHEN variablen meckert er?!?! Meine Teeblätter hab ich verliehen, sorry :wall:

Und die Procedure selbst kannst du nicht ansprechen. Was willst du denn genau mit der Procedure dann machen? Wenn du uns das sagst, kann vllt geholfen werden!



Also: die Probleme nochmal ganz genau erklären und die Fehlermeldungen auflisten und hinschreiben, wann welcher Fehler kommt ;)

leela 11. Jan 2005 17:10

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

Zitat von malo
bei WELCHEN variablen meckert er?!?! Meine Teeblätter hab ich verliehen, sorry :wall:

Bei x1,x2,y1,y2. Das sind ja die Eckpunkte vom Rechteck (Spieler), die ich eigentlich in der Prozedur SpielerErstellen hab.

Fehler : [Hinweis] Unit1.pas(63): Auf 'y2' zugewiesener Wert wird niemals benutzt
und das dann eben auch mit x1, x2, y1.

Delphi-Quellcode:
procedure tSpieler.SpielerErstellen(x1,y1,x2,y2: integer);
begin
with Spielfeld.Bild.Canvas do
    begin
    brush.Color:= clBlue;
    rectangle(x1,y1,x2,y2);
    pen.width:=1;
    brush.style:=bsSolid;
    pen.Mode:= pmNOTXOR;
    end;
x1:=670; // da ist der Fehler
y1:=100;
x2:=680;
y2:=210;
end;
Habs eben gestestet.. Wenn ich das wegmache, dann gehts. Aber dann hat er ja immer noch nicht den Spieler erstellt. Moment ich probier das eben noch mit dem OnShow-Event aus..

Zitat:

Zitat von malo
Und die Procedure selbst kannst du nicht ansprechen. Was willst du denn genau mit der Procedure dann machen? Wenn du uns das sagst, kann vllt geholfen werden!

Also eigentlich will ich ja mit der Prozedur SpielerErstellen dann später sagen, dass die sich halt bewegen soll. Also, dass sich der Spieler bewegen soll. Oder soll ich dann lieber ne Prozedur schreiben SpielerBewegen ?

Und ich versuch mal ein neues Projekt mit den Shapes.

Maximus 11. Jan 2005 17:18

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Delphi-Quellcode:
 vk_down: // "runtertaste gedrückt"
    begin
     with Spieler do // paddle bewegen
        begin
         y1:=y1-10;
         y2:=y2-10;
        end;
    end;
Ähm müsste das nicht nur Spieler heißen? - Spieler ist doch die Variable vom Typ TSpieler ... also muss man die Werte ja in der Variable ändern, oder?

leela 11. Jan 2005 20:02

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 ;)

malo 12. Jan 2005 15:47

Re: Ping Pong Spiel vereinfacht.. Brauche aber trotzdem Hilf
 
Bitte nochmal: POSTE NICHT IMMER DEN GANZEN QUELLCODE!!!

Kopiere bitte nur die Stellen raus, die wirklich Probleme machen. Und mach am besten für jede Frage einen eigenen Thread auf.

Dein einziges Problem scheint ja hier zu liegen:
Delphi-Quellcode:
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
Da fragt man sich doch 2 Sachen: 1. Wofür braucht man den ganzen Restlichen Quelltext ( :roll: ) und 2. WELCHE BREITE?!?!

Bitte das mal genauer Erklären, am besten in Eigenem Thread mit aussagelräftigem Titel ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:50 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz