AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit Kollisionsabfrage (erledigt)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Kollisionsabfrage (erledigt)

Ein Thema von malo · begonnen am 6. Jan 2005 · letzter Beitrag vom 7. Jan 2005
Antwort Antwort
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#1

Problem mit Kollisionsabfrage (erledigt)

  Alt 6. Jan 2005, 17:51
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? Ich find ihn einfach nicht
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:15
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#3

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:20
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

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*
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:24
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
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#5

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:35
1. war das gar nicht falsch, es hat im Gegenteil wunderbar geklappt

2. Mit deinem Code tänzelt mein Ball auf dem Spielfeld herum Außerdem ist er sehr unsauber geschrieben

3. Liegt mein Problem eher im anderen Teil des Codes, der, der ausgeführt werden soll, wenn der Ball daneben geht
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:38
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.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#7

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:43
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. Außerdem hast du das etwas zu eng geschrieben, für meine Verhältnisse

so sieht es ordentlich aus:
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

Und zu guter letzt: Bitte verwende die [ delphi ] [/ delphi ]-Tags um Sourcecode auzurücken, danke
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Problem mit Kollisionsabfrage

  Alt 6. Jan 2005, 18:49
ich äußere mich dazu jetzt nicht.
wenn du nochmal hilfe brauchst, von mir kriegst keine.
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von malo
malo

Registriert seit: 19. Sep 2004
2.115 Beiträge
 
#9

Re: Problem mit Kollisionsabfrage

  Alt 7. Jan 2005, 12:09
Ok, hat sich jetzt erledigt, ich weiß wo das Problem war

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

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 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