Code archives/3D Graphics - Misc/Waypoints

This code has been declared by its author to be Public Domain code.

Download source code

Waypoints by kevin80842006
Just a small waypoint system to help newbies over the AI hump. Hope this helps someone.
; **************************************************************************************************
; Simple waypoint system by Kevin Lee Legge (kevin8084@gmail.com)
; This program demonstrates a very simple 3d waypoint system using randomly placed waypoints
; In a game you can place the generated waypoints yourself, or leave them random
; **************************************************************************************************


Graphics3D 800,600,32,1
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Const MAX_POINTS = 25 ; set this to however many waypoints you want

; **************************************************************************************************
; TYPES
; **************************************************************************************************
Type waypoint
	Field entity
	Field number
End Type

Type player
	Field entity
	Field x#,y#,z#
	Field nextpoint
End Type

; Create the "player" - the one who will walk the waypoints
Global p.player=New player
p\entity=CreateSphere()
ScaleEntity p\entity,2,2,2
EntityColor p\entity,100,255,255
EntityShininess p\entity,1
; set the player's next waypoint at 1...or whatever number you like
p\nextpoint = 1 

; since we need to see what's going on, create a camera
Global camera = CreateCamera()
CameraZoom camera,1.6
PositionEntity camera,0,1,-200

; ...let there be light!
light=CreateLight()
PositionEntity light,0,90,0
RotateEntity light,90,0,0

; Create the waypoints
createWaypoints()

; move the mouse to the center of the screen before the main program runs
; this way we can be sure that we are not going to be facing some odd direction
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

While Not KeyHit(1)
If KeyDown(200) Then MoveEntity camera,0,0,.1  ; up arrow
If KeyDown(208) Then MoveEntity camera,0,0,-.1 ; down arrow
If KeyDown(203) Then TurnEntity camera,0,1,0   ; left arrow
If KeyDown(205) Then TurnEntity camera,0,-1,0  ; right arrow

mxs#=-MouseXSpeed()*.25
mys#=MouseYSpeed()*.25
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
TurnEntity camera,mys#,mxs#,0
RotateEntity camera,EntityPitch#(camera),EntityYaw#(camera),0

; alright...now walk that path
walkPath(p)

UpdateWorld
RenderWorld
Text 0,10,"Next Point:"+p\nextpoint
Flip
Delay 10 ; helps prevent laptops from overheating...lets the OS do its thing
Wend
killall() ; free up the memory used
End


Function createWaypoints()
; this function creates the waypoints and places them randomly
For w=1 To MAX_POINTS
	this.waypoint = New waypoint
	this\entity = CreateSphere()
	ScaleEntity this\entity,2,2,2
	EntityColor this\entity,Rand(255),Rand(255),Rand(255)
	EntityShininess this\entity,1
	this\number = w ; we want to know which waypoint this is
	PositionEntity this\entity,Rand(-75,75),Rand(-70,70),Rand(-75,75)
Next
End Function

Function walkPath(p.player)
; this function moves the player from waypoint to waypoint
For this.waypoint = Each waypoint
	If this\number = p\nextpoint Then
		; we have a match
		; you can use any routine here that will point p\entity towards this\entity
		PointEntity p\entity,this\entity
		MoveEntity p\entity,0,0,.7
		If EntityDistance(p\entity,this\entity)<3 Then
			; this determines how close we let p\entity get to the waypoint
			; p\entity is close enough (3 units) to its destination waypoint.
			; time for the next waypoint
			p\nextpoint = p\nextpoint+1
			; if we ran out of waypoints, then go back to the first one
			If p\nextpoint > MAX_POINTS Then p\nextpoint = 1
		End If
	End If
Next
End Function

Function killall()
; kill everything...overkill probably :)
FreeEntity p\entity
Delete p
For w.waypoint = Each waypoint
		FreeEntity w\entity
		Delete w
Next
FreeEntity camera
FreeEntity light
End Function

Comments

markcw2006
hi kevin8084, this is great, thanks. i was a bit vague on waypoint systems until i looked at this.


kevin80842006
no problem. I'm glad that someone benefited from it.


Code Archives Forum