Streurichtung berechnen?
Übersicht BlitzBasic Allgemein
mpreuBetreff: Streurichtung berechnen? |
Sa, Nov 09, 2013 12:03 Antworten mit Zitat |
|
---|---|---|
Wie könnte ich auf einfachstem weg eine Streurichtung für viele Objekte berechnen.
Also gehen wir von einem Objekt A aus von welchem rundherum sagen wir mal 20 kleine Objekte(Schüsse) ausgehen. Alle gleichzeitig und in Kreisform drumherum.Wie Strahlen sozusagen. |
||
Addi |
Sa, Nov 09, 2013 12:16 Antworten mit Zitat |
|
---|---|---|
Du überlegst dir, in welchem Winkelbereich deine Objekte fliegen sollen (bspl -20 bis 20 Grad) gibst dann jedem Objekt einen Zufallswinkel der in diesem Bereich liegt und dann rechnest du auf die y Position den Sinus von diesem Winkel mal der Objektgeschwindigkeit. Für die x Position läufts analog nur halt mit Cosinus.
Soll das von der Mausposition ausgehend sein, so berechnest du mit ATan2 den Winkel zwischen dem Spieler und der Maus und addierst da dann einen Zufallswert von (Winkelbereich von oben) -20 bis 20 drauf. |
||
BP/B3D/BMax : Lerne Java : Früher mal Lite-C : Gewinner BCC 62 |
PhillipK |
Sa, Nov 09, 2013 14:47 Antworten mit Zitat |
|
---|---|---|
Ähnlich könntest du auch einen Winkel a nehmen und dort einen zufallswert von Rand(-10,10) draufrechnen. Im prinzip das selbe was Addi schrieb
Mausposition: Rechne den Winkel zwischen deinem ausgangsobjekt o zu dem zielobjekt z wie folgt aus: Code: [AUSKLAPPEN] winkel = Atan2( z\Y - o\Y, z\X - o\Y)
Allgemein gilt, über Sin() und Cos() kannst du einen normalisierten Vektor für einen Winkel aufstellen. Sin() wird üblicherweise für die Y richtung verwendet, Cos() für X. "Nach rechts" zeigend ist in dem Fall 0°, nach unten 90°, nach links 180°, nach oben 270°. Es ist egal ob du einen winkel bereich von -180 bis 180 oder von 0 bis 360 verwendest. Du kannst auch zb 3600 als winkel verwenden, einfach in Sin() und Cos() einspeisen Code: [AUSKLAPPEN] winkel = 0
speed = 25 xMovement = Cos(winkel) ; liegt zwischen -1 und 1. bei winkel=0 ist xMovement = 1 yMovement = Sin(winkel) ; liegt zwischen -1 und 1. bei winkel=0 ist yMovement = 0 DoSomething(xMovement * speed, yMovement * speed) ;skaliere den "vektor" mit der speedvariable, damit sie sich schneller / langsamer als mit 1 vom fleck bewegen. Natürlich ist xMovement und yMovement in diesem falle keine position, sondern eine richtung. Ändere die positionen deiner objekte jeden frame / wenn sie geupdatet werden. Und wie du nun raten kannst: Zitat: Also gehen wir von einem Objekt A aus von welchem rundherum sagen wir mal 20 kleine Objekte(Schüsse) ausgehen.
Rundherum bedeutet: Nimm die position von Objekt A, rechne für jedes objekt einen winkel aus (wenn die objekte bereits existieren, verwende Atan2, ansonsten nimm zb Rand(-180, 180) ) und verwende Sin() Cos() für individuelle bewegungsrichtungen. Nun nurnoch jeden frame die objekte mit ihren bewegungs-vektoren verrechnen und damit neu positionieren - fertig Ps: Beachte bei Atan2, das dieses als parameter 1 die y positionen erwartet. Atan2 berechnet den winkel eines vektors vom ursprung 0,0 aus - mal als laie gesprochen. Um den winkel zwischen 2 objekten zu erfahren, musst du also zuerst die position des ersten objektes vom zweiten objekt abziehen. Das gibt dir dann den winkel von objekt1 zu objekt2. |
||
mpreu |
Sa, Nov 09, 2013 15:24 Antworten mit Zitat |
|
---|---|---|
Okay und vielen dank, das werde ich heute Abend gleich mal Probieren.
edit: die objekte existieren, also werden zu einem bestimmten Zeitpunkt zusammen mit dem Hauptobjekt A erstellt und haben zu diesem Zeitpunkt dieselbe Postion wie Objekt A. Und sollen anschliessend streuen, sagen wir mal mit einem winkel von jeweils 36 Grad zum jeweils anderen Objekt auseinanderdriften bis der Bildschirmrand erreicht ist.(oder es eine kollision gab) Wie ein Streuschuß oder ähnliches soll es sich verhalten. Mal sehen ob ich das so hinbekomme wie ich möchte. |
||
PhillipK |
Sa, Nov 09, 2013 15:59 Antworten mit Zitat |
|
---|---|---|
Ah
Wenn du die anzahl der objekte kennst, würde ich dir raten, den "schrittfaktor" zu errechnen: Winkelschritt = 360° / (Anzahl_Objekte+1) (anstelle vom fixwert 36) Das stellt sicher, das alle objekte exakt den gleichen winkel zueinander haben und es hinterher nicht zu unschönen überlappungen kommt. damit kannst du dann eine schleife hochzählen, wobei der zähler i von 0 bis anzahl_objekte - 1 zählt und jedem objekt den winkel WinkelSchritt * i geben. Willst du die objekte nicht ganz so gradlinig haben, kannst du vorher auch ein Offset = Rand(0,winkelschritt) machen und auf jeden winkel addieren. Sinnvoll für zb Partikel oder ähnliches, das gibt unregelmäßigkeit Da du von kollisionen sprichst, ist es eventuell auch möglich, das objekte abprallen - in dem fall würde ich dir raten, den "vektor" dirX, dirY zu speichern. Alternativ kannst du, wenn die objekte nur diese eine richtugn haben, einfach den winkel speichern und pro frame mit Sin() Cos() arbeiten. Passiert das allerdings extrem häufig, zb bei 10.000 objekten und mehr, speicher doch lieber die richtungen an sich, da Sin() und Cos() im vergleich recht hungrig sind. |
||
mpreu |
Sa, Nov 09, 2013 16:09 Antworten mit Zitat |
|
---|---|---|
Nein also eigentlich möchte ich nur begrenz solche Berechnungen durchführen.
Hab mir auch schon gedacht, dass ich den winkel für jedes objekt nehme und dann mittels funkelfunktionen die neue position für den jeweilig nächsten frame errechne. So wirklich habe mich mit winkelfunktionen hier noch nicht beschäftigen müssen...schule ist auch schon einige jahrzehnte her. Aber ich schaff das schon, so schwer ists ja nicht. |
||
DAK |
Sa, Nov 09, 2013 18:26 Antworten mit Zitat |
|
---|---|---|
Wenn sie längere Zeit die gleiche Richtung beibehalten, speicher dir die X-Geschwindigkeit und Y-Geschwindigkeit ab (da es so schon deutlich schneller ist). Behalten sie die Richtung sogar dauerhaft bei, dann speicher dir die Geschwindigkeiten nur so ab.
Drehen sie sich häufiger (fast jedes Frame oder gar jedes Frame), mach es nur über den Winkel. Du brauchs ja sowieso das Folgende: BlitzBasic: [AUSKLAPPEN] xpos = xpos + Cos(dir)*speed Wenn die Richtung gleich bleibt: BlitzBasic: [AUSKLAPPEN] ;Bei jeder Änderung: |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
mpreu |
Sa, Nov 09, 2013 20:15 Antworten mit Zitat |
|
---|---|---|
ja genau sowas.danke dir schonmal...
ist wie bei einem sidescroller-shooter.gegner kommt und lässt dann so einen rundumschlag los. gleiche richtung und geschwindigkeit reicht da erstmal. erweitern kann ich das ganze später noch. dachte da an types für die schussverarbeitung mit interner killoption bei kollision oder wenn der bildschirmrand erreicht ist. |
||
DAK |
So, Nov 10, 2013 0:43 Antworten mit Zitat |
|
---|---|---|
Jup, Types sind dafür das Beste, vor allem, wenn du eventuell auch mehrere von diesen Rundumschlägen gleichzeitig hast. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group