particel prob.

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: particel prob.

BeitragSa, Feb 12, 2011 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, ich habe mir ein kl. particel system programmiert, doch nun hab ich ein problem, die particel fliegen nur von links nach rechts , kla weiss ich woran es liegt, aber ich weiss nich wie ich es ändern kann.
das was ich ausserdem im type stehn habe ist ein winkel. (z.b. 30 grad) so wie is es nun möglich das er automatisch berechnet das wenn, z.b. die maus links is die partikel nach rechts fliegen, und wenn maus rechts is das die nach links fliegen, das gleiche mit oben unten. nun ja der mauswinkel is kla, via atan2 übermittelt.

wie kann ich nun aus einem winkel (was eine zahl is ^^ z.b. ein negativ wert machen ect.)
ich weiss nich wie ich das problem genauer beschreiben soll.
hier der fehler:
Code: [AUSKLAPPEN]
fX = fX + fXspeed
   fY = fY + fYSpeed



und hier das ganze wo was errechnet wird / werden sollte

Code: [AUSKLAPPEN]

Method Move()
   fX = fX + fXspeed
   fY = fY + fYSpeed
      
   g = g - Rnd(8)
   If r = 0 Then r = 0
   If g = 0 Then g = 0
   S = S + 1
   If S > 16 Then S = 16
   erm:Int = fX - StartX
   If erm > 70 Then blend = blend - 0.01
End Method

Xeres

Moderator

BeitragSa, Feb 12, 2011 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Sin & Cos verwenden wäre mein Hinweis.
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)

Mathias-Kwiatkowski

BeitragSa, Feb 12, 2011 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
jop daran habe ich auch gedacht, aber das will auch nich so wirklich, also das wiederrum liegt warscheinlich nur dran das ich es nich weiss richtig einzusetzen.

Code: [AUSKLAPPEN]
fX = fX + fXspeed * Cos(w)
fY = fY + fYSpeed * Sin(w)


damit habe ich allerdings noch immer kein positiven oder negativen wert wenn du weisst was ich mein, da ich den wer schliesslich angebe. ( fx + ) * sowieso

Thunder

BeitragSa, Feb 12, 2011 23:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich, das was du geschrieben hast, richtig verstehe, lautet meine Antwort so:

Hast du den Code getestet? Sinus und Kosinus liefern Werte zwischen -1 und 1 (beide inklusive). D.h. du hast positive und negative Faktoren drinnen, je nachdem, wie der Winkel ist.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragSa, Feb 12, 2011 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
ja getestet, naja es funktioniert nich so wie es soll, und egal ob cos oder sin, mit beiden haut es nich wirklich so hin wie ich es brauch.

Code: [AUSKLAPPEN]
Global pGrav:Float = 0.05
Global particleslist:TList = CreateList()
Type TParticles
   Field StartX:Float, StartY:Float
   Field fAngle, iDuration, iStart, fX:Float, fY:Float
   Field fGrav:Float, fSpeed, fXspeed:Float, fYSpeed:Float
   Field r:Int, g:Int, b:Int
   Field S:Int
   Field blend:Float
   Field w:Int
   
   Function Create:TParticles(x, y)
      Local Particles:TParticles = New TParticles
      Particles.fAngle = Rand(-15, 15)
      Particles.iDuration = Rand(4000, 6000)
      Particles.iStart = MilliSecs()
      Particles.fGrav = pGrav
      Particles.fX = x
      Particles.fY = y
      Particles.r = 255
      Particles.g = 255
      Particles.b = 0
      Particles.S = 5
      Particles.Blend = 0.4
      Particles.fSpeed = Rnd(2)
      Particles.StartX = x
      Particles.StartY = y
      If Particles.fSpeed < 1 Then Particles.fSpeed = 1
      Particles.fXspeed = Particles.fSpeed * Cos(Particles.fAngle)
      Particles.fYSpeed = Particles.fSpeed * Sin(Particles.fAngle)
      Return Particles
   EndFunction
   Method Move()
      'fYSpeed = fYSpeed + fGrav
      If cos (w) < 0 Then fX = fX - fXspeed fY = fY - fYSpeed
      If Cos(w) > 0 Then fX = fX + fXspeed fY = fY - fYSpeed

      'fX = fX + fXspeed
      'fY = fY + fYSpeed
            
      'r = r - 1
      g = g - Rnd(8)
      If r = 0 Then r = 0
      If g = 0 Then g = 0
      S = S + 1
      If S > 16 Then S = 16
      erm:Int = fX - StartX
      If erm > 70 Then Blend = Blend - 0.01
      If erm < - 70 Then Blend = Blend - 0.01
      erm:Int = fY - StartY
      If erm > 70 Then Blend = Blend - 0.01
      If erm < - 70 Then Blend = Blend - 0.01
   End Method
