Seite 1 von 1

Sterne die dritte (mit Raumschiff)

Verfasst: 08.06.2005 10:38
von Kukulkan
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:

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
Viel Spass.

Volker

Verfasst: 10.06.2005 08:08
von Kukulkan
Hallo?

Will das niemand antesten? Ich find's ganz gut sonst hätte ich es nicht hier hingestellt...

Anbei zwei Screenshots:
Bild Bild

Oder gibts Probleme beim Ausprobieren?

Volker

Verfasst: 10.06.2005 08:51
von Dostej
Ich habs mir gestern gezogen und dann daheim ausprobiert.
Sieht nicht schlecht aus. Für n Demo wäre so was wie ne Steuerung noch nett. Nur Zuschauen ist etwas langweilig.

Wenn Du neben der Steuerung noch ein Schiff mit reinnimmst, an was man andocken soll oder das man sbschiessen muss, bekomst Du vermutlich deutlich mehr rückmeldungen...

Verfasst: 10.06.2005 12:18
von bluejoke
Sieht nicht schlecht aus, funktioniert auch ganz prima. Die Drehung des Raumschiffes stockt aber noch (liegt wohl an zu wenigen zwischengrafiken, oder?) und mich hat die extra Pak-File zuerst vom Testen abgehalten.

Verfasst: 13.02.2006 17:02
von Mac
Hi all

bin Newbie und spiele gerade noch mit der Testversion (Vollversion geordert ;-) ) herum. Die Graphik.pak ist bei X-beliebig nicht mehr. Woher bekomme ich die alternativ?
Danke.

Verfasst: 13.02.2006 18:02
von Kukulkan
Hi Mac,
Die Graphik.pak ist bei X-beliebig nicht mehr. Woher bekomme ich die alternativ?
Wow, ist schon eine Weile her... Ich hab die Graphic.pak nochmals erstellt und hochgeladen (enthält nur die ganzen Einzelgrafiken für das Raumschiff).

Viel Spass!

Volker

Verfasst: 13.02.2006 18:33
von Mac
Hi
Volker Schmid hat geschrieben:Viel Spass!Volker
Danke :D