mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-28 17:20:22 +00:00
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:
committed by
Colin Seymour
parent
db1d4f7893
commit
a4e6fc78c8
83
samples/Monkey/encodeToPng.monkey2
Normal file
83
samples/Monkey/encodeToPng.monkey2
Normal 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
|
||||
|
||||
185
samples/Monkey/example.monkey2
Normal file
185
samples/Monkey/example.monkey2
Normal 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
115
samples/Monkey/gui.monkey2
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
29
samples/Monkey/sorting.monkey2
Normal file
29
samples/Monkey/sorting.monkey2
Normal 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
|
||||
Reference in New Issue
Block a user