EndType

ToeB

BeitragSa, Feb 12, 2011 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Darf ich mal fragen was du damit bezwecken wolltest :
Code: [AUSKLAPPEN]
If cos (w) < 0 Then fX = fX - fXspeed fY = fY - fYSpeed
      If Cos(w) > 0 Then fX = fX + fXspeed fY = fY - fYSpeed


Speicher am besten Sin(w) und Cos(w) in fYSpeed und fXSpeed beim erstellen, und dann einfach wie du es geschrieben hast :
Code: [AUSKLAPPEN]
fX = fX + fXspeed
fY = fY + fYSpeed


(Btw: Sin ist für die YAchse und Cos für die XAchse da... ist in deinem fall wichtig !)

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Mathias-Kwiatkowski

BeitragSa, Feb 12, 2011 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
das weiss ich ich habe es zuvor auch so probiert:

Code: [AUSKLAPPEN]
If Cos (w) < 0 Then fX = fX - fXspeed
If Sin (w) < 0 Then fY = fY - fYSpeed
If Cos (w) > 0 Then fX = fX + fXspeed
If Sin (w) > 0 Then fY = fY + fYSpeed


dann gehts zwar der (rauch nach link) , mehr schlecht als recht, aber oben und unten nix, und nach rechts einwandfrei

Xeres

Moderator

BeitragSo, Feb 13, 2011 0:08
Antworten mit Zitat
Benutzer-Profile anzeigen
ToeB hat Folgendes geschrieben:
Speicher am besten Sin(w) und Cos(w) in fYSpeed und fXSpeed beim erstellen [...]
Das macht sich nicht gut, wenn man Abpraller/Richtungsänderung bei gleicher Geschwindigkeit verwenden möchte.

Mathias-Kwiatkowski hat Folgendes geschrieben:
[...] ich es nich weiss richtig einzusetzen.
Man beachte meine Signatur oder informiere sich aus beliebiger Quelle über Sin&Cos. Mit Trigonometrie und/oder Vektoren sollte man sich etwas auskennen, wenn man programmiert.
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)
 

Hangman

BeitragSo, Feb 13, 2011 6:40
Antworten mit Zitat
Benutzer-Profile anzeigen
So ganz verstehe ich nicht was du meinst...
Vielleicht helfen dir aber folgende Funktionen, kannst ja selbst gucken ob es das ist was du suchst.

Code: [AUSKLAPPEN]
'Ermittelt den Winkel um ein Objekt A in Richtung B auszurichten
Function Richtung:Int(AusgangspunktX:Int, AusgangspunktY:Int, ZielpunktX:Int, ZielpunktY:Int)
   Local grad:Float
   grad = ATan2(ZielpunktY-AusgangspunktY, ZielpunktX-AusgangspunktX)-180
   If grad<0 Then grad:+360
   Return Int(grad)
End Function


Um das Objekt nun zu bewegen mit Berücksichtigung des ermittelten Winkels:
Code: [AUSKLAPPEN]
Y :+ Sin(Winkel) * wählbarer speed falls gewünscht
X :+ Cos(Winkel) * ""
Ich habe Berthold gebrochen.

Mathias-Kwiatkowski

BeitragSo, Feb 13, 2011 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
jo, habe es hinbekomm, nur leider leidet die FPS total drunter, wenn man z.b. "die partikel als raketen rauch" nutzt, und 20 raketen abschiesst, hat man ne fps von naja 45 oder so.
das is mies.

ToeB

BeitragSo, Feb 13, 2011 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde ja auch den Winkel beim erstellen speichern und zusätzlich dann den Sin/COs wert.
Code: [AUSKLAPPEN]
Function Create:int( x:float, y:float, winkel:float )

pat.x = x
pat.y = y
pat.speed = 3
pat.winkel = winkel
pat.XSpeed = Cos( pat.winkel ) * pat.speed
pat.YSpeed = Sin( pat.winkel ) * pat.speed

End Function


Und falls sich der Winkel ändern sollte, einfach wieder XSpeed und YSpeed neu berechnen... und zwar nur dann.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group