Autor |
Beitrag |
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 27.05.17 10:13
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Jann1k
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 27.05.17 16:08
Du kannst in einer Schleife deinen Kollisionstest für alle möglichen TImages ausführen.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 27.05.17 16:24
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Jann1k
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 27.05.17 16:34
Was genau meinst du mit
Delphi-Quelltext 1: 2: 3: 4:
| 1 --> 5 2 --> 5 3 --> 5 4 <-> 5 |
Vom Prinzip her ist deine Schleife richtig. Da du die caption aber bei jeder Kollisionerkennung überschreibst, siehst du am Ende natürlich nur das Ergebnis mit dem letzten Timage.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 27.05.17 16:40
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Jann1k
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Sa 27.05.17 16:48
Okay, jetzt wäre natürlich dein genauer Code hilfreich. Wenn du so etwas machst, sollte es klappen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function KollTest; var i, j : integer; begin result := false; with Form1 do begin for i := 0 to 3 do for j := i+1 to 4 do if Kollision(imgArray[i], imgArray[j]) then result := true; end; end; |
Die Funktion prüft, ob irgendwas mit irgendwas anderem kollidiert und gibt entsprechend true/false zurück.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 27.05.17 17:10
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
FinnO
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Sa 27.05.17 17:25
Moin,
auch wenn es bei höchstens fünf Iterationen keine wirkliche Rolle spielt: Bei der Implementierung einer solchen any-Überprüfung ist es idiomatischer, wenn man nach dem ersten positiven Test die Iteration abbricht.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function KollTest: Boolean; var i: Byte; begin result := false; with Form1 do begin for i := Low(imgArray) to High(imgArray) do if imgArray[i] <> img then if Kollision(img, imgArray[i]) then begin result := true; break; end; end; end; |
Weiterhin sollte man die Grenzen der Iteration natürlich auch nicht hardcodieren, da sich so sehr leicht recht unnötige Fehler einschleichen können
Viele Grüße
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 27.05.17 17:59
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 29.05.17 21:48
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Bergmann89
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mo 29.05.17 22:08
Hey,
da musst du dann ein bischen tiefer in die Trickkiste greifen. Kurzer Abriss wie ich es machen würde:
Quelltext 1: 2: 3: 4: 5: 6:
| - TImages als Kugeln betrachten (mit Mittelpunkt und Radius) - Kollision zwischen den 2 Kugeln erkennen (geht bei Kugeln auch viel einfacher als bei Rects) - Vektor zwischen den 2 Kugeln bestimmen - eine der beiden Kugeln so lange in Richtung des Vectors verschieben, bis sie nicht mehr kollidieren - Anmerkung: letzten Punkt könnte man auch ausrechnen - neuer Punkt von Kugel 1 = Punkt Kugel 2 + Normierter Vektor * (Radius Kugel 1 + Raduis Kugel 2) |
Zum Test kannst du das ja mit den TImages weiter machen, aber für deinen produktiv Code würde ich mir eine entsprechene Klasse schreiben, die alle benötigten Eigenschaften deiner Kugeln kapselt (Mittelpunkt und Radius) und dann mit dieser Klassen die Kollisionsberechnung machen. Zum Zeichen kannt du der Klasse ja noch eine Render oder Paint Methode geben, die dann das TImage an die richtige Stelle schiebt. Auf alle Fälle sollte man sowas nicht über die TImages direkt machen.
MfG Bergmann.
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 29.05.17 22:39
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
cryptnex
Beiträge: 23
Erhaltene Danke: 5
|
Verfasst: Di 30.05.17 15:16
Zitat: | Wie man sieht, wird manchmal eine Kollision erkannt, obwohl keine (optisch) gegeben ist.
Liegt das nun an der Routine oder an der Komponente TImage per se? |
Du vergleichst jeweils die linkere obere Koordinate der beiden rechteckigen TImages miteinander. Du möchtest aber die Abstände der Mittelpunkte vergleichen.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 30.05.17 19:27
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
cryptnex
Beiträge: 23
Erhaltene Danke: 5
|
Verfasst: Di 30.05.17 20:30
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 30.05.17 21:23
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Bergmann89
Beiträge: 1742
Erhaltene Danke: 72
Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
|
Verfasst: Mi 31.05.17 11:25
Hey,
in deiner Methode AllleMove verschiebst du die TImage, machst den KollisionsTest und wenn eine Kollision erkannt wurde schiebst du die Image an ihren alten Platz zurück. Wenn das Delta zwischen neuer und alter Maus Position jetzt sehr groß ist, dann siehst du da den Spalt zwischen deinen Kugeln. Guck dir nochma den Pseudo-Code von oben an. Wenn die Kollision erkantn wurde soll die Image nicht auf ihren alten Platz zurück gesetzt werden, sondern es soll die Position ausgerechnet werden, wo beide Kugeln direkt nebeneinander liegen.
Bergmann89 hat folgendes geschrieben : | Quelltext 1: 2: 3: 4: 5: 6:
| - TImages als Kugeln betrachten (mit Mittelpunkt und Radius) - Kollision zwischen den 2 Kugeln erkennen (geht bei Kugeln auch viel einfacher als bei Rects) - Vektor zwischen den 2 Kugeln bestimmen - eine der beiden Kugeln so lange in Richtung des Vectors verschieben, bis sie nicht mehr kollidieren - Anmerkung: letzten Punkt könnte man auch ausrechnen - neuer Punkt von Kugel 1 = Punkt Kugel 2 + Normierter Vektor * (Radius Kugel 1 + Raduis Kugel 2) | |
€: nochmal die Anmerkung: schreib dir Klassen dafür. Da must du nich so viel mit deinem Left/Top/Width/Height rum rechnen, der Code wird übersichtlicher und vorallem sparst du Rechenzeit! Jedesmal wenn du die Position deiner TImage änderst muss die Form neu gerendert werden :/
MfG Bergmann
_________________ Ich weiß nicht viel, lern aber dafür umso schneller^^
|
|
FinnO
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mi 31.05.17 21:16
Moin,
ich war mal so frei, dir in JavaScript was zusammenzuschreiben. Vielleicht hilft's ja als Inspiration.
Gruß
Finn
Für diesen Beitrag haben gedankt: cryptnex
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 31.05.17 23:32
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|