Import mojo Global tr:Int=90 Global tg:Int=10 Global tb:Int=150 Class dot Field x:Float,y:Float Field rad:Int Field alpha:Float Field r:Int,g:Int,b:Int Method New() x = Rnd(640) y = Rnd(480) rad = Rnd(3,7) alpha = Rnd(0.4,0.8) Local c:Int=Rnd(50,255) If Rnd()<.8 Then r = 255 g = 255 b = 255 If Rnd()<.5 rad=2 End If else r = c/2+tr/2 g = c/2+tg/2 b = c/2+tb/2 End If End Method Method draw() SetColor r,g,b SetAlpha alpha DrawCircle x,y,rad End Method End Class Class flake Field x:Float,y:Float Field angle:Float Field size:Float Field thick:Bool Field alpha:Float Method New(x:Float,y:Float,size:Int) Self.x = x Self.y = y Self.size = size alpha = Rnd(0.2,0.9) angle = Rnd(360) If Rnd()<.5 Then thick=True Else thick=False End Method Method draw() SetAlpha alpha PushMatrix() Translate(x,y) Rotate(angle) Translate(-x,-y) SetColor 255,255,255 For Local i=0 To 360-45 Step 45 Local x1:Int=x+Cos(i)*size Local y1:Int=y+Sin(i)*size Local size2:Float=size/5+size/5 For Local i2=0 Until 3 Local x2:Int=x+Cos(i)*size2 Local y2:Int=y+Sin(i)*size2 Local size3:Int If i2 = 0 Then size3=size/4 If i2 = 1 Then size3=size/3 If i2 = 2 Then size3=size/5 Local x3:Int=x2+Cos(i-40)*size3 Local y3:Int=y2+Sin(i-40)*size3 Local x4:Int=x2+Cos(i+40)*size3 Local y4:Int=y2+Sin(i+40)*size3 DrawLine x2,y2,x3,y3 DrawLine x2,y2,x4,y4 If thick = True DrawLine x2+1,y2,x3+1,y3 DrawLine x2+1,y2,x4+1,y4 End If size2+=size/5 Next DrawLine x,y,x1,y1 If thick = True Then DrawLine x+1,y,x1+1,y1 End If Next PopMatrix() SetAlpha 1 End Method Method newang:Int(ang1:Int,m:Int) ang1 += m If ang1<0 Then Return 360+m If ang1>359 Then Return 0+m End Method End Class Global myflakes:List<flake> = New List<flake> Global mydots:List<dot> = New List<dot> Class MyGame Extends App Method OnCreate() SetUpdateRate(60) Seed = 3 For Local i=0 Until 170 mydots.AddLast(New dot()) Next For Local y=0 Until 480+128 Step 128 For Local x=0 Until 640+128 Step 128 Local mx:Int=Rnd(-64,64) Local my:Int=Rnd(-64,64) myflakes.AddLast(New flake(x+mx,y+my,Rnd(32,64))) Next Next End Method Method OnUpdate() End Method Method OnRender() Cls tr,tg,tb SetColor 255,255,255 For Local i:=Eachin mydots i.draw Next For Local i:=Eachin myflakes i.draw Next Scale 4,4 SetAlpha .76 SetColor 255,255,255 DrawText "Merry Christmas",DeviceWidth/(2*4),20,.5,.5 DrawText "And a",DeviceWidth/(2*4),DeviceHeight/4/4,.5,.5 DrawText "Happy new Year",DeviceWidth/(2*4),DeviceHeight/3/4,.5,.5 Scale 1,1 SetAlpha 1 End Method End Class 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.
Sunday, December 25, 2016
Monkey-X - Hollyday Greetings Screen - code example
Monkey-X - Random Maze and Random Cave tiles - code example
Import mojo Global sw:Int=640 Global sh:Int=480 Global mapwidth:Int=19 Global mapheight:Int=15 Global smooth1:Int=10 Global minsmooth1:Int=3 Global maxsmooth1:Int=30 Global smooth2:Int=20 Global minsmooth2:Int=3 Global maxsmooth2:Int=30 Global myseed:Int=300 Global tilewidth:Int=32 Global tileheight:Int=32 Global maxsize:Int=tilewidth/2 Global size:Int=tilewidth/2 Class map Field image:Image[][] Field imagepixels:Int[] Field imagemap:Int[][] Field map1:Int[][] Field map2:Int[][] Field map3:Int[][][] Field mazex:Stack<Int> = New Stack<Int> Field mazey:Stack<Int> = New Stack<Int> Method New() imagemap = New Int[tilewidth][] For Local i=0 Until tilewidth imagemap[i] = New Int[tileheight] Next map1 = New Int[mapwidth][] For Local i=0 Until mapwidth map1[i] = New Int[mapheight] Next map2 = New Int[mapwidth/2][] map3 = New Int[mapwidth/2][][] For Local i=0 Until mapwidth/2 map2[i] = New Int[mapheight/2] map3[i] = New Int[mapheight/2][] For Local z = 0 Until mapheight/2 map3[i][z] = New Int[4] Next Next image = New Image[mapwidth][] For Local i=0 Until mapwidth image[i] = New Image[mapheight] Next For Local y=0 Until mapheight For Local x=0 Until mapwidth image[x][y] = CreateImage(tilewidth,tileheight) Next Next imagepixels = New Int[tilewidth*tileheight] Seed = myseed makemaze() tilesonmap() 'maketile() 'map1[0][0]=1 'finalizeimage(0,0) End Method Method tilesonmap() Local top:Bool=False Local right:Bool=False Local bottom:Bool=False Local left:Bool=False For Local y=1 Until mapheight-1 For Local x=1 Until mapwidth-1 If map1[x][y] = 1 If map1[x][y-1] = 1 Then top=True Else top=False If map1[x+1][y] = 1 Then right=True Else right=False If map1[x][y+1] = 1 Then bottom=True Else bottom=False If map1[x-1][y] = 1 Then left=True Else left = False maketile(top,right,bottom,left) finalizeimage(x,y) End If Next Next For Local x=1 Until mapwidth-1 top=False If map1[x][0] = 1 If map1[x+1][0] = 1 Then right = True Else right=False If map1[x][1] = 1 Then bottom = True Else bottom=False If map1[x-1][0] = 1 Then left = True Else left=False maketile(top,right,bottom,left) finalizeimage(x,0) End If bottom=False If map1[x][mapheight-1] = 1 If map1[x][mapheight-2] = 1 Then top=True Else top=False If map1[x+1][mapheight-1] = 1 Then right=True Else right =False If map1[x-1][mapheight-1] = 1 Then left = True Else left=False maketile(top,right,bottom,left) finalizeimage(x,mapheight-1) End If Next For Local y=1 Until mapheight-1 left=False If map1[0][0] = 1 If map1[0][y-1] = 1 Then top = True Else top=False If map1[1][y] = 1 Then right=True Else right=False If map1[0][y+1] = 1 Then bottom=True Else bottom=False maketile(top,right,bottom,left) finalizeimage(0,y) End If right=False If map1[mapwidth-1][y] = 1 If map1[mapwidth-1][y-1] = 1 Then top=True Else top=False If map1[mapwidth-1][y+1] = 1 Then bottom = True Else bottom=False If map1[mapwidth-2][y] = 1 Then left=True Else left = False maketile(top,right,bottom,left) finalizeimage(mapwidth-1,y) End If Next If map1[mapwidth-1][mapheight-1] = 1 bottom=False right=False If map1[mapwidth-2][mapheight-1] = 1 Then left=True Else left=False If map1[mapwidth-1][mapheight-2] = 1 Then top=True Else top=False maketile(top,right,bottom,left) finalizeimage(mapwidth-1,mapheight-1) End If End Method Method maketile(top:Bool=False,right:Bool=False,bottom:Bool=False,left:Bool=False) For Local y=0 Until tileheight For Local x=0 Until tilewidth imagemap[x][y] = 0 Next Next smooth1 = Rnd(minsmooth1,maxsmooth1) smooth2 = Rnd(minsmooth2,maxsmooth2) If Rnd()<.8 Then smooth1 = Rnd(minsmooth1,10) Local ang:Int=0 Local x:Int=tilewidth/2 Local y:Int=tileheight/2 Local d:Int=size-1 Local linex:Stack<Int> = New Stack<Int> Local liney:Stack<Int> = New Stack<Int> Local drawme:Stack<Bool> = New Stack<Bool> Local ex:Bool=False Local topset:Bool=False Local rightset:Bool=False Local bottomset:Bool=False Local leftset:Bool=False If right=True Then ang=17 linex.Push(x+Cos(ang)*d) liney.Push(y+Sin(ang)*d) drawme.Push(True) While ang<(360-smooth2) ang+=smooth2 If bottom=True And bottomset=False If (ang>70 And ang<120) Then bottomset=True ang=90-20 linex.Push(x+Cos(ang)*d)' liney.Push(y+tileheight/2) drawme.Push(True) ang=90+21 linex.Push(x+Cos(ang)*d)' liney.Push(y+tileheight/2) drawme.Push(False) ang+=smooth2 End If End If If left=True And leftset=False If (ang>160-smooth2 And ang<200) Then leftset=True ang=180-20 linex.Push(x-tilewidth/2)' liney.Push(y+Sin(ang)*d) drawme.Push(True) ang=180+21 linex.Push(x-tilewidth/2)' liney.Push(y+Sin(ang)*d) drawme.Push(False) ang+=smooth2 End If End If If top=True And topset=False If (ang>250 And ang<290) Then topset=True ang=270-20 linex.Push(x+Cos(ang)*d)' liney.Push(y-tileheight/2) drawme.Push(True) ang=270+21 linex.Push(x+Cos(ang)*d)' liney.Push(y-tileheight/2) drawme.Push(False) ang+=smooth2 End If End If If right=True And rightset=False If (ang>340-smooth2) Then rightset=True ang=360-20 linex.Push(x+tilewidth/2)' liney.Push(y+Sin(ang)*d) drawme.Push(True) ang=21 linex.Push(x+tilewidth/2)' liney.Push(y+Sin(ang)*d) drawme.Push(False) ang+=smooth2 ang=360 ex=True End If End If If ex=False d = size-1 Local d2:Int=d+Rnd(-d/smooth1,d/smooth1) If d2>maxsize Then d2=maxsize linex.Push(x+Cos(ang)*d2) liney.Push(y+Sin(ang)*d2) drawme.Push(True) 'linex.Push(x+Cos(ang)*d)' 'liney.Push(y+Sin(ang)*d) End If Wend linex.Push(linex.Get(0)) liney.Push(liney.Get(0)) drawme.Push(True) For Local i=1 Until linex.Length Local x1:Int=linex.Get(i-1) Local y1:Int=liney.Get(i-1) Local x2:Int=linex.Get(i) Local y2:Int=liney.Get(i) If drawme.Get(i) = True Then 'If drawme.Get(i) = True line x1,y1,x2,y2 'End if End If Next ' floodimagemap(2) 'walkable tiles is no 2 End Method Method floodimagemap(fillval:Int) Local fx:Stack<Int> = New Stack<Int> Local fy:Stack<Int> = New Stack<Int> Local mx:Int[] = [0,1,0,-1] Local my:Int[] = [-1,0,1,0] fx.Push(tilewidth/2) fy.Push(tileheight/2) While fx.Length > 0 Local x1:Int=fx.Top Local y1:Int=fy.Top fx.Pop fy.Pop For Local i=0 Until 4 Local x2:Int=x1+mx[i] Local y2:Int=y1+my[i] If x2>=0 And x2<tilewidth And y2>=0 And y2<tileheight If imagemap[x2][y2] = 0 imagemap[x2][y2] = fillval fx.Insert(0,x2) fy.Insert(0,y2) End If End If Next Wend End Method Method finalizeimage(tx:Int,ty:Int) For Local i=0 Until tilewidth*tileheight imagepixels[i] = 0 Next Local cnt:Int=0 For Local y=0 Until tileheight For Local x=0 Until tilewidth If imagemap[x][y] = 1 imagepixels[cnt] = argb(255,255,255) End If If imagemap[x][y] = 2 imagepixels[cnt] = argb(55,55,55) End If cnt+=1 Next Next image[tx][ty].WritePixels(imagepixels, 0, 0, tilewidth, tileheight, 0) End Method Method makemaze() Local ax:Int[] = [0,1,0,-1] Local ay:Int[] = [-1,0,1,0] mazex.Push(Rnd(mapwidth/2)) mazey.Push(Rnd(mapheight/2)) While mazex.IsEmpty = False Local x:Int=mazex.Top Local y:Int=mazey.Top Local d:Int[] = New Int[4] Local deadend:Bool=True For Local i:=0 Until ax.Length Local x2:Int=x+ax[i] Local y2:Int=y+ay[i] If x2>=0 And x2<mapwidth/2 And y2>=0 And y2<mapheight/2 If map2[x2][y2] = 0 d[i] = 1 deadend=False End If End If Next If deadend = False Local eloop:Bool=False While eloop = False Local r:Int=Rnd(0,4) If d[r] = 1 Then eloop = True Local nx:Int=x+ax[r] Local ny:Int=y+ay[r] map3[x][y][r] = 1 mazex.Push(nx) mazey.Push(ny) map2[x][y] = 1 map2[nx][ny] = 1 End If Wend Else ' if nothing happened than backtrace mazex.Pop() mazey.Pop() End If Wend ' convert the map into a tilemap For Local y:=0 Until mapheight/2 For Local x:=0 Until mapwidth/2 Local x2:Int=x*2 Local y2:Int=y*2 If map2[x][y] = 1 Then map1[x2+1][y2+1] = 1 If map3[x][y][0] = 1 Then map1[x2+1][y2] = 1 If map3[x][y][1] = 1 Then map1[x2+2][y2+1] = 1 If map3[x][y][2] = 1 Then map1[x2+1][y2+2] = 1 If map3[x][y][3] = 1 Then map1[x2][y2+1] = 1 Next Next End Method Method line:Void(x1:Int,y1:Int,x2:Int,y2:Int) Local dx:Int, dy:Int, sx:Int, sy:Int, e:Int dx = Abs(x2 - x1) sx = -1 If x1 < x2 Then sx = 1 dy = Abs(y2 - y1) sy = -1 If y1 < y2 Then sy = 1 If dx < dy Then e = dx / 2 Else e = dy / 2 End If Local exitloop:Bool=False While exitloop = False If x1>=0 And x1<tilewidth And y1>=0 And y1<tileheight imagemap[x1][y1] = 1 End If If x1 = x2 If y1 = y2 exitloop = True End If End If If dx > dy Then x1 += sx ; e -= dy If e < 0 Then e += dx ; y1 += sy Else y1 += sy ; e -= dx If e < 0 Then e += dy ; x1 += sx Endif Wend End Method Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255) Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b End Function Method draw() SetColor 255,255,255 For Local y=0 Until mapheight For Local x=0 Until mapwidth If map1[x][y] = 1 DrawImage image[x][y],x*tilewidth,y*tileheight End If Next Next End Method End Class Global mymap:map Class MyGame Extends App Field cnt:Int=0 Method OnCreate() SetUpdateRate(60) myseed=1 mymap = New map End Method Method OnUpdate() cnt+=1 If MouseDown(MOUSE_LEFT) Or cnt>120 cnt=0 myseed = Millisecs() mymap = New map End If End Method Method OnRender() Cls 0,0,0 mymap.draw SetColor 255,255,255 DrawText "Press mouse to draw new map or wait",0,0 End Method End Class Function Main() New MyGame() End Function
Monkey-X - Flood Fill (seed fill) and Distance - code example
Import mojo Global screenwidth:Int=640 Global screenheight:Int=480 Global mapwidth:Int=20 Global mapheight:Int=20 Global tilewidth:Float=Float(screenwidth)/Float(mapwidth) Global tileheight:Float=Float(screenheight)/Float(mapheight) Class MyGame Extends App Field flood:Bool=False Field fillval:Int=1 Field delay:Int Field map:Int[][] Field mapd:Int[][] 'map containing the distance (distance map) Field floodx:Stack<Int> = New Stack<Int> 'flood Field floody:Stack<Int> = New Stack<Int> Field floodv:Stack<Int> = New Stack<Int> 'distance Field mx:Int[] = [0,1,0,-1] 'expand up/right/down/left Field my:Int[] = [-1,0,1,0] Method OnCreate() SetUpdateRate(60) map = New Int[mapwidth][] For Local i=0 Until mapwidth map[i] = New Int[mapheight] Next mapd = New Int[mapwidth][] For Local i=0 Until mapwidth mapd[i] = New Int[mapheight] Next For Local x=0 Until mapwidth/2 map[x][mapheight/2] = 6 Next End Method Method OnUpdate() Local tx:Int=MouseX()/tilewidth Local ty:Int=MouseY()/tileheight If MouseDown(MOUSE_LEFT) And flood=False And map[tx][ty] <> 6 Print "Flooding - "+Millisecs() floodx.Clear floody.Clear map[tx][ty] = fillval floodx.Push(tx) floody.Push(ty) floodv.Push(1) flood = True fillval+=1 If fillval > 5 Then fillval = 0 End If If flood = True If floodx.Length > 0 Local x1:Int=floodx.Top Local y1:Int=floody.Top Local v1:Int=floodv.Top floodx.Pop floody.Pop floodv.Pop For Local i=0 Until 4 Local x2:Int=x1+mx[i] Local y2:Int=y1+my[i] If x2>=0 And x2<mapwidth And y2>=0 And y2<mapheight If Not (map[x2][y2] = fillval) And Not (map[x2][y2] = 6) map[x2][y2] = fillval ' if you insert the new locations at the bottom ' of the list then you will get correct distance values (flooding) floodx.Insert(0,x2) floody.Insert(0,y2) floodv.Insert(0,v1+1) 'store the distance in the map mapd[x2][y2] = v1+1 End If End If Next Else flood=False Print "Flooding done" End If End If End Method Method OnRender() For Local y=0 Until mapheight For Local x=0 Until mapwidth Local col:Int=map[x][y] SetColor col*30,col*30,col*30 DrawRect x*tilewidth,y*tileheight,tilewidth+1,tileheight+1 Next Next For Local i=0 Until floodx.Length SetColor 255,255,0 DrawCircle floodx.Get(i)*tilewidth+tilewidth/2,floody.Get(i)*tileheight+tileheight/2,tilewidth/2 Next SetColor 255,255,255 For Local y=0 Until mapheight For Local x=0 Until mapwidth DrawText mapd[x][y],x*tilewidth+tilewidth-10,y*tileheight+tileheight-10 Next Next SetColor 255,255,255 DrawText "Press Left Mouse to flood map..",0,0 End Method End Class Function Main() New MyGame() End Function
Monkey-X - Cos and Sin fun 01 - code example
Import mojo Global smooth1:Int=10 Global smooth2:Int=20 Global myseed:Int=300 Global size:Int=50 Class MyGame Extends App Method OnCreate() SetUpdateRate(30) End Method Method OnUpdate() If KeyDown(KEY_RIGHT) Then smooth1+=1 If KeyDown(KEY_LEFT) Then smooth1-=1 If smooth1 <1 Then smooth1 = 2 If smooth1 >100 Then smooth1 = 100 If KeyDown(KEY_UP) Then smooth2+=1 If KeyDown(KEY_DOWN) Then smooth2-=1 If smooth2 <1 Then smooth2 = 2 If smooth2 >100 Then smooth2 = 100 If KeyDown(KEY_EQUALS) Then myseed+=1 If KeyDown(KEY_MINUS) Then myseed-=1 If KeyDown(KEY_9) Then size-=1 If KeyDown(KEY_0) Then size+=1 If size<5 Then size = 5 If size>200 Then size=200 End Method Method OnRender() Cls 0,0,0 SetColor 255,255,255 ' Local sx:Int Local sy:Int Local ex:Int Local ey:Int Local ang:Int=0 Local x:Int=320 Local y:Int=240 Local d:Int=size Local x1:Int=x+Cos(ang)*d Local y1:Int=y+Sin(ang)*d sx=x1 sy=y1 Seed = myseed While ang<(360-smooth2) ang+=smooth2 d = size Local x2:Int=x+Cos(ang)*d Local y2:Int=y+Sin(ang)*d Local d2:Int=d+Rnd(-d/smooth1,d/smooth1) Local x3:Int=x+Cos(ang-10)*d2 Local y3:Int=y+Sin(ang-10)*d2 DrawLine x1,y1,x3,y3 DrawLine x3,y3,x2,y2 ' DrawLine x1,y1,x3,y3 x1=x2 y1=y2 Wend DrawLine x1,y1,sx,sy ' DrawText "Press Cursor Up and Cursor Down - Cursor Left and Cursor Down",0,0 DrawText "Press + and -",0,20 DrawText "Press 9 and 0",0,40 End Method End Class Function Main() New MyGame() End Function
Monkey-X - Random Colored Textures - code example
Import mojo Global screenwidth:Int=640 Global screenheight:Int=480 Class texture Field mapimage:Image Field mappixels:Int[] Field map:Int[][] Field iw:Int=screenwidth Field ih:Int=screenheight Field sc:Int=1'Rnd(1,3) Method New() mappixels = New Int[iw*ih] mapimage = CreateImage(iw,ih) map = New Int[iw][] For Local i = 0 Until iw map[i] = New Int[ih] Next render1() End Method Method render1() 'noisey layer noisylayer() If Rnd()<.5 Then cellularlayer() ' lines down If Rnd()<.5 Local c:Int=Rnd(1,5) For Local i=0 Until c Local val:Int=Rnd(-60,60) If Rnd()<.5 Then val = Rnd(2,10) Local y:Int=0 Local v1:Int=Rnd(6,20) Local v2:Int=Rnd(2,v1) While y<ih For Local x=0 To iw For Local i=0 To v2 decmappixel(x,y+i,val) Next Next y+=v1 Wend Next End If ' line right If Rnd()<.5 Local c:Int=Rnd(1,5) For Local i=0 Until c Local val:Int=Rnd(-60,60) If Rnd()<.5 Then val = Rnd(2,10) 'For Local x=0 To iw Step 8 Local v1:Int=Rnd(3,iw/20) Local v2:Int=Rnd(2,v1) Local x=0 While x<iw For Local y=0 To ih For Local i=0 To v2 decmappixel(x+i,y,val) Next Next x+=v1 Wend Next End If 'lines right If Rnd()<.5 Local c:Int=Rnd(1,5) For Local i=0 Until c Local val:Int=Rnd(-60,60) If Rnd()<.5 Then val = Rnd(2,10) Local y:Int=0 Local v1:Int=Rnd(3,ih/10) Local v2:Int=Rnd(2,v1) 'For Local y=0 To ih Step 8 While y<ih For Local x=0 To iw For Local i=0 To v2 addmappixel(x,y+i,val) If Rnd()<.5 Then addmappixel(x+i,y,val) Next Next y+=v1 Wend Next End If ' lines down If Rnd()<.5 Local c:Int=Rnd(1,5) For Local i=0 Until c Local t:Int=Rnd(1,5) For Local i=0 Until t Local val:Int=Rnd(-60,60) If Rnd()<.5 Then val = Rnd(2,10) Local v1:Int=Rnd(3,iw/5) Local v2:Int=v1/2 Local x:Int=0 While x<iw For Local y=0 To ih For Local i=0 To v2 addmappixel(x+i,y,val) If Rnd()<.5 Then addmappixel(x+i,y,val) Next Next x+=v1 Wend Next Next End If 'diagonal lines If Rnd()<.5 Local c:Int=Rnd(1,5) For Local i=0 Until c Local val:Int=Rnd(-60,60) If Rnd()<.5 Then val = Rnd(2,10) Local x:Int=0 Local x1:Int=-iw Local v1:Int=Rnd(8,iw/5) Local v2:Int=Rnd(3,v1) While x1<iw For Local y=0 To ih For Local i=0 To v2 addmappixel(x1+(x+i),y,val) 'If Rnd()<.5 Then addmappixel(x1+(x+i),y) Next x+=1 Next x=0 x1+=v1 Wend Next End If 'blocks If Rnd()<.5 Local x1:Int=0 Local y1:Int=0 Local sw:Int=Rnd(15,iw/10) Local sh:Int=Rnd(15,ih/10) Local sx:Int=Rnd(sw,sw*2) Local sy:Int=Rnd(sh,sh*2) Local t:Int If Rnd()<.5 Then t=Rnd(-80,-30) Else t=Rnd(30,80) End if While y1<ih addr2(x1,y1,sw,sh,t) x1+=sx If x1>iw x1=0 y1+=sy End If Wend End If 'triangle up If Rnd()<.2 Then addtriangleup 'triangle down If Rnd()<.2 Then addtriangledown 'triangle left If Rnd()<.2 Then addtriangleleft 'triangle Right If Rnd()<.2 Then addtriangleright If Rnd()<.2 Then addoval() If Rnd()<.5 Then addheightmap tintmap mapimage.WritePixels(mappixels, 0, 0, iw, ih, 0) End Method Method update() End Method Method cellularlayer() 'cellular layer For Local y=0 Until ih For Local x=0 Until iw If Rnd()<.5 Then map[x][y] = 1 Else map[x][y] = 0 End If Next Next For Local i=0 Until 2 ' loop through the map For Local y=0 Until ih For Local x=0 Until iw 'count the neigbouring 1's Local cnt = 0 For Local y1=-1 To 1 For Local x1=-1 To 1 Local x2=x+x1 Local y2=y+y1 If x2>=0 And y2>=0 And x2<iw And y2<ih If map[x][y] = 1 Then cnt+=1 End If Next Next ' if 3 walls and map is a wall then map x,y is not a wall anymore If cnt < 4 map[x][y] = 0 End If ' if more then 4 walls then map x,y is wall If cnt >= 5 Then map[x][y] = 1 Next Next Next For Local x=0 Until iw For Local y=0 Until ih If map[x][y] = 1 Then addr2(x,y,1,1,100) Else addr2(x,y,1,1,40) End If Next Next End Method Method noisylayer() Local var1:Int=Rnd(3,130) Local var2:Int=Rnd(20,200) Local depth:Int=Rnd(1,25) For Local i=0 To iw*ih*depth Local x1:Int=Rnd(iw) Local y1:Int=Rnd(ih) Local cnt:Int=0 For Local y2=-5 To 5 For Local x2=-5 To 5 Local x3:Int=x1+x2 Local y3:Int=y1+y2 If x3>=0 And x3<iw And y3>=0 And y3<ih If getred(getmappixel(x3,y3)) > var2 Then 'addmappixel(x3,y3) cnt+=1 End If End If Next Next If cnt<var1 addmappixel(x1,y1,Rnd(2,20)) End If cnt=0 Next End Method Method addtriangleup() Local val:Int=Rnd(-120,120) If Rnd()<.5 Then val = Rnd(2,10) Local wa:Float=0 Local wb:Float=iw Local s:Float=Float(ih)/Float(iw) For Local y=0 To ih For Local x=wa To wb addmappixel(x,y,val) Next wa+=s wb-=s Next End Method Method addtriangledown() Local val:Int=Rnd(-120,120) If Rnd()<.5 Then val = Rnd(2,10) Local wa:Float=0 Local wb:Float=iw Local s:Float=Float(ih)/Float(iw) For Local y=ih To 0 Step -1 For Local x=wa To wb addmappixel(x,y,val) Next wa+=s wb-=s Next End Method Method addtriangleleft() Local val:Int=Rnd(-120,120) If Rnd()<.5 Then val = Rnd(2,10) Local ha:Float=0 Local hb:Float=ih Local s:Float=((Float(iw)/Float(ih))/3.5) For Local x=iw To 0 Step -1 For Local y=ha To hb addmappixel(x,y,val) Next ha+=s hb-=s Next End Method Method addoval() 'oval Local val:Int=Rnd(-100,100) If Rnd()<.5 Then val=Rnd(-15,15) addo(iw/2,ih/2,ih/2,val) End Method Method addtriangleright() Local val:Int=Rnd(-120,120) If Rnd()<.5 Then val = Rnd(2,10) Local ha:Float=0 Local hb:Float=ih Local s:Float=((Float(iw)/Float(ih))/3.5) For Local x=0 To iw For Local y=ha To hb addmappixel(x,y,val) Next ha+=s hb-=s Next End Method Method addheightmap() 'heightmap Local mw:Int=Rnd(5,iw/10) Local mh:Int=Rnd(5,ih/10) Local cnt:Float=Rnd(1,4) For Local i:Int=0 To iw*ih*cnt Local x:Int=Rnd(-10,iw) Local y:Int=Rnd(-10,ih) Local w:Int=Rnd(3,mw) Local h:Int=Rnd(3,mh) Local val:Int If Rnd()<.5 Then val=-1 Else val=1 addr(x,y,w,h,val) Next End Method Method tintmap() 'tint random Local r1:Int=Rnd(0,125) Local g1:Int=Rnd(0,125) Local b1:Int=Rnd(0,125) For Local y=0 Until ih For Local x=0 Until iw Local r2:Int=getred(getmappixel(x,y)) Local g2:Int=r2 Local b2:Int=r2 setmappixel(x,y,argb(r1+r2/2,g1+g2/2,b1+b2/2)) Next Next End Method Method decmappixel(x:Int,y:Int,val:Int=10) Local pos:Int=(y*iw)+x If pos<0 Or pos>=iw*ih Then Return Local r:Int=getred(mappixels[pos])-val Local g:Int=getgreen(mappixels[pos])-val Local b:Int=getblue(mappixels[pos])-val Local nr:Int=Clamp(r,0,255) Local ng:Int=Clamp(g,0,255) Local nb:Int=Clamp(b,0,255) mappixels[pos] = argb(nr,ng,nb) End Method Method addmappixel(x:Int,y:Int,val:Int=10) Local pos:Int=(y*iw)+x If pos<0 Or pos >=iw*ih Then Return Local r:Int=getred(mappixels[pos])+val Local g:Int=getgreen(mappixels[pos])+val Local b:Int=getblue(mappixels[pos])+val Local nr:Int=Clamp(r,0,255) Local ng:Int=Clamp(g,0,255) Local nb:Int=Clamp(b,0,255) mappixels[pos] = argb(nr,ng,nb) End Method Method setmappixel:Int(x:Int,y:Int,col) Local pos:Int=(y*iw)+x If pos<0 Or pos>=iw*ih Then Return 0 mappixels[pos] = col End Method Method getmappixel:Int(x:Int,y:Int) Local pos:Int=(y*iw)+x If pos<0 Or pos>=iw*ih Then Return 0 Return mappixels[pos] End Method Method getpixel2:Int(x:Int,y:Int) Local pos:Int=(y*iw)+x If pos<0 Or pos>=iw*ih Then Return 0 Return mappixels[pos] End Method Method draw() DrawImage mapimage,0,0,0,sc,sc SetColor 0,0,0 DrawRect iw-200,ih-200,200,200 SetColor 255,255,255 DrawImage mapimage,iw-200+1,ih-200+1,0,198.0/Float(iw),198.0/Float(ih) SetColor 0,0,0 DrawRect iw-64,ih-64,64,64 SetColor 255,255,255 DrawImage mapimage,iw-64+1,ih-64+1,0,62.0/Float(iw),62.0/Float(ih) End Method Method addr2(x1,y1,w1,h1,val:Int) For Local y2=y1 Until y1+h1 For Local x2=x1 Until x1+w1 Local pc = y2*iw+x2 If pc >= 0 And pc < iw*ih Local r1:Int=getred(mappixels[pc])+val Local g1:Int=getgreen(mappixels[pc])+val Local b1:Int=getblue(mappixels[pc])+val r1 = Clamp(r1,0,255) g1 = Clamp(g1,0,255) b1 = Clamp(b1,0,255) mappixels[pc] = argb(r1,g1,b1) End If Next Next End Method Method addr(x1,y1,w1,h1,val:Int) For Local y2=y1 Until y1+h1 For Local x2=x1 Until x1+w1 Local pc = y2*iw+x2 If pc >= 0 And pc < iw*ih Local r1:Int=getred(mappixels[pc])+val Local g1:Int=getgreen(mappixels[pc])+val Local b1:Int=getblue(mappixels[pc])+val r1 = Clamp(r1,0,255) g1 = Clamp(g1,0,255) b1 = Clamp(b1,0,255) If r1>20 Then mappixels[pc] = argb(r1,g1,b1) End If Next Next End Method Method drawr(x1,y1,w1,h1,col) For Local y2=y1 Until y1+h1 For Local x2=x1 Until x1+w1 Local pc = y2*iw+x2 If pc >= 0 And pc < iw*ih mappixels[pc] = col End If Next Next End Method Method addo(x1,y1,radius:Float,val:Int=10) For Local y2=-radius To radius For Local x2=-radius To radius If (y2*y2+x2*x2) <= radius*radius+radius*0.8 Local x3 = x2+x1 Local y3 = y2+y1 Local pc = y3*iw+x3 If pc>=0 And pc < iw*ih Local r1:Int=getred(mappixels[pc]) Local g1:Int=getgreen(mappixels[pc]) Local b1:Int=getblue(mappixels[pc]) Local r2:Int=r1+val Local g2:Int=g1+val Local b2:Int=b1+val r2 = Clamp(r2,0,255) g2 = Clamp(g2,0,255) b2 = Clamp(b2,0,255) mappixels[pc] = argb(r2,g2,b2) End If End If Next Next End Method Method drawo(x1,y1,radius:Float,col:Int) For Local y2=-radius To radius For Local x2=-radius To radius If (y2*y2+x2*x2) <= radius*radius+radius*0.8 Local x3 = x2+x1 Local y3 = y2+y1 Local pc = y3*iw+x3 If pc>=0 And pc < iw*ih mappixels[pc] = col End If End If Next Next End Method Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255) Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b End Function Function getred:Int(rgba:Int) Return((rgba Shr 16) & $FF) End Function Function getgreen:Int(rgba:Int) Return((rgba Shr 8) & $FF) End Function Function getblue:Int(rgba:Int) Return(rgba & $FF) End Function Function getalpha:Int(rgba:Int) Return ((rgba Shr 24) & $FF) End Function End Class Global mytexture:texture Class MyGame Extends App Field cnt:Int=0 Method OnCreate() SetUpdateRate(1) Seed = GetDate[5] mytexture = New texture() End Method Method OnUpdate() cnt+=1 If cnt>6 Then mytexture = New texture() cnt=0 End If End Method Method OnRender() Cls 50,50,50 mytexture.draw SetColor 255,255,255 End Method End Class Function Main() New MyGame() End Function
Monday, December 19, 2016
Monkey-X - Beginners - image Width and Height - code example
Import mojo Class MyGame Extends App ' Field image:Image ' Method OnCreate:Int() SetUpdateRate(60) ' create an image image = CreateImage(64, 64) ' create an array for that image Local pixels:Int[image.Width * image.Height] ' draw the color red in the pixels array For Local i:Int = 0 Until image.Width * image.Height pixels[i] = argb(200,0,0) Next ' copy the array to the image image.WritePixels(pixels, 0, 0, image.Width, image.Height, 0) End Method Method OnRender:Int() Cls 0,0,0 DrawImage(image, 50,50) SetColor 255,255,255 DrawText "Image Width is : "+image.Width+" Image Height is : "+image.Height,0,0 End Method End Class Function Main:Int() New MyGame() End Function 'helper function Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255) Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b End Function
Monkey-X - Beginners - Block Commenting #Rem - code example
#Rem Anything typed here will not cause a error. #End Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) ' You can disable a part of the code between #rem and #end #Rem DebugLog "This will not" DebugLog "be executed." #End End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - String - FromChar - code example
Import mojo
Class MyGame Extends App
Method OnCreate()
SetUpdateRate(1)
' character code 97 is a.
' character code to character
DebugLog String.FromChar(97)
End Method
Method OnUpdate()
End Method
Method OnRender()
End Method
End Class
Function Main()
New MyGame()
End Function
Monkey-X - Beginners - String - ToChars - code example
Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) ' create a array with array with the character codes of each ' character in a string. Local a:Int[] Local b:String="abcdefghijklmnopqrstuvwxyz" a = b.ToChars() Local deb:String For Local i=0 Until a.Length deb+=b[i..i+1]+"="+a[i]+"," Next DebugLog deb End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - String - Split - code example
Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) Local a:String[] Local b:String="This is a test man" a = b.Split(" ") DebugLog "variable b is : "+b DebugLog "We split variable b at the ' ' character" For Local i=0 Until a.Length DebugLog a[i] Next a = New String[1] b="0,1,2,3,4,5" a = b.Split(",") DebugLog "variable b is : "+b DebugLog "We split the variable b at the ',' character" For Local i=0 Until a.Length DebugLog a[i] next End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - String - Replace - code example
Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) Local a:String="This is certainly not a test." DebugLog "Original string before replace 'certainly' with 'maybe' :"+a DebugLog "New string : "+a.Replace("certainly","maybe") End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - String - StartsWith and EndsWith - code example
Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) Local a:String="myfile.monkey" Local b:String="c:\myinstallation\" If a.EndsWith(".monkey") Then DebugLog "variable a ends with .monkey" If b.EndsWith("\") Then DebugLog "variable b ends with \" If b.StartsWith("c:") Then DebugLog "variable b starts with c:" End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - String - ToUpper and ToLower - code example
Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) Local a:String="test." Local b:String="TEST." DebugLog a.ToUpper DebugLog b.ToLower DebugLog "This is A Test.".ToUpper End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - Strings - Contains - code example
Import mojo Class MyGame Extends App Method OnCreate() SetUpdateRate(1) Local a:String="test" Local b:String="this is a test." If b.Contains(a) Then DebugLog "found "+a+" in string." If Not b.Contains("battle") Then DebugLog "did not find battle in string" End Method Method OnUpdate() End Method Method OnRender() End Method End Class Function Main() New MyGame() End Function
Monkey-X - Beginners - Error - code example
' Error command - Stop the program and give a error message.
Import mojo
Class MyGame Extends App
Field cnt:Int=0
Method OnCreate()
SetUpdateRate(10)
End Method
Method OnUpdate()
cnt+=1
If cnt>10 Then Error "cnt is bigger then 10"
End Method
Method OnRender()
Cls 0,0,0
SetColor 255,255,255
End Method
End Class
Function Main()
New MyGame()
End Function
Monkey-X - Beginners - DebugLog and DebugStop - code example
Import mojo
Class MyGame Extends App
Field cnt:Int=0
Method OnCreate()
SetUpdateRate(2)
End Method
Method OnUpdate()
cnt+=1
DebugLog "Contents of variable cnt :"+cnt
If cnt>10 Then DebugStop
End Method
Method OnRender()
Cls 0,0,0
SetColor 255,255,255
End Method
End Class
Function Main()
New MyGame()
End Function
Monkey-X - Beginners - Tinting a color - code example
Import mojo Class MyGame Extends App Field r1:Int=255 Field g1:Int=0 Field b1:Int=0 Field r2:Int=0 Field g2:Int=255 Field b2:Int=0 Field r3:Int,g3:Int,b3:Int Method OnCreate() SetUpdateRate(1) ' tint rgb1 with 2 to create 3 r3=r1/2+r2/2 g3=g1/2+g2/2 b3=b1/2+b2/2 End Method Method OnUpdate() End Method Method OnRender() Cls 0,0,0 ' what is tinting? ' If you wish to make a color look more like another color ' then you could tint it. Say you have a greyscale image ' and want to turn it into red. You could tint it red. ' you take each color value and halve it. The color where you want to ' tint it with you halve to. Then you add them together to form the new color. SetColor r1,g1,b1 DrawText "Color 1",0,0 DrawRect 0,20,50,480 SetColor r2,g2,b2 DrawText "Color we tint with",200,0 DrawRect 200,20,50,480 SetColor r3,g3,b3 DrawText "Resulting 'tinted' color",400,0 DrawRect 400,20,50,480 End Method End Class Function Main() New MyGame() End Function
Monkey-X - Getting started - Class in List - updating and drawing - code example
Import mojo ' what is the size of the screen. Global screenwidth:Int=640 Global screenheight:Int=480 Class alien ' initialisation of variables for this class. Field ax:Int Field ay:Int Field deleteme:Bool=False Method New(x:Int,y:Int) ' assign the location of the alien ax = x ay = y End Method Method update()'update method ' copy the mouse x and y into local variables Local x:Int=MouseX() Local y:Int=MouseY() If MouseDown(MOUSE_LEFT) 'if mouse pressed If rectsoverlap(x,y,1,1,ax,ay,16,16) 'if ontop of alien deleteme = True 'flag for deletion End If End If End Method Method draw() 'draw method SetColor 255,255,255 DrawRect ax,ay,16,16 End Method ' little helper 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 End Class ' Start a list to store classes into Global myalien:List<alien> = New List<alien> Class MyGame Extends App Method OnCreate() ' frames per second (refresh rate) SetUpdateRate(60) For Local i=0 Until 50 myalien.AddLast(New alien(Rnd(screenwidth),Rnd(screenheight))) Next End Method Method OnUpdate() 'update the alien For Local i:=Eachin myalien i.update Next 'delete from list if set for deletion For Local i:=Eachin myalien If i.deleteme = True Then myalien.Remove(i) Next End Method Method OnRender() Cls 0,0,0 'draw the aliens For Local i:=Eachin myalien i.draw Next SetColor 255,255,255 DrawText "Press on a alien to make him disappear.",0,0 End Method End Class Function Main() New MyGame() End Function
Monkey-X - Getting started - Class setup - example
'One way of using monkey.
Import mojo Global screenwidth:Int=640 Global screeneight:Int=480 Class game ' initialisation of variables for this class. Field hitpoint:Int=100 Field gold:Int=234 Field shieldequiped:Bool=False Field swordequiped:Bool=False Method New() 'here the game class is set up End Method Method update() 'here you place the game logic End Method Method draw() ' here you place the drawing commands End Method End Class ' make mygame a global variable Global mygame:game Class MyGame Extends App Method OnCreate() ' frames per second (refresh rate) SetUpdateRate(60) mygame = New game() End Method Method OnUpdate() ' execute the game update method mygame.update ' after initialisatoin you can read/write to the variables of the class If KeyDown(KEY_E) Then mygame.shieldequiped = True End Method Method OnRender() Cls 0,0,0 ' execute the game draw method mygame.draw ' SetColor 255,255,255 ' use the mygame class to display information DrawText mygame.gold+" gold in pocket",100,100 If mygame.shieldequiped = False Then DrawText "press 'e' to equip shield",0,0 If mygame.shieldequiped = True Then DrawText "Shield is equiped",0,0 End Method End Class Function Main() New MyGame() End Function
Sunday, December 18, 2016
Monkey-X - Midpoint Division Algorithm - code example
Import mojo
Global screenwidth:Int=640
Global screenheight:Int=480
Class midpoint
Field mw:Int,mh:Int
Field tw:Float,th:Float
Field map:Int[][]
Method New(w:Int,h:Int)
mw = w
mh = h
tw = Float(screenwidth)/Float(mw)
th = Float(screenheight)/Float(mh)
map = New Int[w][]
For Local i = 0 Until mw
map[i] = New Int[mh]
Next
map[0][0] = 128
map[mw-1][0] = 128
map[mw-1][mh-1] = 128
map[0][mh-1] = 128
midpoint(0,0,mw-1,mh-1)
End Method
Method midpoint(x1:Int,y1:Int,x2:Int,y2:Int)
If(x2-x1<2 And y2-y1<2) Return False
Local dist:Int=(x2-x1+y2-y1)
Local hdist:Int=dist / 2
Local midx:Int=(x1+x2) / 2
Local midy:Int=(y1+y2) / 2
Local c1:Int=map[x1][y1]
Local c2:Int=map[x2][y1]
Local c3:Int=map[x2][y2]
Local c4:Int=map[x1][y2]
If(map[midx][y1]=0) Then map[midx][y1]=((c1+c2+Rnd(dist)-hdist) / 2)
If(map[midx][y2]=0) Then map[midx][y2]=((c4+c3+Rnd(dist)-hdist) / 2)
If(map[x1][midy]=0) Then map[x1][midy]=((c1+c4+Rnd(dist)-hdist) / 2)
If(map[x2][midy]=0) Then map[x2][midy]=((c2+c3+Rnd(dist)-hdist) / 2)
map[midx][midy] = ((c1+c2+c3+c4+Rnd(dist)-hdist) / 4)
midpoint(x1,y1,midx,midy)
midpoint(midx,y1,x2,midy)
midpoint(x1,midy,midx,y2)
midpoint(midx,midy,x2,y2)
End Method
Method draw()
For Local y:Int=0 Until mh
For Local x:Int=0 Until mw
Local c:Int=map[x][y]
SetColor c,c,c
DrawRect x*tw,y*th,tw+1,th+1
Next
Next
End Method
End Class
Global mymidpoint:midpoint
Class MyGame Extends App
field cnt:Int=0
Method OnCreate()
SetUpdateRate(1)
mymidpoint = New midpoint(256,256)
End Method
Method OnUpdate()
cnt+=1
If cnt>2 Then
mymidpoint = New midpoint(256,256)
cnt=0
End If
End Method
Method OnRender()
'Cls 0,0,0
mymidpoint.draw
'SetColor 255,255,255
End Method
End Class
Function Main()
New MyGame()
End Function
Monkey-X - 2d topdown shooter - Between Space - code example
' hold the left mouse button on the screen to draw particle flames on the screen.
'#Flash
Import mojo Global screenwidth:Int=640 Global screenheight:Int=480 Global tilewidth:Int=32 Global tileheight:Int=32 Class trail Field x1:Float,y1:Float Field x2:Float,y2:Float Field timeout:Int Field maxtimeout:Float=70 Field alpha:Float=1 Field deleteme:Bool=False Method New(x1:Float,y1:Float,x2:Float,y2:Float) Self.x1 = x1 Self.y1 = y1 Self.x2 = x2 Self.y2 = y2 timeout = maxtimeout End Method Method update() timeout -= 1 If timeout<0 deleteme = True End If ' update the trail with position of ship x1 -= Cos(myplayer.ang)*myplayer.thrust y1 -= Sin(myplayer.ang)*myplayer.thrust x2 -= Cos(myplayer.ang)*myplayer.thrust y2 -= Sin(myplayer.ang)*myplayer.thrust End Method Method draw() alpha = (1.0/maxtimeout)*timeout SetAlpha alpha SetColor 255,255,255 DrawLine x1,y1,x2,y2 SetAlpha 1 End Method End Class Class lineeffect Field x1:Int=screenwidth/2 Field y1:Int=screenheight/2 Field x2:Int=screenwidth/2 Field y2:Int=screenheight/2 Field deleteme:Bool=False Method New() End Method Method update() x1=x1-15 y1=y1-15 x2=x2+15 y2=y2+15 If x1<-20 Then deleteme=True End Method Method draw() SetAlpha .3 SetColor 255,255,255 DrawRect x1,y1,x2-x1,10 DrawRect x1,y1,10,y2-y1 DrawRect x1,y2,x2-x1,10 DrawRect x2,y1,10,y2-y1 SetAlpha .2 SetColor 255,255,255 If x1>300 Then DrawRect 0,0,screenwidth,screenheight SetAlpha 1 End Method End Class Class pickups Field px:Float,py:Float Field pw:Int=tilewidth/1.5,ph:Int=tileheight/1.5 Field type:String Field ang:Int Field deleteme:Bool=False Field timeout:Int Field timeoutmax:Int=700+Rnd(700) Method New(x:Float,y:Float) px = x py = y type="points" If Rnd()<.7 Then Select Int(Rnd(0,5)) Case 0 type = "points" Case 1 type = "circle" Case 2 type = "backwardsfire" Case 3 type = "tripplefire" Case 4 type = "hull" End Select End If End Method Method update() ' remove is in to long timeout+=1 If timeout > timeoutmax deleteme = True End If ' update the tilemap with the player movement px -= Cos(myplayer.ang)*myplayer.thrust py -= Sin(myplayer.ang)*myplayer.thrust ang+=3 If ang>359 Then ang=0 ' collide with player (pickup) If rectsoverlap(px,py,pw,ph,screenwidth/2,screenheight/2,tilewidth,tileheight) deleteme = True mylineeffect.AddLast(New lineeffect()) If type="points" Then myplayer.score+=15 If type="circle" For Local i=0 To 360 Step 20 mybullet.AddLast(New bullet("player","doubledamage",px,py,i,3.3)) Next End If If type="backwardsfire" myplayer.backwardsfire=True myplayer.backwardsfiretime=1000 End If If type="tripplefire" myplayer.tripplefire=True myplayer.tripplefiretime=1000 End If If type="hull" myplayer.hitpoint+=3 If myplayer.hitpoint > myplayer.maxhitpoint Then myplayer.hitpoint = myplayer.maxhitpoint End If Print "Pickup" End If ' End Method Method draw() Select type Case "points" PushMatrix() Translate px,py Rotate(-ang) Translate -px,-py SetColor 20,20,20 DrawRect px-pw/2,py-ph/2,pw,ph SetColor 255,255,0 DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2 SetColor 255,255,255 Scale(2,2) DrawText "P",px/2,py/2,.5,.5 Scale(1,1) PopMatrix() Case "circle" ' a circle of lasers PushMatrix() Translate px,py Rotate(-ang) Translate -px,-py SetColor 20,20,20 DrawRect px-pw/2,py-ph/2,pw,ph SetColor 0,0,255 DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2 SetColor 255,255,255 Scale(2,2) DrawText "C",px/2,py/2,.5,.5 Scale(1,1) PopMatrix() Case "backwardsfire" 'can fire backwards PushMatrix() Translate px,py Rotate(-ang) Translate -px,-py SetColor 20,20,20 DrawRect px-pw/2,py-ph/2,pw,ph SetColor 0,255,255 DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2 SetColor 255,255,255 Scale(2,2) DrawText "B",px/2,py/2,.5,.5 Scale(1,1) PopMatrix() Case "tripplefire" 'can fire backwards PushMatrix() Translate px,py Rotate(-ang) Translate -px,-py SetColor 20,20,20 DrawRect px-pw/2,py-ph/2,pw,ph SetColor 250,155,55 DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2 SetColor 255,255,255 Scale(2,2) DrawText "T",px/2,py/2,.5,.5 Scale(1,1) PopMatrix() Case "hull" 'can fire backwards PushMatrix() Translate px,py Rotate(-ang) Translate -px,-py SetColor 20,20,20 DrawRect px-pw/2,py-ph/2,pw,ph SetColor 250,35,10 DrawCircle px+1,py,pw/1.6 SetColor 250,35,10 DrawRect (px-pw/2+1),(py-ph/2)+1,pw-2,ph-2 SetColor 255,255,255 Scale(2,2) DrawText "H",px/2,py/2,.5,.5 Scale(1,1) PopMatrix() End Select End Method 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 End Class Class enemy Field type:String Field ex:Float,ey:Float,er:Int Field thrust:Float,ang:Int Field deleteme:Bool=False Field targetx:Int,targety:Int Field targetset:Bool=False Field state:String Field ishome:Bool=False Field roaming:Bool=False Field homex:Int,homey:Int Field firedelay:Int=20,firetime:Int Field hitpoint:Int=3 Field maxhitpoint = 3 Field gothit:Bool=False Field gothittime:Int=20 Field bombarding:Int=False Field maxthrust:Float=3.3 Field dropfreq:Float=0.4 'lower is less Field ffhitpoint:Int=2 'force field hitpoints Method New(x:Int,y:Int) If Rnd()<.5 Then type="forcefield" ex=x ey=y er=16 hitpoint=maxhitpoint homex = x homey = y thrust=maxthrust state="roam" End Method Method update() 'collision with player bullets If gothit = True Then gothittime-=1 For Local i:=Eachin mybullet If i.owner = "player" If rectsoverlap(i.bx,i.by,i.bradius,i.bradius, ex-3,ey-3,er+3,er+3) If type="forcefield" If i.type = "doubledamage" Then ffhitpoint-=2 Else ffhitpoint-=1 If ffhitpoint<=0 Then type="" Else If i.type = "doubledamage" Then hitpoint-=2 Else hitpoint-=1 gothit=True gothittime=20 If hitpoint<1 Then Print "Exploded" If Rnd()<dropfreq Then mypickup.AddLast(New pickups(ex+Cos(ang)*thrust,ey+Sin(ang)*thrust)) myp.AddLast(New particleeffect(ex+Cos(ang)*thrust,ey+Sin(ang)*thrust)) deleteme = True state="" myplayer.score+=10 End If i.deleteme = True End If End If End If Next ' states of the enemy Select state Case "attack" If Rnd() < .0005 state = "roam" Print "done attacking" ishome=False roaming=False End If If Rnd()<.1 Then fireatplayer() settarget If Rnd() < .1 bombard() movein turn Case "roam" If Rnd()<.002 state="attack" Print "going to attack" End If roam movein turn End Select End Method Method fireatplayer() Local d:Int=distance(ex,ey,screenwidth/2,screenheight/2) firetime+=1 If d<250 And firetime > firedelay firetime = 0 Local a:Int=getangle(ex,ey,screenwidth/2,screenheight/2) If myplayer.thrust > .5 Then a=ang mybullet.AddLast(New bullet("enemy","normal",ex,ey,a,4)) If Rnd()<.1 Then ' sometimes after shooting head back state = "roam" Print "done attacking" thrust = maxthrust ishome=False roaming=False End If End If End Method Method bombard() Local d:Int = distance(ex,ey,screenwidth/2,screenheight/2) If bombarding = True And d >220 Then thrust = maxthrust bombarding = False state = "roam" ishome=False roaming=False End If If myplayer.thrust = 0 And d < 200 And d> 100 And bombarding = False thrust = 0 fireatplayer() bombarding = True End If If bombarding = True Local ax:Int=screenwidth/2 Local ay:Int=screenheight/2 If Rnd()<.8 And linerectoverlap(ax,ay,ax+Cos(myplayer.ang)*350,ay+Sin(myplayer.ang)*350,ex,ey,er,er) Print "scared off" thrust = maxthrust bombarding = False state = "roam" ishome=False roaming=False End If fireatplayer() End If End Method Method roam() Local dtohome = distance(ex,ey,homex,homey) Local dtotarget = distance(ex,ey,targetx,targety) If dtohome > 300 And ishome = False And roaming=False ishome=True targetx = homex targety = homey End If If dtohome < 50 And ishome = True And roaming = False roaming = True targetx = homex+Rnd(-100,100) targety = homey+Rnd(-100,100) End If If dtotarget < 50 And roaming = True targetx = homex+Rnd(-100,100) targety = homey+Rnd(-100,100) End If If dtotarget > 300 And roaming=True roaming=False ishome=False End If End Method Method turn() 'turn Local pangle:Int = getangle(ex,ey,targetx,targety) If leftangle(ang,pangle) = True Then ang+=3 Else ang-=3 If ang>180 Then ang=-180 If ang<-180 Then ang=180 End Method Method movein() 'move in ex -= Cos(myplayer.ang)*myplayer.thrust ey -= Sin(myplayer.ang)*myplayer.thrust ex += Cos(ang)*thrust ey += Sin(ang)*thrust End Method Method settarget() 'set target Local d:Int=distance(ex,ey,screenwidth/2,screenheight/2) If d > 550 targetx = screenwidth/2 targety = screenheight/2 targetset = False Else If targetset = False targetx = (screenwidth/2)+Rnd(-90,90) targety = (screenheight/2)+Rnd(-90,90) targetset = True End If End If If d<80 Then targetx = (screenwidth/2)+Rnd(-190,190) targety = (screenheight/2)+Rnd(-190,190) End If End Method Method draw() SetColor 255,0,0 If gothit = True If gothittime<0 Then gothit=False SetColor 255,255,255 End If DrawCircle ex,ey,er ' draw the powerbar Local x:Float=ex-er Local y:Float=ey-er Local w1:Float=(er*2)-2 Local w2:Float=(er*2) Local s:Float = w1/maxhitpoint w1 = s*hitpoint SetColor 0,0,0 DrawRect x,y,w2,5 If hitpoint < 2 SetColor 255,0,0 Else SetColor 255,255,0 End If DrawRect x+2,y+2,w1,3 ' draw forcefield If type="forcefield" SetColor 55,155,255 SetAlpha .5 DrawCircle ex-2,ey-2,er+12 SetAlpha 1 End If End Method 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 linerectoverlap:Bool(x1:Int,y1:Int,x2:Int,y2:Int,x3:Int,y3:Int,w:Int,h:Int) Local a:Int=getangle(x1,y1,x2,y2) Local ax:Float=x1 Local ay:Float=y1 ' Print x2 ' Print x1+","+ax+Cos(a)*300+","+x2 Local ex:Bool=False While ex=False ax+=Cos(a)*1 ay+=Sin(a)*1 ' Print ax+","+ay+","+x2+","+y2 If rectsoverlap(ax-8,ay-8,16,16,x2-8,y2-8,16,16) = True Then ex=True If rectsoverlap(x3,y3,w,h,ax-6,ay-6,12,12) Then Return True End If Wend Return False End Function Function getangle:Int(x1:Int,y1:Int,x2:Int,y2:Int) Local dx = x2 - x1 Local dy = y2 - y1 Return ATan2(dy,dx)+360 Mod 360 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 End Class Class bullet Field deleteme:Bool=False Field bx:Float,by:Float,bradius:Float Field ang:Int,thrust:Float Field time:Int,timeout:Int=100 Field alpha:Float Field owner:String Field type:String Method New(owner:String,type:String,x:Int,y:Int,angle:Int,thrust:Float) Self.type = type Self.owner = owner Self.ang = angle Self.bx = x Self.by = y Self.thrust = thrust bradius = 6 thrust = 4 End Method Method update() time+=1 bx += Cos(ang)*thrust by += Sin(ang)*thrust If time > timeout Then deleteme = True alpha = 1-(.5/Float(timeout))*time ' update the tilemap with the player movement bx -= Cos(myplayer.ang)*myplayer.thrust by -= Sin(myplayer.ang)*myplayer.thrust End Method Method draw() SetAlpha alpha SetColor 0,0,0 DrawCircle bx-1,by,bradius+1 Select owner Case "player" SetColor 255,0,255 Case "enemy" SetColor 255,255,0 End Select DrawCircle bx,by,bradius Select owner Case "player" SetColor 255,190,255 Case "enemy" SetColor 255,255,190 End Select DrawCircle (bx-bradius)+4,(by-bradius)+4,bradius/2 SetAlpha 1 End Method End Class Class player Field score:Int Field ang:Float Field thrust:Float Field turninc:Float Field turnincmax:Float=3 Field turnincmin:Float=-3 Field maxthrust:Float = 4 Field firedelay:Int=5 Field firetime:Int Field backwardsfire:Bool=False Field backwardsfiretime:Int Field tripplefire:Bool=False Field tripplefiretime:Int Field ship:Float[]=[ -5.0,-5.0, 5.0,0.0, -5.0,5.0] Field trailtime:Int=10 Field hitpoint = 10 Field maxhitpoint=10 Method New() End Method Method update() 'shoot firetime+=1 If KeyDown(KEY_SPACE) And firetime > firedelay firetime = 0 mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,ang,6)) 'should we fire backwards to If backwardsfire = True Local a:Int=ang For Local i=0 Until 180 a+=1 If a>359 Then a=0 Next mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,a,6)) End If If tripplefire = True Local a:Int=ang For Local i=0 Until 25 a+=1 If a>359 Then a=0 Next mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,a,6)) a=ang For Local i=0 Until 25 a-=1 If a<0 Then a=360 Next mybullet.AddFirst(New bullet("player","Normal",screenwidth/2,screenheight/2,a,6)) End If End If 'turn If KeyDown(KEY_LEFT) Then turninc-=.2 If KeyDown(KEY_RIGHT) Then turninc+=.2 turninc = Clamp(turninc,turnincmin,turnincmax) If turninc > .1 Then turninc -= .1 If turninc < -.1 Then turninc += .1 If turninc >-.1 And turninc <.1 Then turninc=0 ang+=turninc If ang>359 Then ang=0 If ang<0 Then ang=359 'thrust If KeyDown(KEY_UP) Then thrust += .1 If KeyDown(KEY_DOWN) Then thrust -= .1 If thrust < 0 Then thrust = 0 If thrust > maxthrust Then thrust = maxthrust ' Here the trail is created trailtime-=1 If trailtime<0 Then Local x:Int=screenwidth/2 Local y:Int=screenheight/2 mytrail.AddLast(New trail(x,y,x+Cos(ang)*12,y+Sin(ang)*12)) trailtime=10 End If ' count down backwards fire backwardsfiretime-=1 If backwardsfiretime<0 Then backwardsfire=False End If ' count down trippe fire tripplefiretime-=1 If tripplefiretime<0 Then tripplefire=False End If 'collision detection with the bullets For Local i:=Eachin mybullet If i.owner="enemy" If rectsoverlap(i.bx,i.by,i.bradius,i.bradius,(screenwidth/2)-3,(screenheight/2)-3,tilewidth-6,tileheight-6) i.deleteme = True hitpoint -= 1 End If End If Next End Method Method draw() PushMatrix() Translate screenwidth/2,screenheight/2 Rotate(-ang) Scale(4,4) SetColor 255,255,255 DrawPoly(ship) Translate 0,0 PopMatrix() SetColor 255,0,0 DrawLine screenwidth/2, screenheight/2, screenwidth/2+Cos(ang)*(tilewidth*2), screenheight/2+Sin(ang)*(tileheight*2) End Method 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 End Class 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]] Field starimage:Image Field starimagew:Int=screenwidth*2 Field starimageh:Int=screenheight*2 Field starimagepixels:Int[] Method New() ' create the background starfield starimagepixels = New Int[starimagew*starimageh] starimage = CreateImage(starimagew,starimageh) createstarimage() End Method Method update() ' update the tilemap with the player movement mymap.mapx -= Cos(myplayer.ang)*myplayer.thrust mymap.mapy -= Sin(myplayer.ang)*myplayer.thrust End Method Method createstarimage() For Local i=0 Until starimagew*starimageh starimagepixels[i] = argb(0,0,0) Next Local s:Float=255.0/(starimageh/2) Local cnt:Float=0 For Local y = starimageh To starimageh/2 Step -1 drawr(0,y,starimagew,1,argb(0,0,255-s*cnt)) cnt+=1 Next ' For Local i=0 Until 1000 Local c:Int=Rnd(10,255) Local pos:Int=Rnd(starimagew*starimageh) starimagepixels[pos] = argb(c,c,c) If Rnd()<.2 Then starimagepixels[pos-1] = argb(c,c,c) Next ' create the planet in the background Local x:Int=screenwidth-90 Local y:Int=screenheight-90 drawo(x,y,200,argb(40,20,20)) drawo(x+10,y+10,195,argb(0,0,0)) starimage.WritePixels(starimagepixels, 0, 0, starimagew, starimageh, 0) End Method Method draw() SetAlpha 1 DrawImage starimage,(-screenwidth/2)+(mapx/15),(-screenheight/2)+(mapy/15) For Local y=0 Until 10 For Local x=0 Until 15 If map[y][x] = 1 Local x2:Int=x*tilewidth+mapx Local y2:Int=y*tileheight+mapy SetColor 155,155,155 DrawRect x2, y2, tilewidth, tileheight SetColor 255,255,255 DrawLine x2+2,y2+2,x2+tilewidth-4,y2+2 DrawLine x2+2,y2+2,x2+2,y2+tileheight-4 SetColor 55,55,55 DrawLine x2+4,y2+tileheight-4,x2+tilewidth-8,y2+tileheight-4 DrawLine x2+tilewidth-4,y2+tileheight-4,x2+tilewidth-4,y2+4 End If Next Next 'drawminimap ' Local s:Float=255/9 For Local x=0 Until 9 Local c:Float=Float(x)*s SetColor c,c,c DrawLine (screenwidth-109)+x,0,(screenwidth-109)+x,103+x Next For Local y=0 To 9 Local c:Float=Float(y)*s SetColor c,c,c DrawLine (screenwidth-109)+y,109-y,screenwidth,109-y Next ' SetColor 10,10,10 DrawRect screenwidth-100,1,100,100 'tilecenter SetColor 100,100,100 Local x:Float = screenwidth-100 Local y:Float = 1 x += (100.0/5000)*mymap.mapx y += (100.0/5000)*mymap.mapy x+=55 y+=55 ' Print x DrawRect x,y,10,10 ' enemies/drones SetColor 255,255,0 For Local i:=Eachin myenemy Local x:Float=screenwidth-100 Local y:Float=1 Local sx:Float=100.0/5000 Local sy:Float=100.0/5000 x+=(sx*i.ex)+50 y+=(sy*i.ey)+50 DrawRect x,y,2,2 Next 'player position SetColor 255,255,50 SetAlpha .4 DrawCircle screenwidth-50+10,50+10,20 SetAlpha 1 End Method ' makes a noisy oval Method drawo(x1,y1,radius,col) For Local y2=-radius To radius For Local x2=-radius To radius If (y2*y2+x2*x2) <= radius*radius+radius*0.8 Local x3 = x2+x1 Local y3 = y2+y1 Local pc = y3*starimagew+x3 If pc>=0 And pc < starimagew*starimageh Local r:Int=getred(col) Local g:Int=getgreen(col) Local b:Int=getblue(col) Local rs:Float=Float(255)/9 Local gs:Float=Float(255)/9 Local bs:Float=Float(255)/9 Local r2:Int = r+Rnd(-rs,rs) Local g2:Int = r+Rnd(-gs,gs) Local b2:Int = r+Rnd(-bs,bs) r2 = Clamp(r2,0,255) g2 = Clamp(g2,0,255) b2 = Clamp(b2,0,255) Local mc:Int=(r2+g2+b2)/3 r2=(r2/2)+r/2 g2=(g2/2)+g/2 b2=(b2/2)+b/2 Local col2:Int=argb(r2,g2,b2) starimagepixels[pc] = col2 End If End If Next Next End Method Method drawr(x1,y1,w1,h1,col) For Local y2=y1 Until y1+h1 For Local x2=x1 Until x1+w1 Local pc = y2*starimagew+x2 If pc >= 0 And pc < starimagew*starimageh starimagepixels[pc] = col End If Next Next End Method Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255) Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b End Function Function getred:Int(rgba:Int) Return((rgba Shr 16) & $FF) End Function Function getgreen:Int(rgba:Int) Return((rgba Shr 8) & $FF) End Function Function getblue:Int(rgba:Int) Return(rgba & $FF) End Function Function getalpha:Int(rgba:Int) Return ((rgba Shr 24) & $FF) End Function End Class Class particle Field x:Float Field y:Float Field incx:Float Field incy:Float Field modincx:Float Field modincy:Float Field sx:Float Field sy:Float Field sxinc:Float Field syinc:Float Field timeout:Float Field time:Float Field alpha:Float Field deleteme:Bool=False Method New(x:Int,y:Int,angle:Int) Self.x = x Self.y = y incx = Cos(angle+Rnd(-5,5)) incy = Sin(angle+Rnd(-5,5)) timeout = 50+Rnd(20) alpha = 1 modincx = (Cos(angle+Rnd(-5,5)))/100 modincy = (Sin(angle+Rnd(-5,5)))/100 Local sc:Float=Rnd(0.5,1) sx = sc sy = sc sxinc = Rnd()/timeout syinc = Rnd()/timeout End Method Method update() x -= Cos(myplayer.ang)*myplayer.thrust y -= Sin(myplayer.ang)*myplayer.thrust End Method End Class Class particleeffect Field sw:Int,sh:Int Field p:List<particle> = New List<particle> Field image:Image Field iw:Int=32 Field ih:Int=32 Field pixels:Int[] Field angle:Int Field x:Float,y:Float Field deleteme:Bool=False Field timeout:Int=50 Method New(x:Int,y:Int) Self.x = x Self.y = y Self.sw = screenwidth Self.sh = screenheight pixels = New Int[iw*ih] image = CreateImage(iw,ih,image.MidHandle) makeimage() p.AddFirst(New particle(x,y,Rnd(360))) End Method Method update() timeout-=1 If timeout < 0 Then deleteme = True If Rnd() < 0.4 p.AddFirst(New particle(x,y,Rnd(360))) End If 'update the particles with the map movement(player) x -= Cos(myplayer.ang)*myplayer.thrust y -= Sin(myplayer.ang)*myplayer.thrust For Local i:=Eachin p 'update the particles with the map movement(player) i.x -= Cos(myplayer.ang)*myplayer.thrust i.y -= Sin(myplayer.ang)*myplayer.thrust i.x += i.incx i.y += i.incy i.incx += i.modincx i.incy += i.modincy i.alpha -= 1/i.timeout i.time += 1 i.sx += i.sxinc i.sy += i.syinc If i.time > i.timeout Then i.deleteme = True Next For Local i:=Eachin p If i.deleteme = True Then p.Remove(i) Next End Method Method makeimage() For Local i=0 To iw Local c:Int = 0+((255/iw)*i) drawo(iw/2,ih/2,(iw/2)-(i),argb(c,c,c,255)) Next image.WritePixels(pixels, 0, 0, iw, ih, 0) End Method Method drawo(x1,y1,radius:Float,col) For Local y2=-radius To radius For Local x2=-radius To radius If (y2*y2+x2*x2) <= radius*radius+radius*0.8 Local x3 = x2+x1 Local y3 = y2+y1 Local pc = y3*iw+x3 If pc>=0 And pc < iw*ih pixels[pc] = col End If End If Next Next End Method Method draw() SetBlend AdditiveBlend SetColor 255,50,0 For Local i:=Eachin p SetAlpha i.alpha Local sc:Float=(1/i.timeout)*i.time DrawImage(image,i.x,i.y,1,i.sx,i.sy) Next SetAlpha 1 SetBlend AlphaBlend End Method Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255) Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b End Function Function getred:Int(rgba:Int) Return((rgba Shr 16) & $FF) End Function Function getgreen:Int(rgba:Int) Return((rgba Shr 8) & $FF) End Function Function getblue:Int(rgba:Int) Return(rgba & $FF) End Function Function getalpha:Int(rgba:Int) Return ((rgba Shr 24) & $FF) End Function End Class Global myplayer:player Global mymap:map Global mybullet:List<bullet> = New List<bullet> Global myenemy:List<enemy> = New List<enemy> Global myp:List<particleeffect> = New List<particleeffect> Global mypickup:List<pickups> = New List<pickups> Global mylineeffect:List<lineeffect> = New List<lineeffect> Global mytrail:List<trail> = New List<trail> Class MyGame Extends App Method OnCreate() SetUpdateRate(60) myplayer = New player() mymap = New map() For Local i=0 Until 5 myenemy.AddLast(New enemy(Rnd(-screenwidth*2,screenwidth*2),Rnd(-screenheight*2,screenheight*2))) Next For Local i=0 Until 3 mypickup.AddLast(New pickups(Rnd(300),Rnd(300))) Next For Local i=0 Until 10 mypickup.AddLast(New pickups(screenwidth/2+Rnd(-50,50),screenheight/2+Rnd(-50,50))) Next End Method Method OnUpdate() myplayer.update() mymap.update() If MouseDown(MOUSE_LEFT) myp.AddLast(New particleeffect(MouseX(),MouseY())) End If 'update the trail For Local i:=Eachin mytrail i.update Next 'update the trail For Local i:=Eachin mytrail If i.deleteme = True Then mytrail.Remove(i) Next 'update the line effects For Local i:=Eachin mylineeffect i.update Next For Local i:=Eachin mylineeffect If i.deleteme = True Then mylineeffect.Remove(i) Next ' update the pickpups For Local i:=Eachin mypickup i.update() Next For Local i:=Eachin mypickup If i.deleteme = True Then mypickup.Remove(i) Next ' update the particles For Local i:=Eachin myp i.update() Next For Local i:=Eachin myp If i.deleteme = True Then myp.Remove(i) Next For Local i:=Eachin mybullet i.update Next For Local i:=Eachin mybullet If i.deleteme = True Then mybullet.Remove(i) Next For Local i:=Eachin myenemy i.update Next For Local i:=Eachin myenemy If i.deleteme = True Then myenemy.Remove(i) Next ' temp add new enemies if all have died Local cnt:Int=0 For Local i:=Eachin myenemy cnt+=1 Next If cnt=0 Then For Local i=0 Until Rnd(5,8) myenemy.AddLast(New enemy(Rnd(-screenwidth*2,screenwidth*2),Rnd(-screenheight*2,screenheight*2))) Next For Local i=0 Until 10 mypickup.AddLast(New pickups(mymap.mapx+Rnd(300),mymap.mapy+Rnd(300))) Next Print "Added new wave of enemies" End If End Method Method OnRender() 'Cls 0,0,0 mymap.draw() 'draw the pickups For Local i:=Eachin mypickup i.draw Next For Local i:=Eachin myenemy i.draw Next For Local i:=Eachin mybullet i.draw Next 'update the particles For Local i:=Eachin myp i.draw() Next 'draw the trail For Local i:=Eachin mytrail i.draw Next myplayer.draw() 'draw the line effects For Local i:=Eachin mylineeffect i.draw Next SetColor 255,255,255 DrawText "Cursor Left/Right/Up/Down/Space",0,0 DrawText "Score : "+myplayer.score,0,screenheight-15 DrawText "Hull : "+myplayer.hitpoint,200,screenheight-15 End Method End Class Function Main() New MyGame() End Function
Saturday, December 17, 2016
Monkey-X - Example - Additive Particle Flames - code example
Import mojo Global screenwidth:Int=640 Global screenheight:Int=480 Class particle Field x:Float Field y:Float Field incx:Float Field incy:Float Field modincx:Float Field modincy:Float Field sx:Float Field sy:Float Field sxinc:Float Field syinc:Float Field timeout:Float Field time:Float Field alpha:Float Field deleteme:Bool=False Method New(x:Int,y:Int,angle:Int) Self.x = x Self.y = y incx = Cos(angle+Rnd(-5,5)) incy = Sin(angle+Rnd(-5,5)) timeout = 50+Rnd(20) alpha = 1 modincx = (Cos(angle+Rnd(-5,5)))/100 modincy = (Sin(angle+Rnd(-5,5)))/100 Local sc:Float=Rnd(0.5,1) sx = sc sy = sc sxinc = Rnd()/timeout syinc = Rnd()/timeout End Method End Class Class particleeffect Field sw:Int,sh:Int Field p:List<particle> = New List<particle> Field image:Image Field iw:Int=32 Field ih:Int=32 Field pixels:Int[] Field angle:Int Field x:Int,y:Int Method New(x:Int,y:Int,angle:Int) Self.x = x Self.y = y Self.sw = screenwidth Self.sh = screenheight Self.angle = angle pixels = New Int[iw*ih] image = CreateImage(iw,ih,image.MidHandle) makeimage() p.AddFirst(New particle(x,y,angle)) End Method Method update() If Rnd() < 0.4 p.AddFirst(New particle(x,y,angle)) End If For Local i:=Eachin p i.x += i.incx i.y += i.incy i.incx += i.modincx i.incy += i.modincy i.alpha -= 1/i.timeout i.time += 1 i.sx += i.sxinc i.sy += i.syinc If i.time > i.timeout Then i.deleteme = True Next For Local i:=Eachin p If i.deleteme = True Then p.Remove(i) Next End Method Method makeimage() For Local i=0 To iw Local c:Int = 0+((255/iw)*i) drawo(iw/2,ih/2,(iw/2)-(i),argb(c,c,c,255)) Next image.WritePixels(pixels, 0, 0, iw, ih, 0) End Method Method drawo(x1,y1,radius:Float,col) For Local y2=-radius To radius For Local x2=-radius To radius If (y2*y2+x2*x2) <= radius*radius+radius*0.8 Local x3 = x2+x1 Local y3 = y2+y1 Local pc = y3*iw+x3 If pc>=0 And pc < iw*ih pixels[pc] = col End If End If Next Next End Method Method draw() SetBlend AdditiveBlend For Local i:=Eachin p SetAlpha i.alpha Local sc:Float=(1/i.timeout)*i.time DrawImage(image,i.x,i.y,1,i.sx,i.sy) Next SetAlpha 1 End Method Function argb:Int(r:Int, g:Int, b:Int ,alpha:Int=255) Return (alpha Shl 24) | (r Shl 16) | (g Shl 8) | b End Function Function getred:Int(rgba:Int) Return((rgba Shr 16) & $FF) End Function Function getgreen:Int(rgba:Int) Return((rgba Shr 8) & $FF) End Function Function getblue:Int(rgba:Int) Return(rgba & $FF) End Function Function getalpha:Int(rgba:Int) Return ((rgba Shr 24) & $FF) End Function End Class Global m:List<particleeffect> = New List<particleeffect> Class MyGame Extends App Method OnCreate() SetUpdateRate(60) For Local i=0 Until 5 m.AddLast(New particleeffect(i*(640/5)+30,200,Rnd(250,260))) Next End Method Method OnUpdate() For Local i:=Eachin m i.update() Next End Method Method OnRender() Cls 50,50,50 For Local i:=Eachin m i.draw() Next End Method End Class Function Main() New MyGame() End Function
Subscribe to:
Posts (Atom)