Objekte auf vorgegebener Bahn bewegen
Übersicht

![]() |
JamaginBetreff: Objekte auf vorgegebener Bahn bewegen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
es geht nicht um Pathfinding! Ich habe eine vorgegebene Bahn (mit Geraden und Kurven). Auf dieser sollen sich Objekte von Start zum Zielpunkt bewegen. Wer hat sowas schon mal umgesetzt bzw. kann mir da ein paar Denkansätze liefern? Würde mich auf Antworten sehr freuen! lg. Jamagin |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Schau mal in der Suche nach Waypoints, dass sollte dir helfen | ||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was gut geht sind Waypoints und damit verbundene Drehgeschwindigkeiten eingeben.
Stell dir vor, du hast eine Liste von Waypoints, und danach je eine Drehgeschwindigkeit: Code: [AUSKLAPPEN] x,y
20,20,1 40,80,2 90,100,1 Jetzt bewegst du deine Einheit jedes Frame um 1 nach vorne und machst für die Drehung sowas wie: BlitzMax: [AUSKLAPPEN] If dir<ATan2(targetx-x,targety-y) Then dir=dir+drehgeschwindigkeit Hald nur als Basis, den Algo musst du noch verfeinern zwecks so Spielerein wie Drehen über 0 Grad. Sobald die Einheit nah genug am Ziel ist (deffiniere einen Zielradius, z.B. 5 Einheiten, ansonsten erwischt ers nicht so gut), schaut er nach dem nächsten Waypoint. Hoffe, das hilft. Viel Spaß. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich würde Bézierkurven (WP) empfehlen, siehe auch hier. | ||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
ZEVS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dieses Problem wurde einige Male in der BPS berührt. Speziell #6 und #11 dürften interessant sein. Zumindest für die Geraden.
Der Begriff "Kurve" solltest du aber genauer fassen: Hast du einen Kreis(ausschnitt), eine Parabel, eine Bézierkurve oder was? Wichtig ist, dass man es mathematisch beschreiben kann. Alternativ kann man eine Kurve als Aneinanderreihung sehr vieler gerader Strecken interpretieren, was das ganze auf oben gelöstes Problem reduziert. Löse immer die Aufgabe, die du lösen kannst! ZEVS |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Codesnippets kann ich dir nicht liefern, allerdings überlegungen die ich mal angestellt hatte ![]() 1) Graden: Kein problem, simple vektoren rechnung. Zu komplex? Okay: Code: [AUSKLAPPEN] Start - Ziel:
gegeben sind x1,y1,x2,y2 (start und ziel) nun ist diffX = x2-x1, diffY = y2-y1 So hast du die strecke, die deine grade lang ist (ein vektor) Wenn du ihn nun für bewegungen nutzen möchtest, muss er noch normalisiert werden. Kompliziert? Aber nein :) Du brauchst die länge des Vektors - also ein simples Sqr. laenge = Sqr(diffX*diffX+diffY*diffY) nun gilt: nX = diffX / laenge nY = diffY / laenge --- Hört sich kompliziert an, aber nun hast du mit nX und nY 2 werte zwischen 0 und 1, welche du mit einem Speed faktor verrechnen kannst und in jedem Bewegungs-schritt auf dein Object (ich sage mal 'bahn') draufaddieren kannst. Sie wird nun jedesmal ein stückchen von Start zu endpunkt fahren. Soviel zur graden strecke. Achtung: Ich würde fast behaupten, meine angaben sind richtig, aber ich weiß es nicht 100% - ich hatte nie vektoren in der schule und habs mir mehr oder minder selbst angeeignet. Für genauere angaben und bezeichnungen - hier gabs in letzer Zeit 2 gute tutorials zu dem thema ![]() ----- Code: [AUSKLAPPEN] 2) Kurven
Für kurven würde ich wie bei Graden vorgehen, nur das sie in mehrere unterstrecken zerteilt wird (so wenig wie möglich, so viele wie nötig.) Wenn man zb eine 90° kurve hat würde ich min. 6 schritte einplanen (sprich die kurve in 6 Strecken unterteilen) Im 2d raum kann man dann sogar die Speed-vektoren mit Atan-rechnungen in eine Rotation umrechnen - ändert man die rotation nun ebenfalls schritt für schritt dürfte es ziemlich "smooth" aussehen. Naja, nur meine ideen. Ich habe soetwas nie umgesetzt, da ich es nie brauchte. Eventuell kommt das irgendwann mal, wenn ich mir Monkey geholt habe - da hab ich hunderete ideen, was man mit bahnen machen kann ![]() |
||
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
wow, danke! Hier wird einem echt schnell geholfen! ![]() Nun aber eine weitere Frage: Hat jemand schon mal so was ähnliches wie das Spiel Zuma programmiert? lg. Jamagin |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jamagin hat Folgendes geschrieben: Du kennst sicher das Spiel Zuma wo viele Kugeln in einer Reihe auf verschiedenen Formen sich über den Bildschirm von einem Startpunkt zu einem Endpunkt bewegen. [...]
Wie kann ich dann dieses Objekt in diese Kette plazieren? Spielfeld Das ist eine Bézierkurve die von einem Startpunkt zu einem Zielpunkt führt. Jede Kugel ist ein Type und die Typeliste muss nur auf der Kurve gezeichnet werden. Wenn eine neue Kugel hinein geschossen wird, muss der nächstliegende Typeeintrag gefunden werden und die Kugel wird mit insert ![]() So würde ich das jedenfalls Handhaben. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann sich die Kugel als einen kleiner Roboter mit einem Lichtsensor, der einer Linie am Boden folgt, indem er sich immer solange nach rechts oder links dreht, bis er den Weg wieder gefunden hat, sobald er ihn verlässt vorstellen.
Man könnte es also so machen, dass man einen vorgefertigten Weg hat und dass man z.B. vor einer Rechtskurve einen Punkt setzt, der der Kugel sagt in welcher Richtung sie den Weg suchen muss, wenn sie auf diesen (den Punkt) trifft. D.H. rollt die Kugel über den Punkt wird ihr gesagt, sie soll sobald sie keinen Weg mehr hat um n Pixel nach Rechts/Links und um n Pixel nach unten/oben, bis sie wieder auf ihm ist. Das ganze setzt voraus, dass man sich einen Weg in einer Bestimmten Farbe zeichnet und man muss sich mit ReadPixel auskennen ![]() Werde morgen mal versuchen ein Bspl zu schreiben ![]() |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann das mathematisch exakt lösen.
Mit Readpixel jede Kugel bewegen zu wollen ist die dankbar langsamste und unzuverlässigste Lösung. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Xeres, hallo Addi!
Danke für eure Antworten! Nö, das Problem mit den Waypoints hab ich ja bereits gelöst. Es geht mir ja darum wenn ich nun eine Menge Kugeln habe oder Bälle oder sagen wir einfach Objekte und ich ein weiteres Objekt in diese Reihe bewege wie man das macht! Das war meine Frage! Beispiel: wir haben 3 Kugeln und ich schieße nun eine weitere in diese Reihe zwischen der 1ten und 2ten Kugel. Nun sollte sich diese Kugelreihe trennen. D.h. alle Kugeln die vor der Neuen sind müssen dann nach rechts und die anderen nach links ausweichen bzw. der Waypointstrecke entlang und danach wieder schließen. Welche Position bekommt nun die neue Kugel. Die von der Ersten oder von der Zweiten. Theoretisch hab ich das ja bereits verstanden aber das Umsetzen. Die Kugeln sind eine Typedefinition, die Waypoints DIM lg. Jamagin |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Xeres
Is nur eine Alternative falls das Mathematische zu komplext ist Das es zu langsam ist weis ich ![]() Mit ReadPixelFast (nur bei Kurven) und bei Geraden mit der Geradengleichung dann gehts etw. schneller Zu den Kugel: Ich stimme Xeres zu Insert ist die einfachste möglichkeit |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Addi,
hm, irgendwie muß meine Frage falsch verstanden worden sein! Ich meine mit einfügen in die Kette nicht die Typedefinition sondern die Objekte am Bildschirm. Ein Objekt in eine Typeliste einfügen das kann ich wohl. Xeres hat einen Link mit Spielfeld gesetzt, da ist ein Bild von so einem Zuma Spiel drin. Und wenn man nun eine neue Kugel in die vorgegebene Bahn schießt, wie die anderen drauf reagieren, so hab ich das gemeint. Und da hab ich keine Ansätze wie ich das machen soll. Derzeit schaffe ich es eine x-beliebige Kugel aus der Kette zu löschen wenn ich mit dem Mauszeiger drüberfahre, tja da werd ich noch einiges zum Überlegen haben. Aber es macht Spass! lg. Jamagin NB: Falls doch jemand Denkansätze hat oder Skizzen (schema) wäre ich sehr dankbar! |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jamagin hat Folgendes geschrieben: Ein Objekt in eine Typeliste einfügen das kann ich wohl. Dann tue das. Bestimme, welche Kugel wie weit zwischen den Waypoints ist und wo die Neue Kugel am besten hin passt.
Wenn es dir nur um den Effekt geht, benutzte noch extra Variablen um die ersten Kugeln weiter zu bewegen bis die sich die Kugel eingereiht hat. Ansonsten beschreibe & skizziere du nochmal genauer, was dein Problem ist. |
||
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, wenn du sie in der Def richtig ordnest, kannst du sie mit einem Multiplikator genau in der Reihenfolge zeichnen wie in der Typeliste. Falls nun eine neue Kugel in die Kette trifft, wird sie sofort in der Liste an die richtige Stelle z.B. an 2ter eingefügt und da du alle Types in einer Schleife durchgehst und die Kugeln mit einem Multiplikator zeichnest, ist die eingefügte Kugel auch an 2ter | ||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Xeres, Addi!
anbei eine Skizze mit Photoshop gemacht das grob darstellt was ich machen möchte aber da hapert es eben! ![]() ![]() Hoffe das es überschaubar ist! lg. Jamagin |
||
Bevor du etwas neues beginnst, erledige das alte |
![]() |
Addi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also,
Du machst die Waypoints genau soweit auseinander, wie den abstandt vom Kugelmittelpunkt bis zum Rand der Kugel (musst dann aber mit MidHandle arbeiten). Wenn jetzt eine Kugel in die Reihe kommt, setzt du alle Kugel auf der rechten Seite um einen Waypoint zurück, die auf der linken Seite um einen vor (anders herumm, wenn sich die Kugeln nach rechts bewegen) und die einzufügende Kugel kommt auf den Waypoint der frei wird. (Kleine Schwierigkeiten sind da aber leider dabei ![]() Hoffe, dass ich dir Helfen konnte ![]() |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
![]() |
Jamagin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Addi,
ja das ist einleuchtend! Ich denke, das ich die linke Seite unbeachtet lasse, die rechten Kugeln eben wie du sagtest um einen oder zwei Waypoints weiterschiebe und den neuen Ball auf den leeren Waypoint setze. Wenn x nicht gleich x von waypoint ist, dann muß ich das noch ausrichten! Soweit die Theorie. Werde das gleich mal versuchen! Hoffe das klappt auch so! lg. Jamagin |
||
Bevor du etwas neues beginnst, erledige das alte |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group