Raumschiff Schub darstellen
Übersicht

![]() |
TravisBetreff: Raumschiff Schub darstellen |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich programmiere derzeit ein Asteroids ähnliches Game, bei dem man im 2D-Modus ein Raumschiff steuert. Wenn man jetzt beschleunigt, sollen Rauchwolken aus dem Raumschiff austreten.
Mir fällt einfach nicht ein, wie man das realistisch darstellen könnte. Ich habe es jetzt so versucht, dass ich beim Beschleunigen direkt hinter dem Schiff eine Rauchwolke erstelle. Diese Wolke wird dann immer kleiner, bis sie verschwindet. Wenn das ganze jetzt in Bewegung ist, sieht man schon eine Art Schweif, aber sobald man eine Kurve macht, wird es doch ziemlich unrealistisch. Wie könnte man sowas berechnen? Wer von euch hat das schon mal gemacht? Ich habe mal ein simples Beispiel angehängt, wie ich es jetzt realisiert habe. Code: [AUSKLAPPEN] Graphics 800,600,16,2 AppTitle "SpaceSimulation" Text 380,300, "Please wait..." ; --- Spielergrafiken --- SpielerGfx = CreateImage(30,20) SetBuffer ImageBuffer(SpielerGfx) Line 0,0,0,19 Line 0,0,29,10 Line 0,19,29,10 Dim Spieler(360) For i = 0 To 359 Spieler(i) = CopyImage(SpielerGfx) RotateImage Spieler(i), i MidHandle Spieler(i) MaskImage Spieler(i), 0,0,0 Next ; --- Spielergrafiken --- ; --- Spieler erstellen --- Type spieler Field x#,y#,sx#,sy#,bx#,by#,winkel End Type s.spieler = New spieler s\x = 400 s\y = 300 ; --- Spieler erstellen --- Global FPSSEC = MilliSecs(), FPS, FRAMES SetBuffer BackBuffer() Type Thrust Field x, y, sx, sy, frame End Type ; ---------- Beginn der Hauptschleife ---------- Repeat Cls UpdateThrust() UpdatePlayer() Flip 1 Until KeyHit(1) End ; ---------- Ende der Hauptschleife ---------- ; --- Schub aktualisieren --- Function UpdateThrust() s.spieler = First spieler ; Spieler auswählen If KeyDown(208) Or KeyDown(200) And MilliSecs()-Timer1 > 50 Then ; Beim Beschleunigen t.thrust = New thrust ; Neue Schubwolke erstellen t\x = s\x - Cos(s\winkel) * 15 ; Position der neuen Wolke festlegen t\y = s\y - Sin(s\winkel) * 15 t\sx = -s\sx t\sy = -s\sy t\frame = 14 ; Animationsbild einstellen EndIf For t.thrust = Each thrust Oval t\x-t\frame/2, t\y-t\frame/2, t\frame, t\frame, 0 ; Schub anzeigen t\x = t\x + t\sx t\y = t\y + t\sy t\frame = t\frame - 1 ; Animationsbild aktualisieren If t\frame = 1 Then Delete t ; Schubwolke löschen (letztes Bild erreicht) Next End Function ; --- Schub aktualisieren --- ; --- Spieler aktualisieren --- Function UpdatePlayer() s.spieler = First spieler ; Geschwindigkeit verringern s\sx# = s\sx# *.99 s\sy# = s\sy# *.99 ; Schiff bewegen s\x# = s\x# + s\sx# s\y# = s\y# + s\sy# ; Spieler außerhalb des Bildschirms rücksetzen If s\x > 800 Then s\x = 0 If s\x < 0 Then s\x = 800 If s\y > 600 Then s\y = 0 If s\y < 0 Then s\y = 600 ; Beschleunigen If KeyDown(200) Then s\sx# = s\sx# + Cos(s\winkel) *.1 s\sy# = s\sy# + Sin(s\winkel) *.1 EndIf ; Abbremsen If KeyDown(208) Then s\sx# = s\sx# - Cos(s\winkel) *.1 s\sy# = s\sy# - Sin(s\winkel) *.1 EndIf ; Steuern If KeyDown(203) Then s\Winkel = s\Winkel - 1 If KeyDown(205) Then s\Winkel = s\Winkel + 1 ; Winkelkorrektur If s\winkel < 0 Then s\winkel = 359 If s\winkel > 359 Then s\winkel = 0 ; Spieler zeichnen DrawImage Spieler(s\winkel), s\x, s\y End Function ; --- Spieler aktualisieren --- |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Triton |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich finde Rauch im Weltraum sieht unschön aus. Das sollte eine schöne, saubere Flamme sein.
Ich hab das für ne ähnliche Sache mal gepixelt (oder so - kann mich nicht mehr erinnern wie ich das gemacht hab): ![]() |
||
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich finds nicht schlecht. Vielleicht kann man ja statt grauen Rauchbällen grüne oder rote neben (Ionen und co.). Aber beim rückwärts fliegen, muss die Wolke dann doch entfernt werden. | ||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Was die Grafik angeht, bin ich mir noch nicht ganz sicher, wie ich es am besten mache. Ich könnte natürlich eine kleine Flamme machen, aber eigentlich wollte ich es so ähnlich haben wie bei "Subspace"
http://dz.yandex.ru/olddz/onli...bspace.jpg Wenn auch nicht mit der gleichen Grafik. Ich finde, da ist die Bewegung der Flamme richtig gut rübergekommen. Die machgt auch einen richtig coolen Bogen, wenn man in die Kurve geht. Zum arbeiten habe ich jetzt diese Grafik hier genommen: ![]() |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum lässt dus dann nicht so.
Ich würde höchstens nicht die Kreise kleiner, sondern blasser machen! Bis Sie verschwunden sind. Und während sie blasser werden, werden sie auch größer! Versuch das mal. |
||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Stimmt, das wirkt noch etwas realistischer. | ||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
![]() |
General Alex |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ist mir auf dem Screenshot etwas aufgefallen: Seit wann heisst Wurmloch auf Englisch "Worm hole"? | ||
![]() |
Travis |
![]() Antworten mit Zitat ![]() |
---|---|---|
So heisst es doch auch, oder? Ich könnte mir aber vorstellen, dass man es auch zusammenschreiben könnte.
Habe meinen Code nochmals abgeändert. Gefällt mir schon ganz gut, bis auf die Kurvenlage. Das wirkt irgendwie unrealistisch, wenn der Strahl so gerade bleibt. Code: [AUSKLAPPEN] Graphics 800,600,16,2 AppTitle "SpaceSimulation" Text 380,300, "Please wait..." ; --- Spielergrafiken --- SpielerGfx = CreateImage(30,20) SetBuffer ImageBuffer(SpielerGfx) Line 0,0,0,19 Line 0,0,29,10 Line 0,19,29,10 Dim Spieler(360) For i = 0 To 359 Spieler(i) = CopyImage(SpielerGfx) RotateImage Spieler(i), i MidHandle Spieler(i) MaskImage Spieler(i), 0,0,0 Next ; --- Spielergrafiken --- ; --- Spieler erstellen --- Type spieler Field x#,y#,sx#,sy#,bx#,by#,winkel End Type s.spieler = New spieler s\x = 400 s\y = 300 ; --- Spieler erstellen --- Global FPSSEC = MilliSecs(), FPS, FRAMES SetBuffer BackBuffer() Type Thrust Field x, y, sx, sy, frame End Type ; ---------- Beginn der Hauptschleife ---------- Repeat Cls UpdateThrust() UpdatePlayer() Flip 1 Until KeyHit(1) End ; ---------- Ende der Hauptschleife ---------- ; --- Schub aktualisieren --- Function UpdateThrust() s.spieler = First spieler ; Spieler auswählen If KeyDown(208) Or KeyDown(200) Then ; Beim Beschleunigen t.thrust = New thrust ; Neue Schubwolke erstellen t\x = s\x - Cos(s\winkel) * 15 ; Position der neuen Wolke festlegen t\y = s\y - Sin(s\winkel) * 15 t\sx = -s\sx -Cos(s\winkel) * 2 t\sy = -s\sy -Sin(s\winkel) * 2 t\frame = 5 EndIf For t.thrust = Each thrust Color 255-t\frame*13,255-t\frame*13,255-t\frame*13 Oval t\x-t\frame/2, t\y-t\frame/2, t\frame, t\frame, 0 ; Schub anzeigen t\x = t\x + t\sx t\y = t\y + t\sy t\frame = t\frame + 1 ; Animationsbild aktualisieren If t\frame = 14 Then Delete t ; Schubwolke löschen (letztes Bild erreicht) Next End Function ; --- Schub aktualisieren --- ; --- Spieler aktualisieren --- Function UpdatePlayer() s.spieler = First spieler ; Geschwindigkeit verringern s\sx# = s\sx# *.99 s\sy# = s\sy# *.99 ; Schiff bewegen s\x# = s\x# + s\sx# s\y# = s\y# + s\sy# ; Spieler außerhalb des Bildschirms rücksetzen If s\x > 800 Then s\x = 0 If s\x < 0 Then s\x = 800 If s\y > 600 Then s\y = 0 If s\y < 0 Then s\y = 600 ; Beschleunigen If KeyDown(200) Then s\sx# = s\sx# + Cos(s\winkel) *.1 s\sy# = s\sy# + Sin(s\winkel) *.1 EndIf ; Abbremsen If KeyDown(208) Then s\sx# = s\sx# - Cos(s\winkel) *.1 s\sy# = s\sy# - Sin(s\winkel) *.1 EndIf ; Steuern If KeyDown(203) Then s\Winkel = s\Winkel - 1 If KeyDown(205) Then s\Winkel = s\Winkel + 1 ; Winkelkorrektur If s\winkel < 0 Then s\winkel = 359 If s\winkel > 359 Then s\winkel = 0 ; Spieler zeichnen DrawImage Spieler(s\winkel), s\x, s\y End Function ; --- Spieler aktualisieren --- |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group