Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0753: Dynamisches Erzeugen von ortsgebundenenen Objekten

 von 

Beschreibung 

In vielen Spielen oder Grafikanwendungen möchte man kleine, zufällig verteile Objekte plazieren. Im Weltraum könnten das Sterne oder ein Asteroidenfeld sein, ansonsten Gras oder Bodenstrukturen, Staub usw. Man kann diese natürlich für ein bestimmtes Gebiet im Spiel vorberechnen, was allerdings problematisch wird, wenn sich der Spieler weite Strecken bewegt und das berechnete Gebiet verlässt. Andererseits ist es auch nervig, ein bestimmtes Muster einfach periodisch zu wiederholen. Bestimmt man die Sterne einfach zufällig, so wundert sich der Spieler, wenn er sich umdreht und der Himmel auf einmal völlig anders aussieht.

Doch es gibt eine Lösung: Man kann in VB den eingebauten Zufallsgenerator per Rnd(-1) zurücksetzen und dann mit einem Startwert versehen, indem man der Randomize-Funktion einen Parameter übergibt. Verfährt man so, erhält man für denselben Startwert aus dem Zufallsgenerator immer wieder eine eindeutige, aber doch zufällig aussehende Folge von Werten.

Wir können jetzt das Spielfeld in Quadranten aufteilen, für jeden den Zufallsgenerator neu einstellen und damit unsere Objekte verteilen. Das entstehende Muster ist ortsfest, aber beliebig erweiterbar und wird garantiert nie langweilig.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

GetAsyncKeyState

Download:

Download des Beispielprojektes [3,61 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.
' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
' ------------- Anfang Projektdatei Projekt1.vbp -------------
' --------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Bildfeld-Steuerelement "picGrass"
' Steuerelement: Timersteuerelement "tmrMotion"
Option Explicit

Private Const Size     As Long = 100     ' Skalierungsgröße
Private Const Speed    As Single = 200 ' Bewegungsgeschwindigkeit
Private Const NumGrass As Long = 50      ' Zahl der Gräser pro Quadrant

' Position
Private X As Single, Y As Single

' Bewegungsgeschwindigkeit pro Tick
Dim v As Single

' Tasten abfragen
Private Declare Function GetAsyncKeyState Lib "user32" ( _
                         ByVal vKey As Long) As Integer
                         
' Gebiet rendern
Private Sub Render()

    Dim quadX As Long, quadY As Long
    Dim i As Long, j As Long, k As Long
    
    ' Quadranten ermitteln
    quadX = IIf(X >= 0, (X \ Size) + 1, -(Abs(X) \ Size) - 1)
    quadY = IIf(Y >= 0, (Y \ Size) + 1, -(Abs(Y) \ Size) - 1)
    
    ' Bildfläche löschen
    Call Cls
    
    ' Die 9 umgebenden Quadranten abfahren, die gesehen werden könnten
    For i = quadX - 1 To quadX + 1
        For j = quadY - 1 To quadY + 1
        
            ' Eindeutigen Indexwert für den aktuellen Quadranten ausrechnen
            Dim n As Long: n = 0.5 * (i + j) * (i + j + 1) + j
            
            ' Zufallsgenerator damit initialisieren
            Call Rnd(-1)
            Call Randomize(n)
            
            ' Gräser dort "zufällig" zeichnen
            For k = 1 To NumGrass
            
                Call PaintPicture(picGrass.Image, i * Size + (Rnd * Size) - _
                    X, j * Size + (Rnd * Size) - Y)
                    
            Next k
        Next j
    Next i
    
End Sub

' Zustand updaten
Private Sub tmrMotion_Timer()

    ' Pfeiltasten für Bewegung abfragen, ggf. neue Position berechnen
    If GetAsyncKeyState(37) <> 0 Then X = X - v
    If GetAsyncKeyState(38) <> 0 Then Y = Y + v
    If GetAsyncKeyState(39) <> 0 Then X = X + v
    If GetAsyncKeyState(40) <> 0 Then Y = Y - v
    
    ' Neu zeichnen
    Call Render
    
End Sub

' Voreinstellungen treffen
Private Sub Form_Load()

    Scale (0, Size)-(Size, 0)
    v = Speed * (tmrMotion.Interval / 1000)
    
End Sub

' ---------- Ende Formular "Form1" alias Form1.frm  ----------
' -------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.