Sterne die dritte (mit Raumschiff)
Verfasst: 08.06.2005 10:38
Hallo,
Um zu zeigen was man mit den 3D-Sternen (Posting Mal wieder Sterne...) machen könnte, hab ich mal ein Beispiel programmiert.
Dazu muss aber unbedingt noch die Graphic.pak-datei mit den Grafiken im Verzeichnis liegen. Diese Datei könnt Ihr hier runterladen:
http://www.x-beliebig.info/Download/Graphic.pak (893 KB)
Anbei jetzt der Source:
Viel Spass.
Volker
Um zu zeigen was man mit den 3D-Sternen (Posting Mal wieder Sterne...) machen könnte, hab ich mal ein Beispiel programmiert.
Dazu muss aber unbedingt noch die Graphic.pak-datei mit den Grafiken im Verzeichnis liegen. Diese Datei könnt Ihr hier runterladen:
http://www.x-beliebig.info/Download/Graphic.pak (893 KB)
Anbei jetzt der Source:
Code: Alles auswählen
; 2005 by V. Schmid
Dim Punkte.f(2000,3) ; Punkte mit X,Y und Z Koordinaten
Dim BildPixel.l(2000,2) ; Berechnete Bildpunkte
Dim d.l(3) ; Hilfsvariable
Dim Fluchtpunkt.f(3) ; Fluchtpunktkoordinaten (X,Y,Z)
;
Global PKTAnz.l ; Anzahl Sterne
Global Counter1.f ; Hilfszähler für Bewegung 1
Global Counter2.f ; Hilfszähler für Bewegung 2
Global Richtung.f ; Aktuelle Flugrichtung
;
#BogFakt = 0.0174532 ; Umrechnungsfaktor für Bogenmaß
;
Procedure.s CurrentPath()
Static LastPath.s
If LastPath.s = ""
Buffer.s = Space(1000)
GetCurrentDirectory_(1000,@Buffer)
LastPath.s = Buffer.s + "\"
EndIf
ProcedureReturn LastPath.s
EndProcedure
PKTAnz.l = 2000
; ### Sterne generieren ###
For x.l = 1 To PKTAnz.l
; zufällige Koordinaten
Punkte(x.l, 1) = Random(2000) - 1000 ; X
Punkte(x.l, 2) = Random(2000) - 1000 ; Y
Punkte(x.l, 3) = Random(2000) ; Z
Next
; ### Init der Umgebung ###
If InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite() = 0
MessageRequester("Error", "Kann nicht initialisieren!")
End
EndIf
; ### Initialisieren Fluchtpunkt und Z-Ebene ###
Fluchtpunkt(1) = 0 ; X
Fluchtpunkt(2) = -400 ; Y
Fluchtpunkt(3) = 2000 ; Z
ZEbene.l = 1540
; ### Bildschirm öffnen ###
If OpenScreen(1024, 768, 16, "Stars")
xOffset.l = 512
yOffset.l = 384
; ### Sprites aus Pak-Datei einladen ###
OpenPack(CurrentPath() + "Graphic.pak")
For x.l = 0 To 89
CatchSprite(x.l, NextPackFile())
TransparentSpriteColor(x.l, 50, 0, 0)
Next
ClosePack()
SetFrameRate(80)
; ### Main-Loop ###
While KeyboardPushed(#PB_Key_Escape) = 0
FlipBuffers()
ClearScreen(0,0,0)
; ### Sterne bewegen ###
AddX.f = Sin(Richtung.f * #BogFakt) * 10
AddY.f = Cos(Richtung.f * #BogFakt) * 10
For x.l = 1 To PKTAnz.l
; Z-Koordinaten der Sterne
Punkte(x.l, 3) = Punkte(x.l, 3) + AddY.f
If Punkte(x.l, 3) > 2000: Punkte(x.l, 3) = 0: EndIf
If Punkte(x.l, 3) < 0: Punkte(x.l, 3) = 2000: EndIf
; X-Koordinaten der Sterne
Punkte(x.l, 1) = Punkte(x.l, 1) + AddX.f
If Punkte(x.l, 1) < -1000: Punkte(x.l, 1) = 1000: EndIf
If Punkte(x.l, 1) > 1000: Punkte(x.l, 1) = -1000: EndIf
Next
; ### Transfer der Sterne nach 2D ###
For x.l = 1 To PKTAnz.l
For j.l = 1 To 3
d(j.l) = Fluchtpunkt(j.l) - Punkte(x.l, j.l)
Next
Lambda.f = (ZEbene.l - Punkte(x.l, 3)) / d(3)
BildPixel(x.l, 1) = xOffset.l + Punkte(x.l, 1) + Lambda.f * d(1) ; X
BildPixel(x.l, 2) = yOffset.l + Punkte(x.l, 2) + Lambda.f * d(2) ; Y
Next
; ### Zeichnen der Sterne ###
StartDrawing(ScreenOutput())
For x.l = 1 To PKTAnz.l
If BildPixel(x.l, 1) > 0 And BildPixel(x.l, 1) < 1023 And BildPixel(x.l, 2) > 0 And BildPixel(x.l, 2) < 767
Farbe.l = Punkte(x.l, 3) / 8
If Farbe.l > 100
; Stern (näher dran)
Farbwert2.l = RGB(Farbe.l - 60,Farbe.l - 60,Farbe.l - 40)
Plot(BildPixel(x.l, 1), BildPixel(x.l, 2), RGB(Farbe.l, Farbe.l, Farbe.l))
Plot(BildPixel(x.l, 1) - 1, BildPixel(x.l, 2), Farbwert2.l)
Plot(BildPixel(x.l, 1) + 1, BildPixel(x.l, 2), Farbwert2.l)
Plot(BildPixel(x.l, 1), BildPixel(x.l, 2) - 1, Farbwert2.l)
Plot(BildPixel(x.l, 1), BildPixel(x.l, 2) + 1, Farbwert2.l)
Else
; Punkt (weit weg)
Plot(BildPixel(x.l, 1), BildPixel(x.l, 2), RGB(Farbe.l, Farbe.l, Farbe.l))
EndIf
EndIf
Next
StopDrawing()
; ### Raumschiff bewegen (Winkeländerungen) ###
Counter1.f = Counter1.f + 0.005
Counter2.f = Counter2.f + 0.0042
If Counter1.f > 6.283: Counter1.f = 0: EndIf
If Counter2.f > 6.283: Counter2.f = 0: EndIf
Richtung.f = Richtung.f + Sin(Counter1.f) * (Cos(Counter2.f))
If Richtung.f > 360: Richtung.f = Richtung.f - 360: EndIf
If Richtung.f < 0: Richtung.f = Richtung.f + 360: EndIf
; ### Raumschiff zeichnen ###
SpriteNo.l = Richtung.f / 4
If SpriteNo.l < 0:SpriteNo.l = 0: EndIf
If SpriteNo.l > 89:SpriteNo.l = 0: EndIf
DisplayTransparentSprite(SpriteNo.l, xOffset.l - 80, yOffset.l - 60)
; ### Tastatur abfragen ###
ExamineKeyboard()
Wend
CloseScreen()
End
Else
; ### Error beim Init ###
MessageRequester("Error", "Kann Bildschirm nicht öffnen!")
EndIf
Volker