Raumschiff Schub darstellen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Travis

Betreff: Raumschiff Schub darstellen

BeitragFr, Mai 21, 2004 22:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 22, 2004 1:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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):

user posted image

Gossi

BeitragSa, Mai 22, 2004 10:27
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 22, 2004 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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:

user posted image
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Gossi

BeitragSa, Mai 22, 2004 10:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 22, 2004 11:14
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 22, 2004 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Da ist mir auf dem Screenshot etwas aufgefallen: Seit wann heisst Wurmloch auf Englisch "Worm hole"?

Travis

BeitragSa, Mai 22, 2004 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group