VB 5/6-Tipp 0753: Dynamisches Erzeugen von ortsgebundenenen Objekten
von Dario
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: | Verwendete API-Aufrufe: | Download: |
' 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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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.