Monkey: virtual stick

Strict
Import mojo

Class VirtualStickTestApp Extends App
    Const PLAYFIELD_WIDTH:Float = 200
    Const PLAYFIELD_HEIGHT:Float = 200
    Const PLAYER_SPEED:Float = 5

    ' our virtual stick
    Field mystick:MyStick

    ' the "player"'s location
    Field playerX:Float = PLAYFIELD_WIDTH/2
    Field playerY:Float = PLAYFIELD_HEIGHT/2
    Field playfieldX:Float
    Field playfieldY:Float = 10

    Method OnCreate:Int()
        mystick = New MyStick
        mystick.SetRing(100, DeviceHeight()-100, 40)
        mystick.SetStick(0, 0, 15)
        mystick.SetDeadZone(0.2)
        mystick.SetTriggerDistance(5)
        playfieldX = DeviceWidth()-PLAYFIELD_WIDTH-10
        SetUpdateRate 30
        Return 0
    End

    Method OnUpdate:Int()
        ' update the stick usage
        UpdateStick()

        ' update the player position
        If mystick.GetVelocity() <> 0 Then
            playerX += mystick.GetDX() * PLAYER_SPEED
            playerY -= mystick.GetDY() * PLAYER_SPEED
            If playerX < 0 Then
                playerX = 0
            Elseif playerX > PLAYFIELD_WIDTH Then
                playerX = PLAYFIELD_WIDTH
            End
            If playerY < 0 Then
                playerY = 0
            Elseif playerY > PLAYFIELD_HEIGHT Then
                playerY = PLAYFIELD_HEIGHT
            End
        End
        Return 0
    End

    Method OnRender:Int()
        Cls(0,0,0)

        mystick.DoRenderRing()
        mystick.DoRenderStick()
        DrawOutlineRect(playfieldX, playfieldY, PLAYFIELD_WIDTH, PLAYFIELD_HEIGHT)
        DrawCircle(playfieldX + playerX, playfieldY + playerY, 5)

        ' some test info
        DrawText("angle="+mystick.GetAngle(), 10, 10)
        DrawText("vel="+mystick.GetVelocity(), 10, 30)
        DrawText("dx="+mystick.GetDX(), 10, 50)
        DrawText("dy="+mystick.GetDY(), 10, 70)
        Return 0
    End

    Method UpdateStick:Void()
        If mystick.GetTouchNumber() < 0 Then
            #if TARGET="android" Then
                For Local i:Int = 0 To 31
                    If TouchHit(i) And mystick.GetTouchNumber() < 0 Then
                        mystick.StartTouch(TouchX(i), TouchY(i), i)
                    End
                End
            #else
                If MouseHit(0) Then
                    mystick.StartTouch(MouseX(), MouseY(), 0)
                End
            #endif
        End

        If mystick.GetTouchNumber() >= 0 Then
            #if TARGET="android" Then
                If TouchDown(mystick.GetTouchNumber()) Then
                    mystick.UpdateTouch(TouchX(mystick.GetTouchNumber()), TouchY(mystick.GetTouchNumber()))
                Else
                    mystick.StopTouch()
                End
            #else
                If MouseDown(0) Then
                    mystick.UpdateTouch(MouseX(), MouseY())
                Else
                    mystick.StopTouch()
                End
            #endif
        End
    End
End

Class MyStick Extends VirtualStick
    Method RenderRing:Void(x:Float, y:Float)
        SetColor 0, 0, 255
        Super.RenderRing(x, y)
        SetColor 255, 255, 255
    End

    Method RenderStick:Void(x:Float, y:Float)
        SetColor 0, 255, 0
        Super.RenderStick(x, y)
        SetColor 255, 255, 255
    End
End

Class VirtualStick
Private
    ' the coordinates and dimensions for the virtual stick's ring (where the user will first touch)
    Field ringX:Float
    Field ringY:Float
    Field ringRadius:Float

    ' the coordinates and dimensions for the stick (what the user is pushing around)
    ' X/Y is relative to the centre of the ring, and positive Y points up
    Field stickX:Float = 0
    Field stickY:Float = 0
    Field stickRadius:Float
    Field stickAngle:Float
    Field stickPower:Float

    ' where the user first touched
    Field firstTouchX:Float
    Field firstTouchY:Float

    ' power must always be >= this, or we return 0
    Field deadZone:Float

    ' we need to move the stick this much before it triggers
    Field triggerDistance:Float = -1
    Field triggered:Bool = False

    ' the index of the touch event that initiated the stick movement
    Field touchNumber:Int = -1

    ' clips the stick to be within the ring, and updates angles, etc.
    Method UpdateStick:Void()
        If touchNumber>=0 Then
            Local length:Float = Sqrt(stickX*stickX+stickY*stickY)
            stickPower = length/ringRadius
            If stickPower > 1 Then stickPower = 1

            If stickPower < deadZone Then
                stickPower = 0
                stickAngle = 0
                stickX = 0
                stickY = 0
            Else
                If stickX = 0 And stickY = 0 Then
                    stickAngle = 0
                    stickPower = 0
                Elseif stickX = 0 And stickY > 0 Then
                    stickAngle = 90
                Elseif stickX = 0 And stickY < 0 Then
                    stickAngle = 270
                Elseif stickY = 0 And stickX > 0 Then
                    stickAngle = 0
                Elseif stickY = 0 And stickX < 0 Then
                    stickAngle = 180
                Elseif stickX > 0 And stickY > 0 Then
                    stickAngle = ATan(stickY/stickX)
                Elseif stickX < 0 Then
                    stickAngle = 180+ATan(stickY/stickX)
                Else
                    stickAngle = 360+ATan(stickY/stickX)
                End
                If length > ringRadius Then
                    stickPower = 1
                    stickX = Cos(stickAngle) * ringRadius
                    stickY = Sin(stickAngle) * ringRadius
                End
            End
        End
    End

