Objekte auf vorgegebener Bahn bewegen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Jamagin

Betreff: Objekte auf vorgegebener Bahn bewegen

BeitragMo, März 19, 2012 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, März 19, 2012 20:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Schau mal in der Suche nach Waypoints, dass sollte dir helfen
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz
BAC#57: 2. Platz
Twitter

DAK

BeitragMo, März 19, 2012 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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
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

Xeres

Moderator

BeitragMo, März 19, 2012 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ZEVS

BeitragMo, März 19, 2012 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, März 19, 2012 20:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Codesnippets kann ich dir nicht liefern, allerdings überlegungen die ich mal angestellt hatte Smile

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 Smile

-----

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 Smile

Jamagin

BeitragMo, März 19, 2012 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
wow, danke! Hier wird einem echt schnell geholfen! Smile

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

Xeres

Moderator

BeitragDo, März 22, 2012 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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 an die richtige Stelle der Liste gerückt (oder dort erstellt, wenn es einfacher ist, Kugeln vom Spieler & die anderen voneinander zu trennen).
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Addi

BeitragDo, März 22, 2012 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy

Werde morgen mal versuchen ein Bspl zu schreiben Wink
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Xeres

Moderator

BeitragDo, März 22, 2012 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Jamagin

BeitragFr, März 23, 2012 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 23, 2012 8:23
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Is nur eine Alternative falls das Mathematische zu komplext ist
Das es zu langsam ist weis ich Very Happy
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

BeitragFr, März 23, 2012 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
@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

Xeres

Moderator

BeitragFr, März 23, 2012 10:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Addi

BeitragFr, März 23, 2012 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, März 23, 2012 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Xeres, Addi!

anbei eine Skizze mit Photoshop gemacht das grob darstellt was ich machen möchte aber da hapert es eben!

user posted image
user posted image

Hoffe das es überschaubar ist!


lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Addi

BeitragFr, März 23, 2012 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad , z.B. wenn sich die abzuschießende Kugel nicht genau auf der gleichen X Position befindet wie der Waypoint)

Hoffe, dass ich dir Helfen konnte Very Happy
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62

Jamagin

BeitragFr, März 23, 2012 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group