Here a short example of random obstacle avoidance. When the next position in the path is occupied then step into a random direction and continue path.
Code below :
Import mojo
Global mapwidth:Int=20
Global mapheight:Int=20
Global tilewidth:Int=640/mapwidth
Global tileheight:Int=480/mapheight
Global map:Int[mapwidth][]
Class agents
Field x:Int,y:Int,dx:Int,dy:Int
Field delete:Bool=False
Method New(x:Int,y:Int,dx:Int,dy:Int)
Self.x = x
Self.y = y
Self.dx = dx
Self.dy = dy
End Method
Method update()
Local tx:Int=x,ty:Int=y
If x<dx Then tx+=1
If x>dx Then tx-=1
If y<dy Then ty+=1
If y>dy Then ty-=1
If map[tx][ty] = 1 'if occupied step into random direction
Local exitloop = False
While exitloop = False
tx=x+Rnd(-1,2)
ty=y+Rnd(-1,2)
If map[tx][ty] = 0 Then exitloop = True
Wend
End If
'update the position
x = tx
y = ty
'if arived then delete agent from list
If x=dx And y=dy Then delete = True
If delete = True Then
For Local i:=Eachin agent
If i.delete=True Then agent.Remove i
Next
End If
End Method
Method draw()
SetColor 255,0,0
DrawOval x*tilewidth,y*tileheight,tilewidth,tileheight
End Method
End Class
Global agent:List<agents> = New List<agents>
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(10)
'setup the array
For Local i = 0 Until mapwidth
map[i] = New Int[mapheight]
Next
'make the obstacles
For Local i=0 Until 30
Local x1:Int=Rnd(2,18)
Local y1:Int=Rnd(2,18)
map[x1][y1] = 1
Next
End Method
Method OnUpdate()
If Rnd(50)<5 Then addagent
For Local i:=Eachin agent
i.update
Next
End Method
Method OnRender()
Cls 0,0,0
SetColor 255,255,255
drawmap
For Local i:=Eachin agent
i.draw
Next
SetColor 255,255,255
DrawText "Random obstacle avoidance example.",0,0
End Method
End Class
Function addagent:Void()
Local x:Int = 0
Local y:Int = Rnd(mapheight-1)
Local dx:Int = mapwidth-1
Local dy:Int=Rnd(mapheight-1)
agent.AddLast(New agents(x,y,dx,dy))
End Function
Function drawmap:Void()
SetColor 0,255,0
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
If map[x][y] = 1
DrawOval x*tilewidth,y*tileheight,tilewidth,tileheight
End If
Next
Next
End Function
Function Main()
New MyGame()
End Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.