This is the first time I made something like this. You control a player with the cursor left and right. Space is hitting. 2 baddies move towards you and try to hit you. When you hit them 3 times they dissapear. When both baddies are gone then 2 new one appear. You can not die. The hitcount is shown on the characters.
Code below :
Import mojo Const screenwidth:Int=640 Const screenheight:Int=480 Class baddie Field x:Float Field y:Float Field w:Int=32 Field h:Int=48 Field state:String="movein" Field laststate:String Field frame:String Field lastframe:String Field delay:Int Field fight:Bool Field hitcount:Int=3 Field delete:Bool=False Field hashit:Bool Method update() Select state Case "fight" If delay<Millisecs() And distance(x+w/2,y+h/2,p.x+p.w/2,p.y+p.h/2) < 40 Then state="verticalalign" If frame="right" And x>p.x Then frame="left" If frame="left" And x<p.x Then frame="right" If delay< Millisecs() And distance(x+w/2,y+h/2,p.x+p.w/2,p.y+p.h/2) > 80 Then state = "movein" ; fight=False If delay < Millisecs() And (frame="hitright" Or frame="hitleft") frame=lastframe hashit=False End If If delay < Millisecs() And (frame="left" Or frame="right") If Rnd(100)<2 lastframe=frame delay = Millisecs()+400 If frame="left" Then frame="hitleft" hashit = True If rectsoverlap(x-w,y,w*2,h,p.x,p.y,p.w,p.h) = True Then p.hitcount-=1 Else frame="hitright" hashit=True If rectsoverlap(x,y,w*2,h,p.x,p.y,p.w,p.h) = True Then p.hitcount-=1 End If End If End If Case "verticalalign" keepaidistance() If x<p.x And distance(x+w/2,y+h/2,p.x+p.w/2,p.y+p.h/2) < 40 Then x-=1 If x+w>p.x And distance(x+w/2,y+h/2,p.x+p.w/2,p.y+p.h/2) < 40 Then x+=1 If y<p.y Then y+=1 If y>p.y Then y-=1 If y=p.y Then state="fight" Case "evaluate" Local otherfighting:Bool=False For Local i:=Eachin b If i.fight=True Then otherfighting=True Next If otherfighting = False fight=True state="verticalalign" Else state="movein" End If Case "movein" keepaidistance() If distance(x+w/2,y+w/2,p.x+p.w/2,p.y+p.h/2) > 60 If x>p.x Then x-=1 ; frame="left" If x<p.x Then x+=1 ; frame="right" Else state="evaluate" End If If x=p.x Then state="evaluate" End Select For Local i:=Eachin b If i.delete = True Then b.Remove i Next End Method Method keepaidistance() For Local i:=Eachin b If x<>i.x And y<>i.y If distance(x+16,y+16,i.x+16,i.y+16) < 64 Then If x<=i.x Then x-=1 Else x+=1 If y<=i.y Then y-=1 Else y+=1 End If End If Next End Method Method New(_x:Float,_y:Float) x=_x y=_y End Method Method draw() SetColor 255,255,255 Select frame Case "right" DrawRect x,y,w,h Case "left" DrawRect x,y,w,h Case "hitright" DrawRect x,y,w,h DrawRect x,y+10,w*2,10 Case "hitleft" DrawRect x,y,w,h DrawRect x-w,y+10,w,10 End Select DrawText "HC:"+hitcount,x+w/2,y+h/2,0.5,0.5 End Method End Class Class game Method update() End Method End Class Class player Field x:Float=100 Field y:Float=240 Field w:Int=32 Field h:Int=48 Field frame:String="right" Field lastframe:String Field delay:Int Field hitcount:Int=3 Field hashit:Bool=False Method update() If frame="left" Or frame="right" If KeyDown(KEY_DOWN) y+=3 If y>400 Then y=400 End If If KeyDown(KEY_UP) y-=3 If y<200 Then y=200 End If If KeyDown(KEY_RIGHT) frame="right" x+=3 If x+w>screenwidth Then x=screenwidth-w End If If KeyDown(KEY_LEFT) frame="left" x-=3 If x<0 Then x=0 End If End If If KeyDown(KEY_SPACE) If frame="right" Or frame="left" hashit=False delay = Millisecs()+200 If frame="right" Then frame = "hitright" lastframe="right" End If If frame="left" Then frame = "hitleft" lastframe="left" End If End If End If Select frame Case "hitright" If hashit = False For Local i:=Eachin b If rectsoverlap(x,y,w*2,h,i.x,i.y,i.w,i.h) = True i.hitcount -=1 If i.hitcount = 0 Then i.delete = True End If Next hashit=True End If If delay < Millisecs() frame=lastframe End If Case "hitleft" If hashit = False For Local i:=Eachin b If rectsoverlap(x-w,y,w*2,h,i.x,i.y,i.w,i.h) = true i.hitcount -=1 If i.hitcount = 0 Then i.delete = True End If Next hashit=True End If If delay < Millisecs() frame=lastframe End If End Select End Method Method draw() SetColor 255,255,255 Select frame Case "right" DrawRect x,y,w,h Case "left" DrawRect x,y,w,h Case "hitright" DrawRect x,y,w,h DrawRect x,y+10,w*2,10 Case "hitleft" DrawRect x,y,w,h DrawRect x-w,y+10,w,10 End Select DrawText "HC:"+hitcount,x+w/2,y+h/2,0.5,0.5 End Method End Class Global g:game = New game Global p:player = New player Global b:List<baddie> = New List<baddie> Class MyGame Extends App Method OnCreate() SetUpdateRate(60) b.AddLast(New baddie(screenwidth+32,200)) b.AddLast(New baddie(screenwidth+32,350)) End Method Method OnUpdate() If b.IsEmpty() = True Then b.AddLast(New baddie(screenwidth+32,200)) b.AddLast(New baddie(screenwidth+32,350)) End If For Local i:=Eachin b i.update Next p.update End Method Method OnRender() Cls 0,0,0 SetColor 255,255,255 DrawText "Use cursor left/right to move, space to hit.",0,0 For Local i:=Eachin b i.draw Next p.draw 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 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.