![]() |
Problem mit Kollisionsabfrage (erledigt)
Ich bin grad dabei einen kleinen Pong-Klon zu schreiben. Dazu hab ich eine Kollisionsabfrage geschrieben. Diese funktioniert auch soweit, nur die Handlung, wenn der Ball nicht getroffen wurde, wird nicht ausgeführt... Hier einmal der ganze Code mit Kollisionsabfrage:
Delphi-Quellcode:
Wo ist der Fehler darin? :gruebel: Ich find ihn einfach nicht :(
if Ball.Top >= Schlaeger1.Top-25 then // Kollision mit Schlaeger 1
begin if (Ball.Left < Schlaeger1.Left+Schlaeger1.Width) and (Ball.Left > Schlaeger1.Left) then begin Richtung := not Richtung; inc(y_move); end else begin // Ball nicht gefangen if Ball.Top = Schlaeger1.Top then begin Timer1.Enabled := false; // der Ball wird gestoppt ShowMessage('Spieler2 hat einen Punkt!'); Ball.Top := 208; // Ball wird auf Startposition zurückgesetzt Ball.Left := 312; end; end; end; |
Re: Problem mit Kollisionsabfrage
da kommen mir 2 sachen extrem spanisch vor:
if (Ball.Left < Schlaeger1.Left+Schlaeger1.Width) or (Ball.Left > Schlaeger1.Left) then und if Ball.Top = Schlaeger1.Top then begin |
Re: Problem mit Kollisionsabfrage
Zitat:
Das obere soll ausdrücken, wenn er auf den Schläger (der von rechts nach links geht) trifft, soll der code ausgeführt werden. das zweite steht eigendlich am anfang. Der Code soll dann halt nur ausgeführt werden, wenn der Ball auf Schlägerhöhe ist. //edit: wobei ich besser den Operator "or" durch "and" ersetzen sollte ;) *das auch gleich mach* |
Re: Problem mit Kollisionsabfrage
tjo also zum ersten, ists halt falsch..
ich würde es so machen: if ball.left > schläger.left and ball.left+ball.width < schläger.left+schläger.width then begin // ball ist horizontal innerhalb des schlägers wenn du das noch mit if ball.top+ball.height >= schläger.top then begin verfeinerst, reagiert es auch vertikal nurnoch, wenn es auf oder hinter dem schläger (darunter) ist. also das war jetzt der code für den unteren schläger |
Re: Problem mit Kollisionsabfrage
1. war das gar nicht falsch, es hat im Gegenteil wunderbar geklappt ;)
2. Mit deinem Code tänzelt mein Ball auf dem Spielfeld herum :gruebel: Außerdem ist er sehr unsauber geschrieben :roll: 3. Liegt mein Problem eher im anderen Teil des Codes, der, der ausgeführt werden soll, wenn der Ball daneben geht ;) |
Re: Problem mit Kollisionsabfrage
Zitat:
Code:
und wie sieht er sauber aus? das ich evtl auch mal lerne, wie man sauberen code macht.
Außerdem ist er sehr unsauber geschrieben Rolling Eyes
|
Re: Problem mit Kollisionsabfrage
Zitat:
so sieht es ordentlich aus:
Delphi-Quellcode:
if (ball.left > schlaeger1.left) and (ball.left + ball.width < schlaeger1.left + schlaeger1.width) then
Und wo ist übrigens dein Pseudocode? ich seh da keinen :gruebel: Und zu guter letzt: Bitte verwende die [ delphi ] [/ delphi ]-Tags um Sourcecode auzurücken, danke ;) |
Re: Problem mit Kollisionsabfrage
ich äußere mich dazu jetzt nicht.
wenn du nochmal hilfe brauchst, von mir kriegst keine. |
Re: Problem mit Kollisionsabfrage
Ok, hat sich jetzt erledigt, ich weiß wo das Problem war :wall:
Delphi-Quellcode:
Ich hab diese Stelle, die ja nach dem else-Abschnitt kommt, ausgeklammert. Delphi hat die Stelle ignoriert, weil die Ball-Position ja oben bereits abgefragt worden war und unten nochmal. Demnach müsste der Ball an zwei Positionen GLEICHZEITIG sein :wall:
if Ball.Top = Schlaeger1.Top then begin
Das hab ich allerdings gemacht, weil mein Ball sonst zu früh gestoppt hat. Also bevor er an den Spielfeldrand kommt. Und ich hab mir dummerweise halt gedacht, dass ich das durch eine erneute Positionsabfrage lösen könnte und den Code erst später ausführen lasse... naja, falsch gedacht :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:28 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