Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Tischtennis Problem beim 2. Mal (https://www.delphipraxis.net/152920-tischtennis-problem-beim-2-mal.html)

hans ditter 12. Jul 2010 22:22

Tischtennis Problem beim 2. Mal
 
Hallo alle zusammen. Ich habe so'n Tischtennisspiel programmiert, wisst schon, mit 2 Schlägern links und rechts und 'nem Ball... :feuerchen:
Damit dann auch mal jemand gewinnt, lasse ich überprüfen, ob der Ball weiter rechts bzw. links als die Schläger sind. Falls ja, läuft ein Countdown runter, der Ball wird zentriert, die Spielvorbeivariable (bGameOver: boolean) wird auf False gesetzt.
Wenn der Ball dann aber ein 2. Mal hinter einen der Schläger kommt, dann funktioniert das Ganze plötzlich nicht mehr. Der Ball wandert dann im Sekundentakt ungefähr vorwärts während das Label mit dem Countdown angezeigt wird, der Timer dafür aber nicht mehr läuft.

Hier die beiden Überprüfungen, ob der Ball hinter dem Schläger ist:
Delphi-Quellcode:
if shBall.Left < shRacketL.Left then //Rückschlag von l. Wand
    begin
      shBall.Brush.Color:=clred;
      timBall.Enabled:=false;
      bGameOver:=true;
    end;
    //---------------------------------------
    if shBall.Left > shRacketR.Left then //Rückschlag von r. Wand
    begin
      shBall.Brush.Color:=clred;
      timBall.Enabled:=false;
      bGameOver:=true;
    end;
Die Prozedur, die auf Spielende überpüfen soll:
Delphi-Quellcode:
procedure TForm2.GameOver;
begin
  if bGameOver = true then
  begin
    lblCountdown.Visible:=True;
    timCountdown.Enabled:=True;
  end;
end;
Dann noch der Timer der den Ball steuert:
Delphi-Quellcode:
procedure TForm2.timBallTimer(Sender: TObject);
begin
  Wand; //Wandkontakt/-reaktion ermitteln
  Racket; //Schlägerkontakt/-reaktion ermitteln
  GameOver;//läuft das Spiel übherhaupt noch?
end;
... und der Countdown-Timer:
Delphi-Quellcode:
procedure TForm2.timCountdownTimer(Sender: TObject);
begin
  scrbCountdown.Position:=scrbCountdown.Position + 1;
  case scrbCountdown.Position of
  0: lblCountdown.Caption:='5 ...';
  1: lblCountdown.Caption:='4 ...';
  2: lblCountdown.Caption:='3 ...';
  3: lblCountdown.Caption:='2 ...';
  4: lblCountdown.Caption:='1 ...';
  5: begin
      lblCountdown.Caption:='GO !';
      shBall.Left:=panPlayGround.Width div 2;
      shBall.Top:=panPlayGround.Width div 2;
     end;
  6: begin
      lblCountdown.Visible:=False;
      lblCountdown.Caption:='5 ...';
      timBall.Enabled:=True;
      timCountdown.Enabled:=False;
      bGameOver:=false;
     end;
  end;
end;
Ich hoffe, ich konnte das halbwegs verständlich darlegen (bin noch neu :wink:. Falls Fragen aufkommen, bitte stellen, ich versuch sie zu beantworten.

Danke schonmal im Vorraus, hans ditter.

s.h.a.r.k 12. Jul 2010 23:39

AW: Tischtennis Problem beim 2. Mal
 
Wo setzt du denn die Position von Position zurück auf 0? (scrbCountdown.Position)

Noch ein paar Tipps:
Delphi-Quellcode:
if shBall.Left < shRacketL.Left then //Rückschlag von l. Wand
    begin
      shBall.Brush.Color:=clred;
      timBall.Enabled:=false;
      bGameOver:=true;
    end;
    // Mach doch hier ein ELSE-IF, denn du musst hier ja nicht mehr
    // wenn weiter oben schon das if true ist
    if shBall.Left > shRacketR.Left then //Rückschlag von r. Wand
    begin
      shBall.Brush.Color:=clred;
      timBall.Enabled:=false;
      bGameOver:=true;
    end;
Delphi-Quellcode:
 // bitte nicht auf true testen. bGameOver ist doch schon
  // ein Boolean, ergo brauchst du das nicht machen. Gründe hierfür
  // findest du auch im Forum.
  if bGameOver = true then
  begin
    lblCountdown.Visible:=True;
    timCountdown.Enabled:=True;
  end;
end;
Delphi-Quellcode:
{ ... }
  // hier würde ich noch die Reihenfolge ändern
  6: begin
      // lblCountdown.Visible:=False;
      // lblCountdown.Caption:='5 ...';
      // timBall.Enabled:=True;
      // timCountdown.Enabled:=False;
      // bGameOver:=false;

      // nach:

      lblCountdown.Visible:=False;
      lblCountdown.Caption:='5 ...';
      bGameOver:=false;
      timCountdown.Enabled:=False;
      timBall.Enabled:=True;

     // Warum? Weil so sichergestellt ist, dass nicht doch der
     // Timer timBall feuert, obwohl nicht alle Variablen gesetzt
     // sind. Ich weiß, sowas ist kleinlich und kann je nach Interval
     // von timBall nicht eintreten, aber sicher ist sicher. In
     // anderen Fällen kann sowas evtl. schief gehen.
     end;
  end;
end;

fui-tak 13. Jul 2010 17:30

AW: Tischtennis Problem beim 2. Mal
 
Zitat:

Zitat von hans ditter (Beitrag 1035042)
Wenn der Ball dann aber ein 2. Mal hinter einen der Schläger kommt, dann funktioniert das Ganze plötzlich nicht mehr. Der Ball wandert dann im Sekundentakt ungefähr vorwärts während das Label mit dem Countdown angezeigt wird, der Timer dafür aber nicht mehr läuft.



Welcher Timer ist denn für die Ballbewegung zuständig? Ich tippe auf timBall.
Wenn das so ist, dann hast du vielleicht das vergessen:

Delphi-Quellcode:
procedure TForm2.GameOver;
begin
  if bGameOver = true then
  begin
    lblCountdown.Visible:=True;
    timCountdown.Enabled:=True;
    timBall.enabled := false;//diese Zeile meine ich
  end;
end;

s.h.a.r.k 13. Jul 2010 22:12

AW: Tischtennis Problem beim 2. Mal
 
Zitat:

Welcher Timer ist denn für die Ballbewegung zuständig? Ich tippe auf timBall.
Wenn das so ist, dann hast du vielleicht das vergessen:
Nein, hat er nicht. Schau dir mal die Kollisionsabfrage an.

hans ditter 14. Jul 2010 00:23

AW: Tischtennis Problem beim 2. Mal
 
hmm... erstmal danke für die Antworten. Allerdings hat sich damit das Problem noch nicht gelöst. Erstmal hab ich die Ideen von S.h.a.r.k geändert, schienen mir doch logisch.
Aber mein Problem hat es noch nicht gelöst.... :wall:

Hat da irgendjemand eine zündende Idee, woran es liegen könnte? Oder soll ich mal den gesamten Code hochladen, dass ihr euch den mal anschauen könnt?

Blup 14. Jul 2010 07:04

AW: Tischtennis Problem beim 2. Mal
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1035045)
Wo setzt du denn die Position von Position zurück auf 0? (scrbCountdown.Position)

Das ist das Problem. Wenn "timCountdown" aktiviert wird, muss immer auch scrbCountdown.Position zurück auf 0 gesetzt werden.

hans ditter 14. Jul 2010 13:24

AW: Tischtennis Problem beim 2. Mal
 
Zitat:

Zitat von Blup (Beitrag 1035194)
Zitat:

Zitat von s.h.a.r.k (Beitrag 1035045)
Wo setzt du denn die Position von Position zurück auf 0? (scrbCountdown.Position)

Das ist das Problem. Wenn "timCountdown" aktiviert wird, muss immer auch scrbCountdown.Position zurück auf 0 gesetzt werden.

Erstmal Danke an alle. Und das hab ich dann wohl überlesen. 'Tschuldige bitte! Auf jeden Fall funzt es jetzt! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.

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