Path
Blitz3D Forums/Blitz3D Programming/Path
| ||
| Hello How to create a character following a pre-fabricated path at a variable speed? thanks |
| ||
Use way points. Create an array:Dim waypoint(100,2) ; 101 way points 2= x,y and z then fill each part of the array with the way points co-ords. You'll probably read these in from data statements or what not :) You could use types as well: Type waypoint Field x,y,z End Type w.waypoint=new waypoint w\x=100 w\y=100 w\z=10 for each way point. Then you would have a global variable which kept track of which waypoint you were on. Also, have a pivot (just one), and move it to each new way point, and point the character at the pivot. Then just move the character towards it :) |
| ||
| RossC Thanks for your suggestion My path should be a spline , I am concerned that a lot of waypoints are necessary to create smooth curves what do you think? |
| ||
| Ross C: Sweet mate. I like the idea. Alberto: Is this some kind of race game your making? |
| ||
| Hey Alberto, this should maybe get you started, whipped it up in 10 mins, so it doesn't have smooth path following ;) Press 1 to reveal the waypoints locations :)
Graphics3D 800,600
SetBuffer BackBuffer()
SeedRnd MilliSecs()
Global cam=CreateCamera()
PositionEntity cam,0,7,-20
light=CreateLight()
; SET UP SOME CUBES, JUST FOR SCENARY PURPOSES, TO HIGHLIGHT THE MOVEMENT
Dim cubes(10)
For loop=0 To 10
cubes(loop)=CreateCube()
PositionEntity cubes(loop),Rand(-15,15),1,Rand(-17,17)
EntityAlpha cubes(loop),0.2
Next
;/ END OF CUBES SET UP
; CREATE THE 'PLAYER'
Global sphere=CreateSphere()
; SET THE NUMBER OF WAYPOINTS YOU WANT
Global no_of_waypoints=10 ; number of waypoint you want, - 1
; SET UP THE WAYPOINT DATA
Dim waypoints#(no_of_waypoints,3); the 3 is for X Y & Z co-ords and the speed
; 0 = x
; 1 = y
; 2 = z
; 3 = speed
waypoint_data(no_of_waypoints); get the waypoint positions and speed
; SET UP THE WAYPOINT MARKERS. SIMPLY A VISUAL REPRESENTATION OF WHERE THE WAYPOINTS ARE, NOTHING MORE
Dim waypoint_markers(no_of_waypoints); visible representations of the waypoints, purely for clarity
For loop=0 To no_of_waypoints
waypoint_markers(loop)=CreateSphere(2)
EntityAlpha waypoint_markers(loop),0
EntityColor waypoint_markers(loop),50,50,200
Next
position_markers(no_of_waypoints); position the waypoint markers
; CREATE THE PIVOT THAT THE PLAYER WILL GOTO. THIS PIVOT IS SET TO THE CURRENT WAYPOINT POSITION, WHICH
; THE PLAYER POINTS TO AND FOLLOWS
Global waypoint_pivot=CreatePivot()
Global waypoint_number=0 ; what waypoint the program will start on
While Not KeyHit(1)
If KeyDown(2) Then ; IF KEY 1 IS PRESSED THEN
show_waypoints() ; SHOW THE WAY POINTS
End If
update_waypoints(waypoint_number); UPDATE THE WAYPOINTS AND THE PLAYER FOLLOWING THEM
PointEntity cam,sphere; POINT THE CAMERA AT THE SPHERE
UpdateWorld
RenderWorld
Flip
Wend
End
Function show_waypoints()
For loop=0 To no_of_waypoints
EntityAlpha waypoint_markers(loop),0.6
Next
End Function
Function waypoint_data(number) ; Set random waypoint positions and a random speed for each waypoint
For loop=0 To number
waypoints(loop,0)=Rnd(-20,20) ; x
waypoints(loop,1)=Rnd(-7,9) ; y
waypoints(loop,2)=Rnd(-20,20) ; z
waypoints(loop,3)=Rnd(0.1,0.5) ; random speed
Next
End Function
Function position_markers(number); simply position the markers at the waypoint locations
For loop=0 To number
PositionEntity waypoint_markers(loop),waypoints(loop,0),waypoints(loop,1),waypoints(loop,2); position the way point markers
Next
End Function
Function update_waypoints(waypoint_no) ; update the player, so he follows each waypoint
; Line Below: position the waypoint pivot at the location of the current waypoint
PositionEntity waypoint_pivot,waypoints(waypoint_no,0),waypoints(waypoint_no,1),waypoints(waypoint_no,2)
PointEntity sphere,waypoint_pivot; Point the sphere (player) at the current waypoint location
MoveEntity sphere,0,0,waypoints(waypoint_no,3); move the sphere (player) towards the current way-point
; using the current way-points speed
If EntityDistance#(sphere,waypoint_pivot)<2 Then ; if the sphere (player) comes pretty close to the waypoint
; within 2 units, then...
waypoint_number=waypoint_number+1 ; move to the next way-point
If waypoint_number > no_of_waypoints Then ; if the waypoint is past the last way-point then...
waypoint_number=0 ; loop it back to the very first waypoint
End If
End If
End Function
|
| ||
| cyberheater I like the RossC's idea myself. however It is a kind of sport game , my character should quicly change direction and the straight segments of the path are rather short (you can imagine a runner of american football, for example ) That's way I am concerned that RossC's methods takes too many waypoints, also it may be not reliable to keep track of waypoints, being the distance beetwen two adjacent waypoints rather small I had in mind a pattern filled with op codes something like : run,50,bend,45°, etc I will try both methods. Thanks in advance for any further comments \ suggestions |
| ||
| RossC thanks a lot for your help I will try to edit your code to fit my needs |
| ||
| This may also be worth a look: A* Pathfinding for Beginners http://www.policyalmanac.org/games/aStarTutorial.htm |
| ||
| turtle1776 thanks, very interesting |