The code below is around 400 lines long. This is becourse the ai is pretty smart. I made them be able to roam the map. They jump on platforms. There is also a player tha you can move around with the cursor keys and space bar. You can set the amount of ai entities on the map with the numai variable.
Import mojo
Class ai
Field x:Float
Field y:Float
Field state:String
Field laststate:String
Field incy:Float
Method New()
Local exitloop = False
While exitloop = False
Local x1 = Rnd(0,mapwidth)
Local y1 = Rnd(0,mapheight-1)
If map[y1][x1] = 0
If map[y1+1][x1] = 1
Local gothrough = True
For Local i:ai = Eachin ailist
If i.x = x1 And i.y = y1 Then gothrough = False
Next
If gothrough = True
x = x1*tilewidth
y = y1*tileheight
exitloop = True
End If
End If
End If
Wend
state = "Wait"
End Method
End Class
Const numai:Int=10
Const aiwidth:Int = 32
Const aiheight:Int = 32
Const playerwidth:Int=32
Const playerheight:Int=32
Global playerx:Float = 640/2-16
Global playery:Float = 480/2
Global pincy:Float
Global playerjump:Bool=False
Const tilewidth = 32
Const tileheight = 32
Const mapwidth:Int=20
Const mapheight:Int=10
Global map:Int[][] = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1],
[1,0,0,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],
[1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] ]
Global ailist:List<ai> = New List<ai>
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
Seed = 2
For Local i:Int = 0 Until numai
ailist.AddLast(New ai)
Next
End
Method OnUpdate()
updateai
' Player left and right movement
playermovement()
' player gravity
playergravity()
End
Method OnRender()
Cls(0,0,0)
SetColor(255,255,255)
' draw the map
For Local y:Int = 0 Until mapheight
For Local x:Int = 0 Until mapwidth
If map[y][x] = 1 Then DrawRect(x*tilewidth,y*tileheight,tilewidth,tileheight)
End
End
SetColor 255,0,0
For Local i:ai = Eachin ailist
DrawRect i.x,i.y,aiwidth,aiheight
Next
SetColor 255,255,255
DrawText "Platformer with ai Example",10,10
DrawText "Use cursor left/right and space bar to move player",10,25
' draw the player
SetColor 255,255,0
DrawOval playerx,playery,playerwidth,playerheight
End
End
Function updateai:Void()
For Local i:ai = Eachin ailist
Select i.state
Case "Wait"
If Rnd(0,100) < 2
If Int(Rnd(0,2)) = 1
i.laststate="Wait"
i.state="Left"
Else
i.laststate="Wait"
i.state="Right"
End If
End If
Case "Left"
If aitc(i.x,i.y,0,1) = False
i.laststate="Left"
i.state="Falling"
i.incy = 0
End If
If canjumpleftupfar(i.x,i.y) = True And Int(Rnd(0,18)) = 1
i.laststate="Left"
i.state="Jumpleftup"
i.incy=-4
End If
If aitc(i.x,i.y,-2,0) = False
i.x-=2
Else
If canjumpleftup(i.x,i.y) = True And Int(Rnd(0,3)) = 1
i.laststate="Left"
i.state = "Jumpleftup"
i.incy = -4
Else
i.laststate="Left"
i.state="Right"
End If
End If
Case "Right"
If aitc(i.x,i.y,0,1) = False
i.laststate="Right"
i.state="Falling"
i.incy = 0
End If
If canjumprightupfar(i.x,i.y) = True And Int(Rnd(0,18)) = 1
i.laststate="Right"
i.state="Jumprightup"
i.incy=-4
End If
If aitc(i.x,i.y,2,0) = False
i.x+=2
Else
If canjumprightup(i.x,i.y) = True And Int(Rnd(0,3)) = 1 Then
i.laststate="Right"
i.state = "Jumprightup"
i.incy = -4
Else
i.laststate="Right"
i.state="Left"
End If
End If
Case "Falling"
If i.incy <= 3 Then i.incy +=.1
For Local ii:Int = 0 Until i.incy
i.y += 1
If aitc(i.x,i.y,0,1) = True
i.state = i.laststate
i.laststate = "Falling"
Exit
End
End
Case "Jumprightup"
If aitc(i.x,i.y,2,0) = False
i.x+=2
End If
i.incy += .1
For Local ii:Int = 0 Until Abs(i.incy)
i.y -= 1
If aitc(i.x,i.y,0,-1) = True Or i.incy > 0
i.state="Fallrightdown"
Exit
End If
Next
Case "Fallrightdown"
If aitc(i.x,i.y,2,0) = False
i.x+=2
End If
i.incy+=.1
For Local ii:Int = 0 Until i.incy
i.y += 1
If aitc(i.x,i.y,0,1) = True
i.state = i.laststate
i.laststate = "Fallrightdown"
Exit
End
End
Case "Jumpleftup"
If aitc(i.x,i.y,-2,0) = False
i.x-=2
End If
i.incy += .1
For Local ii:Int = 0 Until Abs(i.incy)
i.y -= 1
If aitc(i.x,i.y,0,-1) = True Or i.incy > 0
i.state="Fallleftdown"
Exit
End If
Next
Case "Fallleftdown"
If aitc(i.x,i.y,-2,0) = False
i.x-=2
End If
i.incy+=.1
For Local ii:Int = 0 Until i.incy
i.y += 1
If aitc(i.x,i.y,0,1) = True
i.state = i.laststate
i.laststate = "Fallleftdown"
Exit
End
End
End Select
Next
End Function
Function canjumpleftupfar:Bool(x:Int,y:Int)
Local tx=x/tilewidth
Local ty=y/tileheight
If tx - 3 > 0
If ty - 3 > 0
If map[ty-1][tx-2] = 1
If map[ty-2][tx-2] = 0
Return True
End If
End If
End If
End If
Return False
End Function
Function canjumprightupfar:Bool(x:Int,y:Int)
Local tx=x/tilewidth
Local ty=y/tileheight
If tx + 3 < mapwidth
If ty - 3 > 0
If map[ty-1][tx+2] = 1
If map[ty-2][tx+2] = 0
Return True
End If
End If
End If
End If
Return False
End Function
Function canjumprightup:Bool(x:Int,y:Int)
Local tx=x/tilewidth
Local ty=y/tileheight
If map[ty-2][tx+1] = 0 Then Return True
Return False
End Function
Function canjumpleftup:Bool(x:Int,y:Int)
Local tx=x/tilewidth
Local ty=y/tileheight
If map[ty-2][tx-1] = 0 Then Return True
Return False
End Function
Function playermovement:Void()
If KeyDown(KEY_RIGHT)
For Local i=0 Until 2
If playertc(1,0) = False
playerx+=1
End If
Next
End If
If KeyDown(KEY_LEFT)
For Local i=0 Until 2
If playertc(-1,0) = False
playerx-=1
End If
Next
End If
End Function
Function playergravity:Void()
' If the player is on the ground and the space bar is pressed
If playerjump = False And playertc(0,1) = False
playerjump = True
pincy = 0
End If
If playerjump = False And KeyDown(KEY_SPACE) = True
pincy = -4
playerjump = True
End
'If the player is in the jump
If playerjump = True
pincy += 0.1
'if the player is going up
If pincy <=0
For Local i:Int = 0 Until Abs(pincy)
playery -= 1
If playertc(0,-1) = True
pincy = 0
Exit
End If
End
End
' if the player if going down
If pincy > 0
For Local i:Int = 0 Until pincy
playery += 1
'if the player touches the ground
If playertc(0,1) = True
playerjump = False
Exit
End
End
End
End
End Function
' Ai with tile collision
Function aitc:Bool(x:Int,y:Int,offsetx:Int=0,offsety:Int=0)
Local cx = (x + offsetx) / tilewidth
Local cy = (y + offsety) / tileheight
For Local y2=cy-1 Until cy+2
For Local x2=cx-1 Until cx+2
If x2>=0 And x2<mapwidth And y2>=0 And y2<mapheight
If map[y2][x2] > 0
If rectsoverlap(x+offsetx,y+offsety,aiwidth,aiheight,x2*tilewidth,y2*tileheight,tilewidth,tileheight) = True
Return True
End If
End If
End If
Next
Next
Return False
End Function
Function playertc:Bool(x1:Int=0,y1:Int=0)
Local cx = (playerx + x1) / tilewidth
Local cy = (playery + y1) / tileheight
For Local y2=cy-1 Until cy+2
For Local x2=cx-1 Until cx+2
If x2>=0 And x2<mapwidth And y2>=0 And y2<mapheight
If map[y2][x2] > 0
If rectsoverlap(playerx+x1,playery+y1,playerwidth,playerheight,x2*tilewidth,y2*tileheight,tilewidth,tileheight) = True
Return True
End If
End If
End If
Next
Next
Return False
End Function
Function rectsoverlap:Bool(x1:Int, y1:Int, w1:Int, h1:Int, x2:Int, y2:Int, w2:Int, h2:Int)
If x1 >= (x2 + w2) Or (x1 + w1) <= x2 Then Return False
If y1 >= (y2 + h2) Or (y1 + h1) <= y2 Then Return False
Return True
End
Function Main()
New MyGame()
End
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.