Sterne die dritte (mit Raumschiff)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Sterne die dritte (mit Raumschiff)

Beitrag 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
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag 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
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag 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...
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Mac
Beiträge: 13
Registriert: 13.02.2006 17:00

Beitrag 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.
_________
Gruß, Mac
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag 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
Mac
Beiträge: 13
Registriert: 13.02.2006 17:00

Beitrag von Mac »

Hi
Volker Schmid hat geschrieben:Viel Spass!Volker
Danke :D
_________
Gruß, Mac
Antworten