Sernenfelder mit 3D Effekt

 

Ihr wollt ein cooles Sternenfeld? Kein Problem. Vielleicht erinnert Ihr euch noch an die alten Zeiten, wo Sternenfelder in "Assembler" realisiert wurden, um die Geschwindigkeit zu erhöhen. Heutzutage reicht ein 300 Mhz CPU, um ein 3D-Sternenfeld auch mit VB & DirectX zu realisieren. Die Theorie ist einfach, man "schießt" einfach Pixel vom oberen Rand des Bildschirmes zum unteren Rand, dabei besitzt jeder Pixel eine andere Geschwindigkeit. So kommt es uns vor als würde man über ein dreidimensionales Sternenfeld fliegen. Natürlich könnt Ihr auch horizontale Sternenfelder erstellen.... In dem Beispiel beschreibe ich das Verwalten eines veritkalen Sternenfeldes mit drei Prozeduren. Die 1. und 2. Prozedur sind dafür zuständig einen Pixel (eigentlich ist es ja ein Stern) in das Sternenfeld einzutragen, je mit Geschwindigkeit, Farbe und Position. Die 3. Prozedur soll alle Sterne (Pixel *g*) im Sternenfeld auf den Bildschirm bringen und Sterne, die das Feld verlassen, aus dem Sternenenfeld "löschen". Dieses Tutorial setzt vorraus, dass Ihr das "einzelne Pixel setzten" Tutorial gelesen habt.

Um die Sterne zu verwalten, müssen wir ein Array deklarieren welches Informationen zu den einzelnen Sternen sammelt, das müsste in etwa so aussehen:

Private Type StarfieldVar

xpos As Integer ' Die X Positionn des Sternes

ypos As Integer ' Die YPositionn des Sternes

Starcolor As Long ' Die Farbedes Sternes

Speed As Integer ' Die Geschwindigkeit des Sternes

Allive As Boolean ' Gibt an ob derStern noch "lebt" (sich im gültigen Feld befindet)

End Type

Private Starfield(1400) As StarfieldVar '1400 Sterne können sich maximal im Feld befinden

Private StarCounter as Integer 'Zählt die Sterne

Nun folgt die Prozedur, die in die Hauptschleife des Spieles integriert wird, sie berechnet die Geschwindigkeit, Farbe, Sternendichte und den Bereich in dem die Strene gerzeichnet werden. Die Prozedur "create_star" wird von der Prozedur DrawStars aufgerufen. Sie ist zuständig für die Eintragung im Array.

Public Sub DrawStars(Density As Byte, SlowestStar As Integer, FastestStar As Integer,Color As Long)

Dim StarSpeed As Integer

Dim i As Integer

Randomize Timer

'hier wir die Dichte berrechnet ;) um so kleiner Density ist um so dichter das Sternenfeld

If Rnd * 255 > Density Then

'die Sternengeschwindigkeit wird errechent

StarSpeed = SlowestStar + (Rnd * (FastestStar - SlowestStar))

'neuen Stern erstellen

create_star Rnd * 640, 0, StarSpeed, Color

End If

End Sub

Public Sub create_star(Xpos As Integer, Ypos As Integer, StarSpeed As Integer, Starcolor As Long)

'neuen Stern in das Array eintragen

StarCounter = StarCounter + 1

If StarCounter > 1400 Then StarCounter = 0

With Starfield(StarCounter)

.Speed = StarSpeed

.Starcolor = Starcolor

.xpos = Xpos

.ypos = Ypos

.Allive = True

End With

End If

End Sub

 

Wie Ihr sehen könnt, wird der Sternenzähler (StarCounter) auf 0 zrückgesetzt, wenn er größer als 1400 ist! D.h., wenn die Sterne, die sich am Anfang des Arrays befinden, noch nicht aus dem Bildschirm verschwunden sind, werden diese einfach von den neuen überschrieben. Sicherlich gibt es Methoden dies zu umgehen, aber der eschwindigkeit zuliebe, lassen wir das lieber.

Zu guter Letzt, die Prozedur die, das ganze Sternenfeld bewegt (in dem Beispiel nach unten). Zu jeder Y Position, wird hierzu die Geschwindigkeit des jeweiligen Pixels addiert. Wenn Ihr vertikale Sternenfelder wollt, müsst Ihr natürlich die Geschwindigkeit zur X Position addieren.

Public Sub move_all_stars()

Dim i As Integer

'Lock backbuffer

ddsBackbuffer.Lock BackRECT, ddsdBackbuffer, DDLOCK_WRITEONLY Or DDLOCK_WAIT, 0

For i = 0 To 1400

With Starfield(i)

If .ypos > 480 Then .Allive = False 'verlässt der Stern den Bildschirm dan wir er gelöscht

If .Allive = True Then 'wenn der Stern noch "am Leben" ist dann wir er gezeichnet

.ypos = .ypos + .Speed

ddsBackbuffer.SetLockedPixel .xpos, .ypos, .Starcolor

End If

End With

Next i

'Unlock backbuffer

ddsBackbuffer.Unlock BackRECT

End Sub

Ich empfehle Euch die Prozeduren nach euren Wünschen anzupassen, da diese aus meinem aktuellen Projekt stammen und auch auf dieses angepasst wurden. Falls Ihr euch wundert, warum ich eine create_star Prozedur gemacht habe: Wenn man das Spiel startet müssen erst mal die Sterne in den Bildschirm fliegen. das sieht natürlich etwas seltsam aus. Deswegen solltet Ihr auch eine Prozedur machen, die das Sternenfeld schon vorher mit Sternen füllt. Deswegen create_star!

Ja das müsste es gewesen sein, falls bei Euch etwas nicht funktioniert, mailt mir bitte.

 

Druckbare Version


Autor: Alexander Ney / Mehr Tutorials auf www.vb-overkill.de.vu