Public

    Method GetTouchNumber:Int()
        Return touchNumber
    End

    ' the angle in degrees that the user is pushing, going counter-clockwise from right
    Method GetAngle:Float()
        Return stickAngle
    End

    ' the strength of the movement (0 means dead centre, 1 means at the edge of the ring (or past it)
    Method GetVelocity:Float()
        Return stickPower
    End

    ' based on the angle and velocity, get the DX
    Method GetDX:Float()
        Return Cos(stickAngle) * stickPower
    End

    ' based on the angle and velocity, get the DY
    Method GetDY:Float()
        Return Sin(stickAngle) * stickPower
    End

    ' we just touched the screen at point (x,y), so start "controlling" if we touched inside the ring
    Method StartTouch:Void(x:Float, y:Float, touchnum:Int)
        If touchNumber < 0 Then
            If (x-ringX)*(x-ringX) + (y-ringY)*(y-ringY) <= ringRadius*ringRadius Then
                touchNumber = touchnum
                firstTouchX = x
                firstTouchY = y
                triggered = False
                If triggerDistance <= 0 Then
                    triggered = True
                    stickX = x-ringX
                    stickY = ringY-y
                End
                UpdateStick()
            End
        End
    End

    ' a touch just moved, so we may need to update the stick
    Method UpdateTouch:Void(x:Float, y:Float)
        If touchNumber>=0 Then
            If Not triggered Then
                If (x-firstTouchX)*(x-firstTouchX)+(y-firstTouchY)*(y-firstTouchY) > triggerDistance*triggerDistance Then
                    triggered = True
                End
            End
            If triggered Then
                stickX = x - ringX
                stickY = ringY - y
                UpdateStick()
            End
        End
    End

    ' we just released a touch, which may have been this one
    Method StopTouch:Void()
        If touchNumber>=0 Then
            touchNumber = -1
            stickX = 0
            stickY = 0
            stickAngle = 0
            stickPower = 0
            triggered = False
        End
    End

    Method DoRenderRing:Void()
        RenderRing(ringX, ringY)
    End

    Method DoRenderStick:Void()
        RenderStick(ringX+stickX, ringY-stickY)
    End

    ' draws the stick (may be overridden to do images, etc.)
    Method RenderStick:Void(x:Float, y:Float)
        DrawCircle(x, y, stickRadius)
    End

    ' draws the outside ring (may be overridden to do images, etc.)
    Method RenderRing:Void(x:Float, y:Float)
        DrawCircle(x, y, ringRadius)
    End

    ' set the location and radius of the ring
    Method SetRing:Void(ringX:Float, ringY:Float, ringRadius:Float)
        Self.ringX = ringX
        Self.ringY = ringY
        Self.ringRadius = ringRadius
    End

    ' set the location and radius of the stick
    Method SetStick:Void(stickX:Float, stickY:Float, stickRadius:Float)
        Self.stickX = stickX
        Self.stickY = stickY
        Self.stickRadius = stickRadius
    End

    Method SetDeadZone:Void(deadZone:Float)
        Self.deadZone = deadZone
    End

    Method SetTriggerDistance:Void(triggerDistance:Float)
        Self.triggerDistance = triggerDistance
    End
End

Function Main:Int()
    New VirtualStickTestApp
    Return 0
End

Function DrawOutlineRect:Void(x:Float, y:Float, width:Float, height:Float)
    DrawLine(x, y, x+width, y)
    DrawLine(x, y, x, y+height)
    DrawLine(x+width, y, x+width, y+height)
    DrawLine(x, y+height, x+width, y+height)
End

Monkey: multitouch demo

Strict
Import mojo

Function Main:Int()
    New MyApp
    Return 0
End

