IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Visual Basic - Wegpunkte



Wegpunkte

Oft hat man beim Programmieren von Computerspielen das Problem, dass der Spieler ein Objekt steuern kann, indem er es anklickt und danach auf den Zielort. Dabei kann der Spieler meistens auch gleich mehrere Zielorte angeben, die das Objekt, z.B. eine Spielfigur, hintereinander abläuft. Hier wird eine VB-Klasse zur Lösung des Problems programmiert.


Autor: Tobias Surmann (incsoft)
Datum: 30-03-2003, 13:54:03
Referenzen: http://www.vbDirectX.de
Schwierigkeit: Profis
Ansichten: 3474x
Rating: 9 (1x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Einleitung

Oft hat man beim Programmieren von Computerspielen das Problem, dass der Spieler ein Objekt steuern kann, indem er es anklickt und danach auf den Zielort. Dabei kann der Spieler meistens auch gleich mehrere Zielorte angeben, die das Objekt, z.B. eine Spielfigur, hintereinander abläuft. Wie bekommt man nun heraus, wo die Figur herlaufen muss, um ans Ziel zu gelangen?

Ich möchte hier eine Klasse entwickeln, die dieses Problem löst. Hindernisse, die evtl. im Weg der Figur stehen könnten werden hierbei nicht berücksichtigt.

Wir brauchen erst mal die X und die Y-Koordinaten der Figur. Die Geschwindigkeit wird ebenfalls benötigt.

Public X As Integer
Public Y As Integer
Public Velocity As Integer 
Außerdem brauchen wir ein Array in dem die X und die Y-Koordinaten der Zielpunkte gespeichert werden.

Private Type POINT 

X As Integer
Y as Integer
End Type 
Private arrWaypoint() As POINT 
Nun schreiben wir eine Methode, die der Figur einen neuen Punkt mitteilt:

Public Sub AddWaypoint(X As Integer, Y As Integer) 

Redim Preserve arrWaypoint(Ubound(arrWaypoint)+1)
arrWaypoint(Ubound(arrWaypoint)).X = X
arrWaypoint(Ubound(arrWaypoint)).Y = Y 

End Sub 
Damit der Spieler vielleicht zuviel gesetzte Wegpunkte wieder entfernen kann, brauchen wir eine Methode, die diese Wegpunkte aus dem Array löscht:

Public Sub RemoveWaypoint(Index As Integer) 

For i = Index To Ubound(arrWaypoint)-1 

arrWaypoint(i) = arrWaypoint(i + 1) 

Next i 

Redim Preserve arrWaypoint(Ubound(arrWaypoint)-1) 

End Sub 
Die Methode MoveToWaypoint veranlasst die Figur einen Schritt zum Zielpunkt zu gehen. Wenn man sie im MainLoop des Spiels aufruft, sieht es so aus, als würde sich die Figur kontinuierlich auf das gewünschte Ziel zu bewegen.

Public Sub MoveToWaypoint() 

a = Me.X - arrWaypoint(1).X
b = Me.Y - arrWaypoint(1).Y 

hypo = Sqr((a^2) + (b^2)) 

steps = hypo / Me.Velocity 

Me.X = Me.X - (a / steps)
Me.Y = Me.Y - (b / steps) 

If Me.X = arrWaypoint(1).X And Me.Y = arrWaypoint(1).Y Then
'Wir sind am Zielpunkt angelangt 

RemoveWaypoint 1 

End If 

End Sub 
In der Prozedur geschieht folgendes:

Die Hypothenuse wird aus den Koordinaten der Figur und des Zielorts berechnet. Die Hypothenuse ist die Länge der Strecke, die die Figur zurückzulegen hat. Steps bezeichnet die Anzahl der Schritte, die das Objekt bis zum Zielpunkt machen muss. a / steps bzw. b / steps ist die Länge des Schritts, den wir die Figur in diesem Durchlauf verschieben müssen. Zuletzt überprüfen wir, ob wir schon am Ziel sind. Wenn ja, wird der aktuelle Wegpunkt aus dem Array entfernt und der nachfolgende Wegpunkte rutscht eine Position höher im Array, so dass beim nächsten Durchlauf der MainLoop-Schleife dieser Punkt das Ziel der MoveToWaypoint-Methode ist.


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04510
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06247
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0