![]() |
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:
Die Prozedur, die auf Spielende überpüfen soll:
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;
Delphi-Quellcode:
Dann noch der Timer der den Ball steuert:
procedure TForm2.GameOver;
begin if bGameOver = true then begin lblCountdown.Visible:=True; timCountdown.Enabled:=True; end; end;
Delphi-Quellcode:
... und der Countdown-Timer:
procedure TForm2.timBallTimer(Sender: TObject);
begin Wand; //Wandkontakt/-reaktion ermitteln Racket; //Schlägerkontakt/-reaktion ermitteln GameOver;//läuft das Spiel übherhaupt noch? end;
Delphi-Quellcode:
Ich hoffe, ich konnte das halbwegs verständlich darlegen (bin noch neu :wink:. Falls Fragen aufkommen, bitte stellen, ich versuch sie zu beantworten.
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; Danke schonmal im Vorraus, hans ditter. |
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; |
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:
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; |
AW: Tischtennis Problem beim 2. Mal
Zitat:
|
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? |
AW: Tischtennis Problem beim 2. Mal
Zitat:
|
AW: Tischtennis Problem beim 2. Mal
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz