Import mojo Global ang:Float=0 ' poly shape Global ship:Float[]=[ -5.0,-5.0, 5.0,0.0, -5.0,5.0] Class bullet Field x:Float Field y:Float Field angle:Float Field speed:Float Field timeout:Int Field deleteme:Bool=False Field tp:Int 'type of bullet/laser Method New( x:Int,y:Int, angle:Float, speed:Float, tp:Int) Self.x = x Self.y = y Self.angle = angle Self.speed = speed Self.tp = tp timeout = 200 End Method Method update() x+=Cos(angle)*speed y+=Sin(angle)*speed timeout-=1 If timeout<0 Then deleteme = True End If End Method Method draw() SetColor 255,255,0 Select tp Case 1 DrawOval x-3,y-3,6,6 Case 2 DrawOval x-6,y-6,12,12 End Select End Method End Class Global mybullet:List<bullet> = New List<bullet> Class MyGame Extends App Field bulletdelay:Int=30 Method OnCreate() SetUpdateRate(60) End Method Method OnUpdate() ang+=1 If ang>360 Then ang=0 ' here we shoot when bulletdelay ' is <0 bulletdelay-=1 If bulletdelay<0 shoot(Rnd(1,4)) bulletdelay=30 Endif ' For Local i:=Eachin mybullet i.update If i.deleteme = True mybullet.Remove(i) End If Next End Method Method OnRender() Cls 0,0,0 SetColor 255,255,255 PushMatrix() Translate DeviceWidth()/2,DeviceHeight()/2 Rotate(-ang) Scale(4,4) DrawPoly(ship) PopMatrix() Translate 0,0 SetColor 255,0,0 DrawLine DeviceWidth()/2, DeviceHeight()/2, DeviceWidth()/2+Cos(ang)*64, DeviceHeight()/2+Sin(ang)*64 For Local i:=Eachin mybullet i.draw Next SetColor 255,255,255 DrawText "MonkeyX - Space game ship/shooting/rotating example.",0,0 End Method End Class Function shoot(tp:Int) Select tp Case 1 'forwards shot mybullet.AddLast(New bullet( DeviceWidth/2, DeviceHeight/2, ang, 3, 1)) 'backward shot mybullet.AddLast(New bullet( DeviceWidth/2, DeviceHeight/2, ang-180, 3, 1)) Case 2 ' three forwards spread shot For Local a=-16 To 16 Step 16 mybullet.AddLast(New bullet( DeviceWidth/2, DeviceHeight/2, ang+a, 2, 2)) Next Case 3 ' circle shot For Local a=0 Until 360 Step 16 mybullet.AddLast(New bullet( DeviceWidth/2, DeviceHeight/2, ang+a, 4, 1)) Next End Select End Function Function Main() New MyGame() End Function
Artificial intelligence/templates/examples/rts/rpg/strategy ect. in MonkeyX/CerberusX language. You can download the free version of MonkeyX from itch.io or Cerberus-x.com The Flash applets will stop working in around 2020.
Saturday, March 26, 2016
MonkeyX - Space Game Ship/Shooting/rotation - code example
MonkeyX - Space game Ship/Map/Scrolling - code example
If you need a starting point for a space game look at this. Ship and rotation. Map
Scrolls based on the angle/direction of the ship.
Import mojo
Global tilewidth:Int=32
Global tileheight:Int=32
Global ang:Float=0
Global thrust:Float=2
' poly shape
Global ship:Float[]=[ -5.0,-5.0,
5.0,0.0,
-5.0,5.0]
Class map
Field mapx:Float=0
Field mapy:Float=0
Field map:Int[][] = [ [0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],
[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0],
[0,1,0,1,0,1,0,0,0,1,0,1,0,1,0],
[0,1,0,0,0,0,1,1,1,0,0,0,0,1,0],
[0,1,0,1,0,0,1,0,1,0,0,1,0,1,0],
[0,1,0,0,0,0,1,1,1,0,0,0,0,1,0],
[0,1,0,1,0,1,0,0,0,1,0,1,0,1,0],
[0,1,0,0,1,0,0,0,0,0,1,0,0,1,0],
[0,0,0,1,0,1,0,1,0,1,0,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]
Method New()
End Method
Method update()
mymap.mapx -= Cos(ang)*thrust
mymap.mapy -= Sin(ang)*thrust
End Method
Method draw()
SetColor 155,155,155
For Local y=0 Until 10
For Local x=0 Until 15
If map[y][x] = 1
DrawRect x*tilewidth+mapx,
y*tileheight+mapy,
tilewidth,
tileheight
End If
Next
Next
End Method
End Class
Global mymap:map = New map()
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(60)
End Method
Method OnUpdate()
ang+=1
If ang>360 Then ang=0
mymap.update
End Method
Method OnRender()
Cls 0,0,0
mymap.draw
SetColor 255,255,255
PushMatrix()
Translate DeviceWidth()/2,DeviceHeight()/2
Rotate(-ang)
Scale(4,4)
DrawPoly(ship)
PopMatrix()
Translate 0,0
SetColor 255,0,0
DrawLine DeviceWidth()/2,
DeviceHeight()/2,
DeviceWidth()/2+Cos(ang)*64,
DeviceHeight()/2+Sin(ang)*64
SetColor 255,255,255
DrawText "MonkeyX - Space game ship/map/scrolling example",0,0
End Method
End Class
Function Main()
New MyGame()
End Function
MonkeyX - Space Game Make/Rotate Poly and Cos Sin - code example
If you need to know how to start a top down space game then take a look at this.
'angle 0 is facing right ' ' 000 ' 0-- - = angle 0 ' 000 Import mojo Class MyGame Extends App Global ang:Float=0 Method OnCreate() SetUpdateRate(60) End Method Method OnUpdate() ang+=1 If ang>360 Then ang=0 End Method Method OnRender() Cls 0,0,0 'center of the image is 0,0 on screen 'here we create the poly shape_coords Local vorm1:Float[]=[ -5.0,-5.0, 5.0,0.0, -5.0,5.0] SetColor 255,255,255 PushMatrix() ' we draw the poly to translated coords Translate DeviceWidth()/2,DeviceHeight()/2 ' rotate in reverse Rotate(-ang) ' enlarge times Scale(4,4) ' draw the poly DrawPoly(vorm1) PopMatrix() 'translate back to 0,0 Translate 0,0 SetColor 255,0,0 DrawLine DeviceWidth()/2, DeviceHeight()/2, DeviceWidth()/2+Cos(ang)*64, DeviceHeight()/2+Sin(ang)*64 SetColor 255,255,255 DrawText "MonkeyX - Space game Rotate Poly and Cos Sin example",0,0 DrawText "angle:"+ang,0,20 End Method End Class Function Main() New MyGame() End Function
Tuesday, March 22, 2016
MonkeyX - 2d Line Explosion Effect - code example
Import mojo Global numrings:Int=20 Class ring Field x1:Int,y1:Int Field x2:Float[] Field y2:Float[] Field spd:Float[] Field ang:Int[] Field n:Int Field thetime:Int Field timeout:Int Field deleteme:Bool Method New(x:Int,y:Int,num:Int,tmo:Int) timeout = tmo x1 = x y1 = y x2 = New Float[num] y2 = New Float[num] spd = New Float[num] ang = New Int[num] n = num For Local i=0 Until num ang[i] = (i*(360/num)) x2[i] = x1+Cos(ang[i])'*Rnd(1,7) y2[i] = y1+Sin(ang[i])'*Rnd(1,7) spd[i] = 1'Rnd(0.2,0.8) Next End Method Method update() For Local i=0 Until n x2[i]+=Cos(ang[i])*spd[i] y2[i]+=Sin(ang[i])*spd[i] Next thetime+=1 If thetime > timeout deleteme = True End If End Method Method draw() SetColor 0,0,0 For Local i=1 Until n DrawLine x2[i-1],y2[i-1],x2[i],y2[i] Next DrawLine x2[0],y2[0],x2[n-1],y2[n-1] End Method End Class Global r:List<ring> = New List<ring> Class MyGame Extends App ' time containers Field newring:Int[numrings] 'locations on screen Field lx:Int[numrings] Field ly:Int[numrings] Method OnCreate() SetUpdateRate(60) ' set random positions For Local i=0 Until numrings lx[i] = Rnd(0,DeviceWidth) ly[i] = Rnd(0,DeviceHeight) Next End Method Method OnUpdate() For Local i=0 Until numrings newring[i]-=1 ' if time If newring[i]<0 ' chance for new location If Rnd(100)<10 lx[i] = Rnd(0,DeviceWidth) ly[i] = Rnd(0,DeviceHeight) End If 'add new ring r.AddLast(New ring( lx[i], ly[i], Rnd(3,20), Rnd(10,60))) ' set new time newring[i] = Rnd(10,40) End If Next ' update the rings For Local i:=Eachin r i.update If i.deleteme = True r.Remove(i) End If Next End Method Method OnRender() Cls 255,255,255 SetColor 0,0,0 'draw the rings For Local i:=Eachin r i.draw Next End Method End Class Function Main() New MyGame() End Function
Monday, March 21, 2016
MonkeyX - Sideview Mining Map Generator - code example
Import mojo Global mapwidth:Int=200 Global mapheight:Int=100 Class maptest Field tw:Float,th:Float Field w:Int,h:Int 'bottom x and y contain the coords of the next 'shaft to be created. center of room last pass Field bottomy:Int Field bottomx:Int Field map:Int[][] Method New(w:Int,h:Int) Self.w = w Self.h = h tw = DeviceWidth()/w th = DeviceHeight()/h map = New Int[w][] For Local i=0 Until w map[i] = New Int[h] Next drawmaprect(0,0,w-1,15) For Local i=0 Until h map[1][i] = 0 map[w-2][i] = 0 Next ' x,y,number of tunnels>> makemine(w/2,15,Rnd(1,3)) makemine(bottomx,bottomy,Rnd(1,3)) If bottomy<(Float(mapheight)/2) makemine(bottomx,bottomy,Rnd(1,3)) End If End Method Method makemine(x:Int,y:Int,depth:Int) Local vy:Int=y For Local mydepth=0 Until depth Local d1:Int=Rnd(8,16)'depth tunneldown(x,y,d1) y+=d1 Local d2:Int=Rnd(1,4)'direction If d2=1 Then sidetunnel(x,y,"left") End If If d2=2 Then sidetunnel(x,y,"right") End If If d2=3 Then sidetunnel(x,y,"left") sidetunnel(x,y,"right") End If Next For Local y1=vy Until bottomy+2 map[x][y1] = 2 Next End Method Method sidetunnel(x:Int,y:Int,d:String) If d="left" Local width:Int=Rnd(5,15) drawmaprect(x-width+2,y,width,3) Local roomw:Int=Rnd(5,15) drawmaprect(x-width+2-roomw,y-1,roomw,5) For Local x1=0 Until roomw/3 map[(x-width+2-roomw)+x1][y+4] = 3 Next bottomx = x-width-(roomw/2) bottomy = y End If If d="right" Local width:Int=Rnd(5,15) drawmaprect(x-1,y,width,3) Local roomw:Int=Rnd(5,15) drawmaprect(x+width,y-1,roomw,5) For Local x1=roomw Until roomw/1.5 Step -1 map[(x+width)+x1][y+4] = 3 Next bottomx = x+width+(roomw/2) bottomy = y End If End Method Method tunneldown(x:Int,y:Int,d:Int) drawmaprect(x-2,y,4,d) End Method Method drawmaprect(x:Int,y:Int,w:Int,h:Int) For Local y1=y To y+h For Local x1=x To x+w map[x1][y1] = 1 Next Next End Method Method draw() For Local y=0 Until h For Local x=0 Until w Local x1:Float=DeviceWidth()/Float(mapwidth)*Float(x) Local y1:Float=DeviceHeight/Float(mapheight)*Float(y) If map[x][y] = 1 SetColor 255,255,255 DrawRect x1,y1,tw,th+1 End If If map[x][y] = 3 SetColor 200,200,10 DrawOval x1,y1,tw,th+1 End If Next Next End Method End Class ' ----------------------------------------------------------------------------------------------- Global mymaptest:maptest Class MyGame Extends App Field nmap:Int=0 Method OnCreate() Local date := GetDate() Seed = date[5] SetUpdateRate(60) restartgame End Method Method OnUpdate() nmap+=1 If KeyDown(KEY_SPACE)=False And nmap>60 restartgame nmap=0 End If End Method Method OnRender() Cls 0,0,0 mymaptest.draw SetColor 255,255,0 DrawText "Hold Spacebar to pauze",20,DeviceHeight()-15 DrawText "MonkeyX Sideview - Mining map Example",20,0 End Method End Class Function Main() New MyGame() End Function Function restartgame() mymaptest = New maptest(mapwidth,mapheight) End Function 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
Subscribe to:
Posts (Atom)