Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Kollisionsabfrage (erledigt) (https://www.delphipraxis.net/37506-problem-mit-kollisionsabfrage-erledigt.html)

malo 6. Jan 2005 16:51


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:
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;
Wo ist der Fehler darin? :gruebel: Ich find ihn einfach nicht :(

supermuckl 6. Jan 2005 17:15

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

malo 6. Jan 2005 17:20

Re: Problem mit Kollisionsabfrage
 
Zitat:

Zitat von supermuckl
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

Ähm, das ist meine eigentliche Kollisionsabfrage :oops:

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*

supermuckl 6. Jan 2005 17:24

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

malo 6. Jan 2005 17:35

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 ;)

supermuckl 6. Jan 2005 17:38

Re: Problem mit Kollisionsabfrage
 
Zitat:

Mit deinem Code tänzelt mein Ball auf dem Spielfeld herum
kann nur an deiner fehlinterpretation meines pseudocodes liegen

Code:
Außerdem ist er sehr unsauber geschrieben Rolling Eyes
und wie sieht er sauber aus? das ich evtl auch mal lerne, wie man sauberen code macht.

malo 6. Jan 2005 17:43

Re: Problem mit Kollisionsabfrage
 
Zitat:

Zitat von supermuckl

und wie sieht er sauber aus? das ich evtl auch mal lerne, wie man sauberen code macht.

das unsaubere liegt hauptsächlich darin, dass ich keinen "Schläger" sondern nur einen "Schlaeger1" habe (Umlaute gibt es in Delphi z.B. nicht) und dass die Befehle rechts und links vom "and"-Operator nicht ausgeklammert sind. :roll: Außerdem hast du das etwas zu eng geschrieben, für meine Verhältnisse ;)

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 ;)

supermuckl 6. Jan 2005 17:49

Re: Problem mit Kollisionsabfrage
 
ich äußere mich dazu jetzt nicht.
wenn du nochmal hilfe brauchst, von mir kriegst keine.

malo 7. Jan 2005 11:09

Re: Problem mit Kollisionsabfrage
 
Ok, hat sich jetzt erledigt, ich weiß wo das Problem war :wall:

Delphi-Quellcode:
if Ball.Top = Schlaeger1.Top then begin
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:

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 18:28 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