Added a few Monkey2 examples (#3811)

* Added Monkey2 (extension .monkey2) example

This compiles with the most up to date Monkey2 release (V1.1.06).

* Sorting example in Monkey2

* Add files via upload

* Gui example using the MojoX module
This commit is contained in:
DoctorWhoof
2018-01-11 01:23:54 -08:00
committed by Colin Seymour
parent db1d4f7893
commit a4e6fc78c8
4 changed files with 412 additions and 0 deletions

View File

@@ -0,0 +1,83 @@
#Import "<std>"
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

View File

@@ -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 "<mojo>"
'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<l? lines[n+2] Else (closedShape? lines[0] Else x0 ) 'Conditional assignment, uses the "?" symbol to test a condition
Local y1 := n<l? lines[n+3] Else (closedShape? lines[1] Else y0 )
canvas.DrawLine( x0, y0, x1, y1 )
Next
End
Function CreateSpiral:Float[]( x:Double, y:Double, width:Double, height:Double, sides:Int = 32, turns:Float = 3.0 )
Local stack := New Stack<Float>
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<Float>
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<Double>
End
'--------- interfaces ------------------------------------------------------------------------------------------
Interface Computer
Method Boot ()
Method Process ()
Method Display ()
End
'
Class PC Implements Computer
End

115
samples/Monkey/gui.monkey2 Normal file
View File

@@ -0,0 +1,115 @@
#Import "<mojo>"
#Import "<mojox>"
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

View File

@@ -0,0 +1,29 @@
'Showcases use of Lambda functions and Generics.
#Import "<std>"
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