Streurichtung berechnen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

mpreu

Betreff: Streurichtung berechnen?

BeitragSa, Nov 09, 2013 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 09, 2013 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 09, 2013 14:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ä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 Smile

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 Smile

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 Smile

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

BeitragSa, Nov 09, 2013 15:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 09, 2013 15:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah Smile

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 Smile

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

BeitragSa, Nov 09, 2013 16:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Nov 09, 2013 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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
ypos = ypos + Sin(dir)*speed


Wenn die Richtung gleich bleibt:
BlitzBasic: [AUSKLAPPEN]
;Bei jeder Änderung:
xspeed = Cos(dir)*speed
yspeed = Sin(dir)*speed
;Jedes Frame:
xpos = xpos+xspeed
ypos = ypos+yspeed
Gewinner der 6. und der 68. BlitzCodeCompo
 

mpreu

BeitragSa, Nov 09, 2013 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Nov 10, 2013 0:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group