Here a small example of how to do simple roaming/wandering ai that turns if it finds a wall in its way.
Code below :
Import mojo
Const numagents:Int=10
Global mapwidth:Int=10
Global mapheight:Int=10
Global tilewidth:Int=640/mapwidth
Global tileheight:Int=480/mapheight
Global map:Int[][] = [ [1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,1,1,1,1],
[1,0,0,1,0,0,0,0,0,1],
[1,0,0,1,0,0,0,0,0,1],
[1,1,1,1,0,0,0,0,0,1],
[1,0,0,0,0,0,0,1,0,1],
[1,0,0,0,0,0,0,1,0,1],
[1,1,1,1,1,1,1,1,1,1] ]
Class agents
Field x:Float,y:Float
Field angle:Int
Method New(x:Float,y:Float)
Self.x = x
Self.y = y
angle=Rnd(-180,180)
End Method
Method update()
x+=Cos(angle)*3
y+=Sin(angle)*3
' here we check 64 pixels in the angle we are going into
' if there is a wall there then the obstr boolean is set
Local x1:Float=x
Local y1:Float=y
Local obstr:Bool=False
For Local i=0 To 64
x1=x+Cos(angle)*i
y1=y+Sin(angle)*i
Local x2:Int=x1/tilewidth
Local y2:Int=y1/tileheight
If x2>-1 And y2>-1 And x2<mapwidth And y2<mapheight
If map[y2][x2] = 1 Then
obstr = True
Exit
End If
End If
Next
' if obstructed then turn
If obstr = True
angle+=16
End If
' random movement
If Rnd(10)<2 Then angle+=Rnd(-15,15)
' keep angle in check
If angle>180 Then angle = -180
If angle<-180 Then angle=180
End Method
Method draw()
SetColor 255,255,255
DrawOval x,y,10,10
DrawLine x+5,y+5,x+Cos(angle)*64,y+Sin(angle)*64
End Method
End Class
Global agent:List<agents> = New List<agents>
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
' ceate the agents on open tiles
For Local i=0 Until numagents
Local exitloop:Bool = False
While exitloop = False
Local x:Int=Int(Rnd(10))
Local y:Int=Int(Rnd(10))
If map[y][x] = 0
agent.AddLast(New agents((x*tilewidth)+tilewidth/2,(y*tileheight)+tileheight/2))
exitloop = True
End If
Wend
Next
End Method
Method OnUpdate()
Seed = Millisecs()
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 "Ray Casting roaming ai example.",0,0
End Method
End Class
Function drawmap:Void()
SetColor 200,200,200
For Local y=0 Until mapheight
For Local x=0 Until mapwidth
If map[y][x] = 1
SetColor 200,200,200
DrawRect 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.