Mal wieder Sterne...

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:

Mal wieder Sterne...

Beitrag von Kukulkan »

Hallo,

Anbei mein Sterne-Code. Allerdings ist dieser 3D. Mit der Maus kann man den Fluchtpunkt der Perspektive ändern.

Mit den Tasten X, Y und Z kann man die Sterne bewegen. Ein Tastendruck schaltet die jeweilige Richtung ein/aus.

Als Standard startet es mit einer Z-Bewegung.

HINWEIS: je nach Tastaturlayout können die Tasten Y und Z vertauscht reagieren (deutsch/englisch).

Viel Spass.

Code: Alles auswählen

; 3D-Stars (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
Global Counter.f
;
PKTAnz.l = 2000
; Sterne generieren (zufällige Koordinaten)
For x.l = 1 To PKTAnz.l
  Punkte(x.l, 1) = Random(2000) - 1000 ; X
  Punkte(x.l, 2) = Random(2000) - 1000 ; Y
  Punkte(x.l, 3) = Random(2000) ; Z
Next
;
If InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite() = 0
  MessageRequester("Error", "Kann nicht initialisieren!")
  End
EndIf
;
; Initialisieren
Fluchtpunkt(1) = 0    ; X
Fluchtpunkt(2) = 0    ; Y
Fluchtpunkt(3) = 2000 ; Z
ZEbene.l = 1540
; Welche Richtung wird gerade bewegt?
BewegeX.b = 0
BewegeY.b = 0
BewegeZ.b = 1
;
If OpenScreen(1024, 768, 16, "Stars")
  xOffset.l = 512
  yOffset.l = 384
  While KeyboardPushed(#PB_Key_Escape) = 0
    FlipBuffers()
    ClearScreen(0,0,0)

    ; Sterne bewegen
    For x.l = 1 To PKTAnz.l
      ; Z-Koordinaten der Sterne
      If BewegeZ.b = 1
        Punkte(x.l, 3) = Punkte(x.l, 3) + 5
        If Punkte(x.l, 3) > 2000: Punkte(x.l, 3) = 0: EndIf
      EndIf
      ; Y-Koordinaten der Sterne
      If BewegeY.b = 1
        Punkte(x.l, 2) = Punkte(x.l, 2) + 5
        If Punkte(x.l, 2) > 1000: Punkte(x.l, 2) = -1000: EndIf
      EndIf
      ; X-Koordinaten der Sterne
      If BewegeX.b = 1
        Punkte(x.l, 1) = Punkte(x.l, 1) - 5
        If Punkte(x.l, 1) < -1000: Punkte(x.l, 1) = 1000: EndIf
      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())
    Counter.f = Counter.f + 0.005
    If Counter.f > 3.1415 * 2: Counter.f = 0: EndIf
    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
          Farbwert2.l = RGB(Farbe.l - 60,Farbe.l - 60,Farbe.l - 60)
          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
          Plot(BildPixel(x.l, 1), BildPixel(x.l, 2), RGB(Farbe.l, Farbe.l, Farbe.l))
        EndIf
      EndIf
    Next
    StopDrawing()
    
    ; Tasten für Ein-Auschalten der Richtungen
    If KeyboardPushed(#PB_Key_X)
      BewegeX.b = BewegeX.b + 1: If BewegeX.b = 2: BewegeX.b = 0:EndIf
      Delay(150)
    EndIf
    
    If KeyboardPushed(#PB_Key_Y)
      BewegeY.b = BewegeY.b + 1: If BewegeY.b = 2: BewegeY.b = 0:EndIf
      Delay(150)
    EndIf
    
    If KeyboardPushed(#PB_Key_Z)
      BewegeZ.b = BewegeZ.b + 1: If BewegeZ.b = 2: BewegeZ.b = 0:EndIf
      Delay(150)
    EndIf
    
    ; Fluchtpunkt nach Maus ausrichten
    Fluchtpunkt(1) = Fluchtpunkt(1) + MouseDeltaX()
    Fluchtpunkt(2) = Fluchtpunkt(2) + MouseDeltaY()
    
    ; Fluchtpunkt(1) = Fluchtpunkt(1) + Sin(Counter.f)*2
    ; Fluchtpunkt(2) = Fluchtpunkt(2) + Cos(Counter.f)*2
    ; Fluchtpunkt(3) = Fluchtpunkt(3) + Sin(Counter.f)*2
    
    ; Tastatur abfragen
    ExamineKeyboard()
    ExamineMouse()
  Wend
  CloseScreen()
  End
Else
  MessageRequester("Error", "Kann Bildschirm nicht öffnen!")
EndIf
Benutzeravatar
benny
Beiträge: 383
Registriert: 29.08.2004 09:18
Wohnort: Am Ende des www's
Kontaktdaten:

Beitrag von benny »

:allright: n1 :!:

Thx 4 sharing.
So long,
benny!
.
nur t0te f1sche schw1mmen m1t dem str0m - 00100 !
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Beitrag von Lukas-P »

Interessant :-D
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Beitrag von dige »

Jo, der ist mal richtig gut !
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

Beitrag von benpicco »

cool :allright:
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
Ynnus
Beiträge: 855
Registriert: 29.08.2004 01:37
Kontaktdaten:

Beitrag von Ynnus »

Sieht sehr cool aus. :D

Jetzt noch eine automatisch abgelaufene Route und dann kann man's als Screensaver nutzen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

sehr schick. :allright:

mir ist die funktion der x,y,z-tasten nicht ganz klar.

und was noch gaaaaanz schick wär, wenn die mausdrehung wirklich kugelförmig wäre,
also, wenn man nach ner weile drehen in eine richtung nach 'hinten' schauen würde,
also, daß es ein echter 3D-ausblick wäre. das wär dann genial als game-hintergrund.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo,

@sunny:
Jetzt noch eine automatisch abgelaufene Route und dann kann man's als Screensaver nutzen.
Siehe Posting: Sterne die dritte (mit Raumschiff...)

@Kaeru Gaman:
mir ist die funktion der x,y,z-tasten nicht ganz klar.
Ich zeige die Sterne in 3D an. Wenn sich was bewegen soll, dann bewege ich die Sterne. Und zwar als Default in der Z-Achse. Ich kann mit <X> aber auch die Sterne in der X-Achse bewegen. Dann am besten vorher die Z-Achse abschalten.

Um sich zu drehen, müsste man die Kamera durch das Sternenfeld bewegen. Diese Funktion lässt sich durch Offsets zur Kameraposition erreichen. Ist hier aber nicht eingebaut.

Grüsse,

Volker
Antworten