Class MyApp Extends App
    Method OnCreate:Int()
        SetUpdateRate(120)
        Return 0
    End

    Method OnUpdate:Int()
        Return 0
    End

    Method OnRender:Int()
        Cls(0,0,0)
        Local dy:Int = 30
        For Local i:Int = 0 To 31
            If TouchDown(i) Then
                If i Mod 2 = 0 Then
                    SetColor(255,0,0)
                Else
                    SetColor(0,0,255)
                End
                DrawCircle(TouchX(i),TouchY(i),50)
                SetColor(255,255,255)
                DrawText(""+i, 10, dy)
                DrawText(""+Int(TouchX(i)), 40, dy)
                DrawText(""+Int(TouchY(i)), 80, dy)
                dy+=20
            End
        End
        DrawText("idx",10,10)
        DrawText("x",40,10)
        DrawText("y",80,10)
        Return 0
    End
End

Monkey: fantomEngine – using text object as a button

Strict

#rem
   Script:      touchTest.monkey
   Description:   Sample Script fantomEngine to display the use of touch events 
   Author:       Michael
#end

Import fantomEngine
Global g:game

'***************************************
Class game Extends App
   Field eng:engine
   Field font1:ftFont
   '------------------------------------------
   Method CreateObjects:Int()

      'Create a box
      Local b:ftObject = eng.CreateBox(100,50,eng.canvasWidth/2,eng.canvasHeight/2-150)
      'Set TouchMode to bounding box(2)    ... 1=Circle
      b.SetTouchMode(2)
      b.SetName("Box")

      'Create a circle
      Local c:ftObject = eng.CreateCircle(50,eng.canvasWidth/2,eng.canvasHeight/2)
      c.SetTouchMode(1)
      c.SetName("Circle")

      'Create a text
      Local t:ftObject = eng.CreateText(font1,"This is a clickable text", eng.canvasWidth/2,eng.canvasHeight/2+150,1)
      t.SetTouchMode(2)
      t.SetName("Text")

      Return 0
   End
   '------------------------------------------
   Method OnCreate:Int()
      SetUpdateRate(60)

      'Store the engine instance
      eng = New engine

      'Load the font bitmap
      font1 = eng.LoadFont("bo_font")             '<========== please change this to a font that you have

      'Create the objects
      CreateObjects()
      Return 0
   End

   '------------------------------------------
   Method OnUpdate:Int()
      Local d:Float = Float(eng.CalcDeltaTime())/60.0
      eng.Update(Float(d))
      'check if you have a touch hit and then do a touch check.
      If TouchHit(0) Then   eng.TouchCheck()
      Return 0
   End

   '------------------------------------------
   Method OnRender:Int()
      Cls
      eng.Render()
      Return 0
   End
End  

'***************************************
Class engine Extends ftEngine
   '------------------------------------------
   Method OnObjectTouch:Int(obj:ftObject, touchId:Int)
      Print ("Object "+obj.GetName()+" was hit!")
      Return 0
   End
End

'***************************************
Function Main:Int()
   g = New game
   Return 0
End

Monkey: a base script for the fantomEngine

Strict

#rem
    Script:     baseScript.monkey
    Description:    Base Script fantomEngine 
    Author:         Michael Hartlef
    Version:      1.0
#end

Import fantomEngine
Global g:game

'***************************************
Class game Extends App
    Field eng:engine
    Field isSuspended:Bool = False
    '------------------------------------------
    Method OnCreate:Int()
        SetUpdateRate(60)
        eng = New engine
        Return 0
    End
    '------------------------------------------
    Method OnUpdate:Int()
        Local d:Float = Float(eng.CalcDeltaTime())/60.0
        If isSuspended = False Then
            eng.Update(Float(d))
        Endif
        Return 0
    End
    '------------------------------------------
    Method OnRender:Int()
        Cls
        eng.Render()
        Return 0
    End
    '------------------------------------------
    Method OnResume:Int()
        isSuspended = False
        SetUpdateRate(60)
        Return 0
    End
    '------------------------------------------
    Method OnSuspend:Int()
        isSuspended = True
        SetUpdateRate(5)
        Return 0
    End
End

'***************************************
Class engine Extends ftEngine
    '------------------------------------------
    Method OnObjectCollision:Int(obj:ftObject, obj2:ftObject)
        Return 0
    End
    '------------------------------------------
    Method OnObjectTimer:Int(timerId:Int, obj:ftObject)
        Return 0
    End
    '------------------------------------------
    Method OnObjectTouch:Int(obj:ftObject, touchId:Int)
        Return 0
    End
    '------------------------------------------
    Method OnObjectTransition:Int(transId:Int, obj:ftObject)
        Return 0
    End
    '------------------------------------------
    Method OnObjectUpdate:Int(obj:ftObject)
        Return 0
    End
    '------------------------------------------
    Method OnLayerTransition:Int(transId:Int, layer:ftLayer)
        Return 0
    End
    '------------------------------------------
    Method OnLayerUpdate:Int(layer:ftLayer)
        Return 0
    End
End

'***************************************
Function Main:Int()
    g = New game
    Return 0
End

 

Monkey: drawing a diffusion effect

