I made a simple shooter. The ai follows/homes towards the player. on a random point he moves away and then when he if far enough he return into the follow state. The ai can not shoot. You can shoot. The ai can take 4 hits before they are removed from the list.
Code below :
Import mojo Class _ai Field x:Float Field y:Float Field angle:Int Field speed:Float=2 Field destinationangle:Int Field dist:Int Field state:String="follow" Field hitpoints:Int=4 Method New(_x:Float,_y:Float,_angle:Int) x = _x y = _y angle=_angle End Method Method update() dist = distance(x,y,p.x,p.y) Select state Case "follow" x+=Cos(angle)*speed y+=Sin(angle)*speed destinationangle = getangle(p.x,p.y,x,y) If dist>50 Then 'turn towards player If leftangle(angle,destinationangle) = True Then angle+=3 Else angle-=3 If angle>180 Then angle=-180 If angle<-180 Then angle=180 End If If Rnd(100) < 2 Then state="evade" Case "evade" destinationangle = getangle(x,y,p.x,p.y) If leftangle(angle,destinationangle) = True Then angle+=3 Else angle-=3 If angle>180 Then angle=-180 If angle<-180 Then angle=180 x+=Cos(angle)*speed y+=Sin(angle)*speed If dist > 250 Then state="follow" End Select End Method Method draw() SetColor 255,0,0 DrawOval x,y,10,10 End Method End Class Class playerlaser Field x:Float Field y:Float Field angle:Int Field speed:Float=4 Field delete:Bool=False Method New(_x:Float,_y:Float,_angle:Int) x = _x y = _y angle=_angle End Method Method update() x+=Cos(angle)*speed y+=Sin(angle)*speed If x<-100 Then delete=True If x>DeviceWidth()+100 Then delete = True If y<-100 Then delete = True If y>DeviceHeight+100 Then delete = True ' laser ai collision For Local i:=Eachin ai If rectsoverlap(i.x,i.y,10,10,x,y,10,10) = True delete = True i.hitpoints-=1 If i.hitpoints=0 Then ai.Remove(i) End If Next ' For Local i:=Eachin pl If i.delete = True Then pl.Remove(i) Next End Method Method draw() SetColor 255,255,0 DrawOval x,y,3,3 End Method End Class Class player Field angle:Int Field x:Float = 100 Field y:Float = 100 Field mx:Float = 2 'movement speed x Field my:Float = 2 'movement speed y Method update() ' player controls If KeyHit(KEY_SPACE) pl.AddLast(New playerlaser(x,y,angle)) End If x+=Cos(angle)*mx y+=Sin(angle)*my Local destinationangle = getangle(MouseX(),MouseY(),x,y) If leftangle(angle,destinationangle) = True Then angle+=3 Else angle-=3 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 End Method End Class Global p:player = New player Global pl:List<playerlaser> = New List<playerlaser> Global ai:List<_ai> = New List<_ai> Class MyGame Extends App Method OnCreate() SetUpdateRate(60) ai.AddLast(New _ai(-100,100,0)) ai.AddLast(New _ai(-100,200,0)) ai.AddLast(New _ai(-100,300,0)) ai.AddLast(New _ai(-100,400,0)) End Method Method OnUpdate() p.update For Local i:=Eachin pl i.update Next For Local i:=Eachin ai i.update Next End Method Method OnRender() Cls 0,0,0 SetColor 255,255,255 For Local i:=Eachin ai i.draw Next For Local i:=Eachin pl i.draw Next p.draw SetColor 255,255,255 DrawText "Player (white) moves towards mouse, space = shoot",0,0 End Method End Class Function distance:Int(x1:Int,y1:Int,x2:Int,y2:Int) Return Abs(x2-x1) + Abs(y2-y1) End Function Function getangle:Int(x1:Int,y1:Int,x2:Int,y2:Int) Return ATan2(y1-y2, x1-x2) End Function Function leftangle:Bool(_angle:Int,_destinationangle:Int) Local cnt1 = 0 Local a1 = _angle While a1<>_destinationangle a1+=1 If a1>180 Then a1=-180 cnt1+=1 Wend If cnt1<180 Then Return True Else 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 Function
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.