diff --git a/samples/Monkey/encodeToPng.monkey2 b/samples/Monkey/encodeToPng.monkey2 new file mode 100644 index 00000000..32de210d --- /dev/null +++ b/samples/Monkey/encodeToPng.monkey2 @@ -0,0 +1,83 @@ + +#Import "" +Using std.. + +'Set your own path here. Defaults to build folder. +Global path:= AppDir() + "encodeToPng.png" + +Function Main() + + 'Write from PixMap + Local source := New Pixmap( 100, 100 ) + For Local y := 0 Until source.Width + For Local x := 0 Until source.Height + 'Generates random pixels + source.SetPixelARGB( x, y, ARGB( 255, Rnd(0, 255), 0, Rnd(0, 255) ) ) + Next + Next + source.Save( path ) + + 'Read from png to PixMap + Local dest := Pixmap.Load( path ) + Local a := "" + Local r := "" + Local g := "" + Local b := "" + For Local y := 0 Until dest.Width + For Local x := 0 Until source.Height + Local argb := dest.GetPixelARGB(x,y) + a += ARGBToAlpha( argb ) + " " + r += ARGBToRed( argb ) + " " + g += ARGBToGreen( argb ) + " " + b += ARGBToBlue( argb ) + " " + Next + a += "~n" + r += "~n" + g += "~n" + b += "~n" + Next + + 'Print resulting pixels + Print( " ~nAlpha:~n" + a ) + Print( " ~nRed:~n" + r ) + Print( " ~nGreen:~n" + g ) + Print( " ~nBlue:~n" + b ) + +End + + +'**************** Color Functions **************** + + +Function ARGB:UInt( a:Float, r:Float, g:Float, b:Float ) + Assert ( a<=1.0, "Alpha max value is 1.0" ) + Assert ( r<=1.0, "Red max value is 1.0" ) + Assert ( g<=1.0, "Green max value is 1.0" ) + Assert ( b<=1.0, "Blue max value is 1.0" ) + Return UInt(a*255) Shl 24 | UInt(r*255) Shl 16 | UInt(g*255) Shl 8 | UInt(b*255) +End + +Function ARGB:UInt( a:Int, r:Int, g:Int, b:Int ) + Assert ( a<256, "Alpha can't be higher than 255" ) + Assert ( r<256, "Red can't be higher than 255" ) + Assert ( g<256, "Green can't be higher than 255" ) + Assert ( b<256, "Blue can't be higher than 255" ) + Return( a Shl 24 | r Shl 16 | g Shl 8 | b ) +End + +Function ARGBToAlpha:Int( argb:UInt ) + Return argb Shr 24 & $ff +End + +Function ARGBToRed:Int( argb:UInt ) + Return argb Shr 16 & $ff +End + +Function ARGBToGreen:Int( argb:UInt ) + Return argb Shr 8 & $ff +End + +Function ARGBToBlue:Int( argb:UInt ) + Return argb & $ff +End + diff --git a/samples/Monkey/example.monkey2 b/samples/Monkey/example.monkey2 new file mode 100644 index 00000000..411a847e --- /dev/null +++ b/samples/Monkey/example.monkey2 @@ -0,0 +1,185 @@ + +Namespace example + +#rem +multi +line +comment +#end + +#rem +nested +#rem +multi +line +#end +comment +#end + +'Importing a module pre-compile in the modules folder +#Import "" + +'Setting search paths for namespaces +Using mojo.. +Using std.. + +Const ONECONST:Int = 1 +Const TWOCONST := 2 +Const THREECONST := 3, FOURCONST:Int = 4 + +Global someVariable:Int = 4 + +Function Main() + 'creating arrays + Local scores:Int[]= New Int[](10,20,30) + Local text:String[]= New String[]( "Hello","There","World" ) + + ' string type + Local string1:String = "Hello world" + Local string2:= "Hello world" + + ' escape characers in strings + Local string4 := "~qHello World~q" + Local string5 := "~tIndented~n" + Local string6 := "tilde is wavey... ~~" + Print string4 + Print string5 + Print string6 + + ' string pseudofunctions + Print " Hello World ~n".Trim() ' prints "Hello World" whithout whitespace + Print "Hello World".ToUpper() ' prints "HELLO WORLD" + + ' preprocessor keywords + #If __TARGET__ = "android" + 'DoStuff() + #ElseIf __TARGET__ = "ios" + 'DoOtherStuff() + #End + + ' operators + Local a := 32 + Local b := 32 ~ 0 + b ~= 16 + b |= 16 + b &= 16 + Local c := a | b + Print c + + 'Creates a new Window class and starts the main App loop, using the Mojo module + New AppInstance + New GameWindow + App.Run() +End + + +'------------------------------------------ Class Examples ------------------------------------------ + + +'You can extend the Window class to customize its behavior +Class GameWindow Extends Window + + Private + Field _spiral :Float[] + Field _circle :Float[] + + Public + Method New() + Super.New( "Test", 800, 600, WindowFlags.Resizable ) + End + + 'Properties can be used to create "read-only" values + Property Spiral:Float[]() + Return _spiral + End + + 'Or to control what happens to a value when assigned + Property Circle:Float[]() + Return _circle + Setter( values:Float[] ) + If( values.Length > 2 ) And ( values.Length Mod 2 = 0 ) + _circle = values + Else + Print( "Circle values need to be an even number larger than 1" ) + End + End + + 'Methods require a class instance. The keyword Self is optional when accessing fields and properties + 'The method Window.OnRender is virtual, and can be overriden + 'Width and Height are Propreties inherited from the Window class + Method OnRender( canvas:Canvas ) Override + RequestRender() + canvas.Clear( Color.DarkGrey ) + canvas.Translate( Width/2.0, Height/2.0 ) + canvas.Rotate( -Millisecs()/200.0 ) + canvas.Color = New Color( 1, 0.8, 0.2 ) + DrawLines( canvas, Spiral ) + DrawLines( canvas, Circle, True ) + End + + 'This method is called whenever the window layout changes, like when resizing + Method OnLayout() Override + _spiral = CreateSpiral( 0, 0, Height/1.5, Height/1.5, 100 ) + Circle = CreateCircle( 0, 0, Height/1.5, Height/1.5, 100 ) + End + + 'Functions can be called without a GameWindow instance, like "Static Functions" in other languages. + Function DrawLines( canvas:Canvas, lines:Float[], closedShape:Bool = False ) + For Local n := 0 Until lines.Length Step 2 + Local l := lines.Length - 3 + Local x0 := lines[n] + Local y0 := lines[n+1] + Local x1 := n + Local radStep := (Pi*2.0)/Float(sides) + Local xMult := 0.0 + Local yMult := 0.0 + Local radiusX:Float = width/2.0 + Local radiusY:Float = height/2.0 + Local stepX:Float = radiusX / sides + Local stepY:Float = radiusY / sides + For Local a := 0.0 To Pi*2 Step radStep + stack.Push( ( ( Sin( a*turns ) * radiusX )* xMult ) + x ) + stack.Push( ( ( Cos( a*turns ) * radiusY )* yMult ) + y ) + xMult += stepX/radiusX + yMult += stepY/radiusY + Next + Return stack.ToArray() + End + + Function CreateCircle:Float[]( x:Double, y:Double, width:Double, height:Double, sides:Int = 32 ) + Local stack := New Stack + Local radStep := (Pi*2.0)/Float(sides) + Local radiusX:Float = width/2.0 + Local radiusY:Float = height/2.0 + For Local a := 0.0 To Pi*2 Step radStep + stack.Push( ( Sin( a ) * radiusX ) + x ) + stack.Push( ( Cos( a ) * radiusY ) + y ) + Next + Return stack.ToArray() + End + +End + +'--------- extending with generics ----------------------------------------------------------------------------- + +Class MyList Extends List +End + +'--------- interfaces ------------------------------------------------------------------------------------------ + +Interface Computer + Method Boot () + Method Process () + Method Display () +End +' +Class PC Implements Computer +End + diff --git a/samples/Monkey/gui.monkey2 b/samples/Monkey/gui.monkey2 new file mode 100644 index 00000000..4947ef4c --- /dev/null +++ b/samples/Monkey/gui.monkey2 @@ -0,0 +1,115 @@ +#Import "" +#Import "" + +Using std.. +Using mojo.. +Using mojox.. + +Function Main() + New AppInstance + New TestGui + App.Run() +End + + +Class TestGui Extends Window + Field mainDock:DockingView + Field rgtDock:ScrollView + Field graphView:GraphView + + Const smallFont:Font = Font.Load( "font::DejaVuSans.ttf", 10 ) + + Method New() + Super.New( "Test", 1024, 640, WindowFlags.Resizable ) + mainDock = New MainDock() + rgtDock = New RightDock() + mainDock.AddView( rgtDock, "right", "400", True ) + ContentView = mainDock + End +End + + +Class MainDock Extends DockingView + Method New() + Layout="fill" + Local newStyle := Style.Copy() + newStyle.BackgroundColor = Color.DarkGrey + newStyle.BorderColor = Color.Black + newStyle.Font = TestGui.smallFont + Style = newStyle + End + + Method OnRender( canvas:Canvas ) Override + Super.OnRender( canvas ) + canvas.Color = New Color( Rnd(), Rnd(), Rnd() ) + canvas.DrawCircle( Frame.Width/4, Frame.Height/2, Frame.Height/4 ) + canvas.Color = Color.Aluminum + canvas.DrawText( "gameview:" + App.FPS + " fps", 5, 5 ) + End +End + + + +Class RightDock Extends ScrollView + Private + Field _panSpeed := 10.0 + + Public + Method New() + Layout="fill" + ScrollBarsVisible = True + + Local newStyle := Style.Copy() + newStyle.BackgroundColor = Color.Grey + newStyle.BorderColor = Color.Black + newStyle.Font = TestGui.smallFont + Style = newStyle + + Local graph:=New GraphView + ContentView = graph + + Scroll = New Vec2i( graph.Frame.Width/2, graph.Frame.Height/2 ) 'Doesn't work! + End + + Method OnRender( canvas:Canvas ) Override + Super.OnRender( canvas ) + canvas.Color = Color.Aluminum + canvas.DrawText( "size:" + Frame + " ,scroll:" + Scroll , 5, 5 ) + End + + Method OnMouseEvent( event:MouseEvent ) Override + Select event.Type + Case EventType.MouseWheel + Scroll = New Vec2i( Scroll.X+(event.Wheel.X*_panSpeed), Scroll.Y-(event.Wheel.Y*_panSpeed) ) + App.RequestRender() + End + End +End + + +Class GraphView Extends View + Private + Field _panSpeed := 5.0 + Field _size := New Vec2i( 1024, 1024 ) + + Public + Method New() + MinSize=New Vec2i( _size.X, _size.Y ) + End + + Method OnRender( canvas:Canvas ) Override + Local r:= 20.0 + For Local x := 1 Until 10 + For Local y := 1 Until 10 + Local v := (x/10.0) -0.05 + canvas.Color = New Color( v, v, v ) + canvas.DrawCircle( (x*100)+r, (y*100)+r, r ) + Next + Next + End +End + + + + + diff --git a/samples/Monkey/sorting.monkey2 b/samples/Monkey/sorting.monkey2 new file mode 100644 index 00000000..2291146a --- /dev/null +++ b/samples/Monkey/sorting.monkey2 @@ -0,0 +1,29 @@ +'Showcases use of Lambda functions and Generics. + +#Import "" +Using std.. + +Function Main() + + Local testStack := New Stack< MyObject > + + For Local n := 1 To 20 + Local newItem := New MyObject + newItem.depth = Rnd( 0, 100 ) + testStack.Push( newItem ) + Next + + testStack.Sort( Lambda:Int( x:MyObject,y:MyObject ) + Return x.depth<=>y.depth + End ) + + For Local n := Eachin testStack + Print( n.depth ) + Next + +End + + +Struct MyObject + Field depth := 0 +End \ No newline at end of file