'******************************************************************
'* Diffusion Example
'* Author: Richard R Betson
'* Date: 11/25/11
'* Language: Monkey
'* Target: HTML5              
'******************************************************************
' Linsence - Public Domain
'******************************************************************
' Web Site - <a href="http://redeyeware.uphero.com" target="_blank">http://redeyeware.uphero.com</a>
'******************************************************************
' Canvas Wrapper Mod by Impixi - <a href="http://www.monkeycoder.co.nz/Community/posts.php?topic=1885" target="_blank">http://www.monkeycoder.co.nz/Community/posts.php?topic=1885</a>
'******************************************************************

Import monkey
Import mojo
Import canvaswrapper

Global flag=0
Global clra:Int
Global ang_index_1:Int[360],ang_index_2:Int[360],ang_index_3:Int[360],ang_index_4:Int[360]

Function Main()
  New Diffusion
End Function

Class Diffusion Extends App
Field imd:ImageData

Global fps,fp,fps_t
Global mapx:Int[77900]
Global mapx1:Int[77900]
Global mapx2:Int[77900]
Global mapx3:Int[77900]
Global mapx4:Int[77900]

Global clrr:Int[77900]
Global clrb:Int[77900]

Global clrr1:Int[77900]
Global clrb1:Int[77900]

Global ii
Global fxsel_ttl
Global fxsel

Global fred:Int=1,fblue:Int=2
Global qtext:String="Highest Quality",qt:Int=3,widetext:String=""

Global xa:Int=1,xb:Int=319,ya:Int=1,yb:Int=239

  Method OnCreate()
    fxsel_ttl=Millisecs()+16000
    SetUpdateRate(60)
    SetLookUp()
    imd = xCanvas.CreateImageData(640,480)'640,480)
Local i2:Int
  For i2=0 To 359
    ang_index_1[i2]=(160 + (Sin(i2)*40) )
    ang_index_2[i2]=(120 + (Cos(i2)*40) )
    ang_index_3[i2]=(160 + (-Sin(i2)*40) )
    ang_index_4[i2]=(120 + (-Cos(i2)*40) )
  Next

  End Method

  Method OnUpdate()
    If KeyHit(KEY_F1)
    For Local y=0 To 240
      'Local y1:Int=320 *y
      For Local x= 0 To 320
        xCanvas.SetImageDataPixel(imd, x*2,(y*2), 0, 0, 0, 255)
        xCanvas.SetImageDataPixel(imd, (x*2)+1,(y*2) ,0, 0, 0, 255)
        xCanvas.SetImageDataPixel(imd, (x*2),((y*2)+1), 0, 0, 0, 255)
        xCanvas.SetImageDataPixel(imd, ((x*2)+1),((y*2)+1) ,0, 0, 0, 255)
      Next
    Next
'Cls    
      qt=qt+1
      If qt>5 Then qt=0
      If qt=0 Then qtext="Low Quality"
      If qt=1 Then qtext="Med Quality"
      If qt=2 Then qtext="Med-High Quality"
      If qt=3 Then qtext="Highest Quality"
      If qt=4 Then qtext="1/4 Screen H-Quality" 
      If qt=5 Then qtext="1/4 Screen x 4 H-Quality"
    Endif

    If KeyHit(KEY_F2)
      For Local y=0 To 240
        'Local y1:Int=320 *y
        For Local x= 0 To 320
          xCanvas.SetImageDataPixel(imd, x*2,(y*2), 0, 0, 0, 255)
          xCanvas.SetImageDataPixel(imd, (x*2)+1,(y*2) ,0, 0, 0, 255)
          xCanvas.SetImageDataPixel(imd, (x*2),((y*2)+1), 0, 0, 0, 255)
          xCanvas.SetImageDataPixel(imd, ((x*2)+1),((y*2)+1) ,0, 0, 0, 255)
        Next
      Next

      If widetext=""
        ya=60
        yb=180
        widetext="WIDE -"
      Else
        ya=1
        yb=239
        widetext=""
      Endif
    Endif

    If fxsel_ttl<millisecs() fxsel="" fxsel_ttl="Millisecs()+14000" if="">4 Then fxsel=0
      Select fxsel
      Case 0
        fred=1
        fblue=2

      Case 1
        fred=50
        fblue=4
      Case 2
        fred=3
        fblue=3
      Case 3
        fred=2
        fblue=4
      Case 4
        fred=3
        fblue=4
    End Select

    Endif 

  End Method

  Method OnRender()

    fps=fps+1
    If fps_t<millisecs() fp="(fps)" fps_t="1000+Millisecs()" fps="0" endif="" ii="" if="">359 Then ii=0

    Local x2:Int=ang_index_1[ii]
    Local y2:Int=ang_index_2[ii]
    Local x3:Int=ang_index_3[ii]
    Local y3:Int=ang_index_4[ii]

    'Draw Line
    LineB(160,120,x2,y2)
    LineB(160,120,x3,y3)

    For Local zz=0 To 100
      Local xz=Int(Rnd(50))+135
      Local yz=Int(Rnd(50))+95
      clrb1[ ( 320 *yz ) +xz ]=255

    Next

    For Local y=ya To yb
        Local y2:Int=(320 *y)
      For Local x= xa To xb 
        Local y1:Int=y2+x
        'Apply mapping via lookup table
        If fxsel=0
        clrr[  y1  ] = clrr1[ mapx[ y1 ] ]
        clrb[  y1  ] = clrb1[ mapx[ y1 ] ]
        Else If fxsel=1
        clrr[  y1   ] = clrr1[ mapx1[ y1  ] ]
        clrb[  y1   ] = clrb1[ mapx1[ y1  ] ]
        Else If fxsel=2
        clrr[  y1   ] = clrr1[ mapx2[ y1  ] ]
        clrb[  y1   ] = clrb1[ mapx2[ y1  ] ]
        Else If fxsel=3
        clrr[  y1   ] = clrr1[ mapx3[ y1  ] ]
        clrb[  y1   ] = clrb1[ mapx3[ y1  ] ]
        Else If fxsel=4
        clrr[  y1   ] = clrr1[ mapx4[ y1  ] ]
        clrb[  y1   ] = clrb1[ mapx4[ y1  ] ]
        Endif

      Next
    Next

