![]() |
AW: Geschwindigkeit umkehren
Hat nicht noch Jemand eine Lösung.
Der Code von Bummi lässt die Kreise in die selbe Richtung zurückprallen aus der sie kamen, aber wie bereits gesagt, ich will eine Einfallswinkel=Ausfallswinkel Kollision und zudem müsste das Bug Problem behoben werden: Wenn man den Block zu schnell bewegt, bleiben die Kreise darin hängen :/ |
AW: Geschwindigkeit umkehren
Es wurden doch etliche Lösungsansätze geposted, und sogar ein gutes Stück Code verlinkt. Mach dich doch erstmal an die Umsetzung dieser Ideen (es sind die richtigen, sei versichert), und wenn dabei konkrete Probleme auftauchen, reden wir hier weiter.
|
AW: Geschwindigkeit umkehren
Liste der Anhänge anzeigen (Anzahl: 1)
Durch die Geschwindigkeit bekommst Du wie gesagt bei einem Treffer in der Auswertung für x und y Überschneidungen. Ein recht brauchbarer Weg könnte es sein statt der Region die Du jetzt verwendest 4 Regions je 1 Pixel hoch(horizontal) bzw. breit(vertikal) und Kantenlänge - Geschwindigkeit * 2 , zentriert auf den Kanten, in der anderen Dimension zu verwenden.
Dann sollte ein CombineRegion nacheinander über die 4 Seiten die richtige Auswertung zulassen. |
AW: Geschwindigkeit umkehren
Hmm das klingt schon sehr gut, aber wie soll ich das denn umsetzten. Ehrlich gesagt, fällt mir da jetzt so direkt keine konkrete Umsetzungsmöglichkeit in Delphi ein :?
Tut mir leid, dass ich nicht so der Profi bin, ich tue schon alles Mögliche, um mein Delphi Wissen zu steigern :oops: |
AW: Geschwindigkeit umkehren
Du kannst behelfsweise auch mit InterSectRect an der Stelle weiterabeiten, dann sind es halt 4 Rects statt 4 Regions ,der Kreis durch das umhüllende Rect etwas verfälscht abgefragt, bei kleineren Radien fällt das aber kaum auf.
Wenn Du Dir die Regions ansehen willst, kannst Du Dich dort ![]() |
AW: Geschwindigkeit umkehren
Ich hab mir deinen Code jetzt nicht näher angeschaut, aber bei solchen Kollusionen gibt es i.d.R. folgende Punkte zu beachten.
1.) Der Timer läuft auf, weil er sehr schnell eingestellt ist. Das kann man leicht beheben, indem man am Anfang der OnTimerRoutine den Timer disabled und am Schluß der Routine wieder auf enabled setzt. 2.) Die Bälle, Kugeln ect. laufen ineinander. Das ist schon etwas schwieriger. Hier kann man mit einer function IsFreePlace(X, Y) prüfen, bevor man die Kugel an eine bestimmte Stelle setzt. 3.) Die Kollusion wird nicht erkannt, weil der Timer sehr schnell eingestellt ist und auch hier laufen die Kugeln manchmal ineinander. Da kann man zum Beispiel einen Zug im Voraus denken und mit diesen Koordinaten auf Kollusion prüfen (in meinem Code die NextBalls). 4.) Wenn dir der elastische Stoß mit Berücksichtigung der Massen zu kompliziert ist bzw. wenn alle Kugeln die gleiche Masse haben, kannst du die Geschwindigkeiten der beiden Kugeln einfach austauschen. 5.) Bei Kollusion mit einer Wand wird die entsprechende Geschwindigkeit umgedreht. Gruß Thomas PS.: Etwas einfacher zu handhaben als InterSectRect ist: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:56 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