Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Geschwindigkeit umkehren (https://www.delphipraxis.net/171532-geschwindigkeit-umkehren.html)

DelphiUser1 10. Nov 2012 23:21

Geschwindigkeit umkehren
 
Guten Abend alle miteinander.
Momentan arbeite ich an einem kleinen Spiel, in dem es darum geht, Kreise zu vernichten. Diese Kreise werden mit einem timer erzeugt (array of TKreis).
Sie haben eine grundgeschwindigkeit von speedx=5 und speedy=5. Es gibt Objectives und Weapons, unter Objectives findet man unter anderem eine Kiste. Ich bewege sie in dem ich ihr einfach die mausposition zuweise. Das Problem ist das ich nicht weiß wie ich eine gute Kollision hinbekomme. Kollidieren die Kiste und ein kreis wird der kreis momentan in die selbe richtung aus der er kam zurückgeschleudert. ich will aber einfallswinkel gleich ausfallswinkel. Was ich bisher ausprobiert habe (ohne Erfolg):

Delphi-Quellcode:
if InterSectRect(StubRect,Kreis[b].BoundsRect,Image3.BoundsRect) and Image3.Visible then
    begin
      Kreis[b].speedx := -(Kreis[b].speedx);
      Kreis[b].speedy := -(Kreis[b].speedy);
      end;
    end;
und:


Delphi-Quellcode:
if InterSectRect(StubRect,Kreis[b].BoundsRect,Image3.BoundsRect) and Image3.Visible then
    begin
      Kreis[b].speedx := -Abs(Kreis[b].speedx);
      Kreis[b].speedy := -Abs(Kreis[b].speedy);
      end;

nuclearping 10. Nov 2012 23:27

AW: Geschwindigkeit umkehren
 
Wenn du nur die Speed-Werte umkehrst, ist es ja klar, dass der Kreis in exakt die selbe Richtung zurückfliegt, aus die er kam.

Was du noch brauchst ist eine Feststellung aus welcher Richtung die Kollision kommt und musst entsprechend darauf reagieren.

Von oben und unten: Y = -Y
Von links und rechts: X = -X

PS: Ich würde empfehlen, dass du dir auch mal Andorra 2D anschaust. Die VCL (TImage, ...) als Sprites zu verwenden ist auf lange Frist keine effiziente Lösung.

DelphiUser1 10. Nov 2012 23:32

AW: Geschwindigkeit umkehren
 
ja ich weiß, das ist mir auch bewusst, nur ich wusste nicht wie es richtig geht.
Wieso soll ich kein Image verwenden?
Ist schon etwas später, wie genau stellst du dir die Abfrage vor. ich hatte überlegt man könnte es mit dem Satz des Pythagoras machen, aber gibt es nicht noch was einfacheres?

himitsu 11. Nov 2012 00:14

AW: Geschwindigkeit umkehren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Prinzip ist es einfache Mathematik.

Du hast 2 Vektoren, der aufeinandertreffenden Objekte.
Daraus kannst du eine Aufschlagebene berechnen, wie die Kräfte aufeinandertreffen.
Und darüber berechnest du dann jeweils die Winkel, wie es weitergeht.



Aber im Prinzip kommt dann noch mehr mit rein, wenn man es genau machen will.
- die jeweilige Geschwindigkeit der Objekte
- und die Größe/Masse
(also ob z.B. Kraft von einem Objekt auf das Andere übertragen wird)
- und teilweise auch die Form der Objekte, denn jenachdem wie und an welche Stelle der Aufschlag geschieht, kann sich das auch noch auswirken

nuclearping 11. Nov 2012 00:35

AW: Geschwindigkeit umkehren
 
Zitat:

Zitat von DelphiUser1 (Beitrag 1190674)
Ist schon etwas später, wie genau stellst du dir die Abfrage vor. ich hatte überlegt man könnte es mit dem Satz des Pythagoras machen, aber gibt es nicht noch was einfacheres?

Du kennst doch die Dimensionen deiner Objekte? Also X, Y, Höhe, Breite? Daraus kannst du bestimmen, von welcher Richtung das Quellobjekt kommt.

Code:
Wenn Kollision Dann
  Wenn Quellobjekt.Y + Quellobjekt.Höhe >= Zielobjekt.Y Dann
    Kollisionsrichtung = Von oben
  Wenn Quellobjekt.X + Quellobjekt.Breite >= Zielobjekt.X Dann
    Kollisionsrichtung = Von links
...
Nur als grobes Beispiel.

Medium 11. Nov 2012 02:04

AW: Geschwindigkeit umkehren
 
Nennt sich dann (Voll) Elastischer Stoß

nuclearping 11. Nov 2012 03:07

AW: Geschwindigkeit umkehren
 
Erinnert mich fast an http://einklich.net/rec/eins.htm :mrgreen:

Medium 11. Nov 2012 03:21

AW: Geschwindigkeit umkehren
 
Zugegeben: Mathematische Wipkipedia Artikel tendieren teilweise stark zu unnötig komplexen Formeln und Symbolgeilheit (oftmals wirklich für das breite Publikum unangemessen verklausuliert). Hier finde ich es aber doch noch recht okay - sind ja wirklich nur Grundrechenarten :) Wenn man die Formeln ein wenig auseinanderklamüsert sieht man, dass das an sich ziemlich popelig ist. Schaut auf den ersten Blick nur gewaltig aus.
In diesem Fall nicht nötig: Aber wenn man sich einfach mal vor Augen hält, dass eine Summenformel nichts weiter ist, als eine for-Schleife mit der Formel dahinter im Rumpf, verlieren zumindest diese schon mal ihre abschreckende Wirkung =)

Die Seite ist aber eine ziemlich herrliche Satire! Manchmal fühlt man sich echt so :)

DelphiUser1 11. Nov 2012 15:41

AW: Geschwindigkeit umkehren
 
Danke für die Lösung. Ich habe jetzt mal angefangen mit der Kollision
Delphi-Quellcode:
if (Kreis[b].y+Kreis[b].Height)>Image3.Height then    //Kreis kommt von oben
      Kreis[b].speedy := -Abs(Kreis[b].speedy);
und das funktioniert auch alles soweit, aber als ich versucht habe die kollision von unten und den Seiten zu schreiben, kam ich nicht mehr so ganz weiter. mit diesem code ging es nicht:

Delphi-Quellcode:
if Kreis[b].x+Kreis[b].Width>Image3.Width then     //
      begin
      Kreis[b].speedy := -Abs(Kreis[b].speedy);
      Kreis[b].speedx:= Abs(Kreis[b].speedx);
      end;

Bummi 11. Nov 2012 15:46

AW: Geschwindigkeit umkehren
 
bei den Seitenprüfungen musst Du x invertieren // wahrscheinlich ein Flüchtigkeitsfehler.
Du kannst links rechts zusammen und oben unten ebenfalls zusammen behandeln.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 Uhr.
Seite 1 von 4  1 23     Letzte »    

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