Local sumr,sumb,b,r

    For Local y=ya To yb
      Local y1:Int=320 *y
      Local yn1:Int=y*2
      For Local x= xa To xb
        Local yn2:Int=y1+x
        'Blur Image and Fade Color

        r=clrr[yn2]
        sumr = ((r*4) + clrr[ yn2+1   ] + clrr[ yn2-1   ] + clrr[ ( y1-1 ) + x   ] + clrr[ ( y1+1 ) + x   ] ) Shr 3 

        b=clrb[yn2]
        sumb = ((b*4) + clrb[ yn2+1   ] + clrb[ yn2-1   ] + clrb[ ( y1-1 ) + x   ] + clrb[ ( y1+1 ) + x   ] ) Shr 3

        r=sumr-fred
        b=sumb-fblue

        If r<0 then="" r="" if="">255 Then r=255
        If b<0 then="" b="" if="">255 Then b=255

        clrr1[ yn2 ]=r
        clrb1[ yn2 ]=b

        Local xn1:Int=x*2

        If qt=0
            xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)         
          Else If qt=1
            xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)         
            xCanvas.SetImageDataPixel(imd, xn1,yn1+1, r, 0, b, 255)
          Else If qt=2
            xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, xn1+1,yn1 ,r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, xn1,yn1+1, r, 0, b, 255)         
          Else If qt=3
            xCanvas.SetImageDataPixel(imd, xn1,yn1, r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, xn1+1,yn1 ,r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, xn1,yn1+1, r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, xn1+1,yn1+1 ,r, 0, b, 255)
          Else If qt=4
            xCanvas.SetImageDataPixel(imd, x,y, r, 0, b, 255)
          Else If qt=5
            xCanvas.SetImageDataPixel(imd, x,y, r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, (x+319),y ,r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, x,(y+239), r, 0, b, 255)
            xCanvas.SetImageDataPixel(imd, (x+319),(y+239) ,r, 0, b, 255)
          Endif

Next
Next

    xCanvas.DrawImageData imd, 0, 0
    DrawText("Hit F1/F2 Change Qualtity-Size/Wide Screen: "+widetext+" "+qtext,10,440)
    DrawText("HTML5 Diffusion - Richard Betson, <a href="http://redeyeware.uphero.com" target="_blank">http://redeyeware.uphero.com</a> - FPS:"+fp,10,460)

  End Method

  Function LineB(x1,y1,x2,y2)
    'Ported
    'Bresenham Line Algorithm 
    'Source - GameDev.Net - Mark Feldman
    'Public Domain

    Local deltax = Abs(x2 - x1)
    Local deltay = Abs(y2 - y1) 

    Local numpixels,d,dinc1,dinc2,xinc1,xinc2,yinc1,yinc2,x,y,i

    If deltax >= deltay 
      numpixels = deltax + 1
      d = (2 * deltay) - deltax
      dinc1 = deltay Shl 1
      dinc2 = (deltay - deltax) Shl 1
      xinc1 = 1
      xinc2 = 1
      yinc1 = 0
      yinc2 = 1
    Else
      numpixels = deltay + 1
      d = (2 * deltax) - deltay
      dinc1 = deltax Shl 1
      dinc2 = (deltax - deltay) Shl 1
      xinc1 = 0
      xinc2 = 1
      yinc1 = 1
      yinc2 = 1
    Endif

    If x1 > x2
      xinc1 = -xinc1
      xinc2 = -xinc2
    Endif

    If y1 > y2
      yinc1 = -yinc1
      yinc2 = -yinc2

    Endif

    x = x1
    y = y1

    For i = 1 To numpixels 

      If d < 0
        d = d + dinc1
        x = x + xinc1
        y = y + yinc1
      Else
        d = d + dinc2
        x = x + xinc2
        y = y + yinc2
      Endif

      'Draw line 
      If x>xa And x<xb and="" y="">ya And y<yb clrr1="" 320="" y="0" x="0" endif="" next="" end="" function="" method="" setlookup="" local="" ang="0" for="" lui="0" to="" 4="" 240="" rad="" abs="" y-120="" if="">0
          rad= Sqrt(rad)
        Else
          rad=0
        Endif
        If rad=0 Then rad=1

        Local dx#=((x-160)/(rad))
        Local dy#=((y-120)/(rad))
        If lui=1
          rad= ( ( (  ((Sin(rad*.2)*29.5) ) * (  ((Cos(rad*.81)*9.5) ) ) ) )   )

          dx=(dx*Cos(ang) - dy*Sin(ang))
          dy=(dy*Cos(ang) + dx*Sin(ang))

          Local x1=Int(dx*rad)+(160)
          Local y1=Int(dy*rad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240
          If x1<1 then="" x1="" if="">320 Then x1=320

          mapx1[ ( 320 *y ) +x ] = ( 320 *y1 ) +x1'Int(x1)
        Endif

        If lui=2
          'Free Float
          ang=1
          rad= 1-( ( rad- (Sin(rad*900)*-Cos(rad*900)*.5 )*3.1415926 ) *  (-Cos((3.1415926) ) )*.9  )
          Local x1=Int(dx*rad)+(160)
          Local y1=Int(dy*rad)+(120)
          x1= ( x1*Cos(ang) - y1*Sin(ang) )
          y1= ( x1*Sin(ang) + y1*Cos(ang) )

          If y1<1 then="" y1="" if="">240 Then y1=240
          If x1<1 then="" x1="" if="">320 Then x1=320

          mapx2[ ( 320 *y ) +x ] = ( 320 *y1 ) +x1
        Endif

        If lui=3
          rad= rad-(  (Sin(rad*PI)*3)- ((Cos(rad*PI)*3) )  )

          dx=(dx*Cos(ang) - dy*Sin(ang))
          dy=(dy*Cos(ang) + dx*Sin(ang))

          Local x1=Int(dx*rad)+(160)
          Local y1=Int(dy*rad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240
          If x1<1 then="" x1="" if="">320 Then x1=320

          mapx3[ ( 320 *y ) +x ] = ( 320 *y1 ) +x1

        Endif
        If lui=0
          ang=-3

          Local yq:Int=y
          If yq<=120
          rad= rad-(  (Sin(yq))    )
          rad= rad-(  (Cos(yq)) )
          Else
          rad= rad-(  (Sin((240-yq)) )    )
          rad= rad-(  (Cos((240-yq)) )    )
          Endif

          dx=(dx*Cos(ang) - dy*Sin(ang))
          dy=(dy*Cos(ang) + dx*Sin(ang))

          Local x1=Int(dx*rad)+(160)
          Local y1=Int(dy*rad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240
          If x1<1 then="" x1="" if="">320 Then x1=320

          mapx[ ( 320 *y ) +x ] = ( 320 *y1 ) +x1

        Endif
        If lui=39
          'Orb
          rad= 2-( ( rad- (Sin(rad)*(Cos(rad)) )*3.1415926 ) *  (-Cos((3.1415926) ))*.97  )
          dx=(dx*Cos(ang) - dy*Sin(ang))
          dy=(dy*Cos(ang) + dx*Sin(ang))

          Local x1=Int(dx*rad)+(160)
          Local y1=Int(dy*rad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240
          If x1<1 then="" x1="" if="">320 Then x1=320

          mapx3[ ( 320 *y ) +x ] = ( 320 *y1 ) +x1
        Endif
        If lui=4
          'Swirl
           ang=-3
          rad= 1-( ( rad- (Sin(rad)*-Cos(rad)*.9 )*3.1415926 ) *  (-Cos((3.1415926) ) )*.9  )
          dx=(dx*Cos(ang) - dy*Sin(ang))
          dy=(dy*Cos(ang) + dx*Sin(ang))

          Local x1=Int(dx*rad)+(160)
          Local y1=Int(dy*rad)+(120)

          If y1<1 then="" y1="" if="">240 Then y1=240
          If x1<1 then="" x1="" if="">320 Then x1=320

          mapx4[ ( 320 *y ) +x ] = ( 320 *y1 ) +x1
      Endif

      Next
    Next
  Next

  End Method

End Class

Monkey: drawing a mosaic

Import mojo
Global sprite:MyApp

Function Main()
    sprite = New MyApp()
End Function

Class TColor
    Field r:Int,g:Int,b:Int
    Method Color()
        SetColor r,g,b
    End Method

    Method Set(rgb$)
        Self.r=255*(rgb[0]-48)/7
        Self.g=255*(rgb[1]-48)/7
        Self.b=255*(rgb[2]-48)/7
    End Method
End Class

Class MyApp Extends App
    Field pixel:Int[256]
    Field palette:TColor[16]

    Method OnCreate()
        SetUpdateRate 50

        For Local col:Int=0 To 15
            palette[col]=New TColor
            palette[col].Set "000333555777300520742764003025247467020040160370"[col*3..col*3+3]
        Next

        For Local t:Int=0 To 255
            pixel[t]=Rnd(16)
        Next
    End Method

    Method OnRender()
        Local i:Int
        For Local y:Int=0 To 15
            For Local x:Int=0 To 15
                palette[pixel[i]].Color
                DrawRect x*16,y*16,16,16
                i=i+1
            Next
        Next
    End Method

    Method OnUpdate()
    End Method
End Class

Monkey: drawing a starfield

Import mojo
Global stars:Starfield,mx:Float,my:Float

Function Main()
    stars = New Starfield()
End Function

Class TStar
    Field x:Float,y:Float,z:Float
    Method Init()
        x=Rnd(-100,100)
        y=Rnd(-100,100)
        z=Rnd(-100,100)
    End Method

    Method Update()
        z-=1
        x+=mx
        y+=my
        If z<=-100 z+=200
        If x<=-100 x+=200
        If y<=-100 y+=200
        If x>= 100 x-=200
        If y>= 100 y-=200
    End Method

    Method Draw()
        Local i:Int=z+121
        Local px:Int=x*450/(z+151)
        Local py:Int=y*350/(z+151)
        SetColor 255-i,255-i,255-i
        DrawRect 320+px,240+py,1,1
    End Method
End Class

Class Starfield Extends App
    Field star:TStar[1024]
    Method OnCreate()
        SetUpdateRate 50
        For Local t:Int=0 To star.Length-1
            star[t]=New TStar
            star[t].Init
        Next
    End Method

    Method OnUpdate()
        mx=(MouseX()-320)/50
        my=(MouseY()-240)/50
        For Local t:Int=0 To star.Length-1
            star[t].Update
        Next
    End Method

    Method OnRender()
        Cls 0,0,0
        For Local t:Int=0 To star.Length-1
            star[t].Draw
        Next
    End Method
End Class

Monkey: minimum base script for the diddy framework

Strict

Import mojo
Import diddy

Global titleScreen:TitleScreen

Function Main:Int()
        game = New MyGame()
        Return 0
End

Class MyGame Extends DiddyApp
        Method OnCreate:Int()
                Super.OnCreate()
                titleScreen = New TitleScreen
                titleScreen.PreStart()
                Return 0
        End
End

Class TitleScreen Extends Screen
        Method New()
                name = "Title"
        End

        Method Start:Void()
                game.screenFade.Start(50, false)
        End

        Method Render:Void()
                Cls
                DrawText "TITLE SCREEN!", SCREEN_WIDTH2, SCREEN_HEIGHT2, 0.5, 0.5
                DrawText "Click to Play!", SCREEN_WIDTH2, SCREEN_HEIGHT2 + 20, 0.5, 0.5
                DrawText "Escape to Quit!", SCREEN_WIDTH2, SCREEN_HEIGHT2 + 40, 0.5, 0.5
        End

        Method Update:Void()
                If KeyHit(KEY_ESCAPE)
                        game.screenFade.Start(50, true)
                        game.nextScreen = game.exitScreen
                End
        End
End

Monkey: class example with extends, implements and abstract

Strict

Import mojo

Interface IUpdateable
  Method OnUpdate:Int()
End

Interface IRenderable
  Method OnRender:Int()
End

Class AbstractEntity Abstract
  Global cw:Int
  Global ch:Int

  Method New (cw:Int, ch:Int)
    Self.cw = cw;
    Self.ch = ch;
  End

End

Class Ball Extends AbstractEntity Implements IUpdateable, IRenderable
  Field x:Int
  Field y:Int
  Field xs:Int
  Field ys:Int

  Method New ()
    Self.x = 0
    Self.y = 0
    Self.xs = 1
    Self.ys = 1
  End

  Method New (cw:Int, ch:Int)
    Super.New(cw, ch)
    Self.x = 0
    Self.y = 0
    Self.xs = 1
    Self.ys = 1
  End

  Method OnUpdate:Int()
    Self.x += xs
    Self.y += ys
    If Self.x > Self.cw-16 Or Self.x < 0
      Self.xs =- Self.xs
    End
    If Self.y > Self.ch-16 Or Self.y < 0
      Self.ys =- Self.ys
    End
    Return 0
  End

  Method OnRender:Int()
    DrawCircle Self.x, Self.y, 16
    Return 0
  End
End

Class Pad Extends AbstractEntity Implements IUpdateable, IRenderable
  Field x:Int
  Field y:Int
  Field xs:Int

  Method New ()
    Self.x = 0
    Self.y = ch - 16
    Self.xs = 1
  End

  Method New (cw:Int, ch:Int)
    Super.New(cw, ch)
    Self.x = 0
    Self.y = ch - 16
    Self.xs = 1
  End

  Method OnUpdate:Int()
    Self.x += xs
    If Self.x > Self.cw-64 Or Self.x < 0
      Self.xs =- Self.xs
    End
  Return 0
  End

  Method OnRender:Int()
    DrawRect Self.x, Self.y, 64, 8
  Return 0
  End
End

Class game Extends App

  Field ball:Ball
  Field pad:Pad

  Method OnCreate:Int()
    SetUpdateRate(60)
    ball = New Ball(DeviceWidth(), DeviceHeight())
    pad = New Pad()
    Return 0
  End

  Method OnUpdate:Int()
    ball.OnUpdate()
    pad.OnUpdate()
    Return 0
  End

  Method OnRender:Int()
    Cls 0,0,0
    ball.OnRender()
    pad.OnRender()
    Return 0
  End
End 

Function Main:Int()
  New game
  Return 0
End

Monkey: particle class

Import mojo

Class Particle
    Global ParticleList:List<particle> = New List<particle>
    Field x:Float,y:Float,a:Float = 1,r:Int
    Field ox:Int,oy:Int
    Field img:Image
    Field dx:Float,dy:Float, da:Float
    Field maxdistance:Int
    Field speed:Float
    Field dir:Int
    Field fade:Int
    Field z:Int

    Method Create:Particle(_x:Int, _y:Int, _img:Image, _dir:Int = 0, _speed:Float = 0, frames:Int = 1, _fade:Int = False, _autorot:Int = False, _z:Int = 0)
        ParticleList.AddLast(Self)
        z = _z
        x = _x
        y = _y
        ox = _x
        oy = _y
        img = _img
        speed = _speed
        dir = _dir
        dx = Sin(dir) * speed
        dy = -Cos(dir) * speed
        da = 1.0 / frames
        maxdistance = frames
        If dir And _autorot
            r = -dir - 180
        End If

        If _fade
            fade = True
        End If
    End Method

    Method Update()
        x+=dx
        y+=dy
        If fade a-=da

        maxdistance-=1
        If maxdistance <= 0 Or a <= 0
            Destroy()
        End If

        If x > VDeviceWidth() Or x < 0 - img.Width Or y > VDeviceHeight() Or y < 0 - img.Height
            Destroy()
        End If
    End Method
    Method Draw()
        SetAlpha a
        DrawImage img,x,y,r,1,1
        SetAlpha 1
    End Method

    Method SetPAlpha(alpha:Float)
        a = alpha
    End Method

    Method SetPRotation(rot:Int)
        r = rot
    End Method

    Method Destroy()
        ParticleList.Remove(Self)
    End Method

    Method AddX(_x:Int)
        x+= _x
    End Method

    Method AddY(_y:Int)
        y+= _y
    End Method

    Method SetDirection(_dir:Int)
        dir = _dir
    End Method

    Method SetSpeed(_speed:Float)
        speed = _speed
    End Method

End

Function ParticleExplosion(_x:Float, _y:Float, image:Image, n:Int, frames:Int, speed_multiplyer:Float = 0, ar:Int = False, _z:Int = 0)
    Local speed:Float

    For Local i:Int = 1 To n
        Local dir:Int = Rnd(0, 359)

        If speed_multiplyer
            speed = Rnd(0.08*speed_multiplyer, 1.5*speed_multiplyer)
        Else
            speed = Rnd(0.08, 1.5)
        End If

        Local part:Particle = New Particle()
        part.Create(_x, _y, image, dir, speed, frames - 10 + Rnd((frames*1.40)), True, ar, _z)
    Next

End Function

Function EmitParticle(_x:Float, _y:Float, image:Image, frames:Int, fade:Int = True, dir:Int = 0, speed:Float = 0, ar:Int = False, _z:Int = 0)

    Local part:Particle = New Particle()
    part.Create(_x, _y, image, dir, speed, frames, fade, ar, _z)

End Function

Function ParticleCount:Int()
    Return Particle.ParticleList.Count()
End Function

Function ClearParticles()
    Particle.ParticleList.Clear()
End Function

Function ClearParticlesZ(z:Int = 0)
    For Local delp:Particle = Eachin Particle.ParticleList
        If delp.z = z
            Particle.ParticleList.Remove(delp)
        End If
    Next
End Function

Function UpdateParticlesZ(z:Int = 0, forcex:Float = 0, forcey:Float = 0)   
    For Local UpdateP:Particle = Eachin Particle.ParticleList
        If UpdateP.z = z
            UpdateP.Update()
            If forcex UpdateP.x+=forcex
            If forcey UpdateP.y+=forcey
        End If
    Next
End Function
Function DrawParticlesZ(z:Int = 0) 
    For Local UpdateP:Particle = Eachin Particle.ParticleList
        If UpdateP.z = z
            UpdateP.Draw()
        End If
    Next
End Function