Thursday, July 28, 2016

Monkey-X - Dungeon/Cave Generator Rectangles - code example


Import mojo

Class tilemap    
    Field tilew:Int
    Field tileh:Int
    Field width:Int
    Field height:Int
    Field map:Int[][]
    Method New(width:Int,height:Int,tilew:Int,tileh:Int)
        Self.width=width
        Self.height=height
        Self.tilew=tilew
        Self.tileh=tileh
        map = New Int[width][]
        For Local i=0 Until width
            map[i] = New Int[height]
        Next
        makemap
        settiles
    End Method
    ' Here we create the walls
    Method settiles()
        'create walls
        For Local y=1 Until height-1
        For Local x=1 Until width-1
            Local t:Int=map[x][y]
            If t=0 And map[x+1][y] = 1 Then map[x][y] = 2
            If t=0 And map[x][y+1] = 1 Then map[x][y] = 2
            If t=0 And map[x-1][y] = 1 Then map[x][y] = 2
            If t=0 And map[x][y-1] = 1 Then map[x][y] = 2
        Next
        Next
        ' get corners
        For Local y=1 Until height-1
        For Local x=1 Until width-1
            Local t:Int=map[x][y]
            If t=0 And map[x+1][y] = 2 And map[x][y+1] = 2 Then map[x][y] = 3
            If t=0 And map[x-1][y] = 2 And map[x][y+1] = 2 Then map[x][y] = 3
            If t=0 And map[x][y-1] = 2 And map[x+1][y] = 2 Then map[x][y] = 3
            If t=0 And map[x-1][y] = 2 And map[x][y-1] = 2 Then map[x][y] = 3
        Next
        Next
        'set corners to value 2
        For Local y=1 Until height-1
        For Local x=1 Until width-1
            If map[x][y] = 3 Then map[x][y] = 2
        Next
        Next
    End Method
    Method makemap()
        'here we make random rectangles and see if they 
        'are placed next to another rectangle.
        'This will grow a random level...
        Local w1:Int=Rnd(1,4)
        Local h1:Int=Rnd(1,4)
        Local x1:Int=width/2
        Local y1:Int=height/2
        
        drawmaprect(x1,y1,w1,h1)
    
    
        Local maxrooms:Int=(width*height)/30
        Local numrooms:Int=0
        Local cnt:Int=0
        While numrooms < maxrooms And cnt<15000
            cnt+=1
            Local done:Bool=False
            w1=Rnd(1,4)
            h1=Rnd(1,4)
            x1=Rnd(3,width-5)
            y1=Rnd(3,height-5)
            'check right
            If map[x1][y1] = 1 And map[x1+1][y1] = 0 And map[x1+1][y1-2] = 0 And map[x1+1][y1+2] = 0 
                drawmaprect(x1,y1,w1,h1)
                numrooms+=1
                done=True
            End If
            'check bottom
            If done=False And map[x1][y1] = 1 And map[x1][y1+1] = 0 And map[x1-2][y1+1] = 0 And map[x1+2][y1+1] = 0
                drawmaprect(x1,y1,w1,h1)
                numrooms+=1
                done=True
            End If
            'check top
            If done=False And y1+h1<height-1
                If map[x1][y1+h1+1] = 1 And map[x1][y1+h1] = 0 And map[x1-2][y1+h1] = 0  And map[x1+2][y1+h1] = 0
                    drawmaprect(x1,y1,w1,h1)
                    numrooms+=1
                    done=True
                End If
            End If
            'check left
            If done=False And x1+w1<width-1
                If map[x1+w1+1][y1] = 1 And map[x1+w1][y1] = 0 And map[x1+w1][y1-2] = 0 And map[x1+w1][y1+2] = 0
                    drawmaprect(x1,y1,w1,h1)
                    numrooms+=1                    
                End If
            End If
        Wend

    End Method
    Method drawmaprect(x:Int,y:Int,w:Int,h:Int)
        For Local y1=y To y+h
        For Local x1=x To x+w
            If x1>-1 And y1>-1 And x1<width And y1<height
                map[x1][y1] = 1
            End If
        Next
        Next
    End Method
    Method draw()
        SetColor 255,255,255
        For Local y=0 Until height
        For Local x=0 Until width
            Local t:Int=map[x][y]
            Select t
                Case 1 'wall
                SetColor 100,100,100
                DrawRect x*tilew,y*tileh,tilew,tileh
                Case 2 'wall
                SetColor 200,200,200
                DrawRect x*tilew,y*tileh,tilew,tileh                
            End Select            
        Next
        Next
    End Method
End Class

Global m:tilemap

Class MyGame Extends App

    Method OnCreate()
        Seed = GetDate[5]
        SetUpdateRate(60)
        createrandommap()
    End Method
    Method OnUpdate()  
        If KeyHit(KEY_SPACE) Or MouseHit(MOUSE_LEFT)
            createrandommap()
        End If      
    End Method
    Method OnRender()
        Cls 0,0,0 
        m.draw
        SetColor 255,255,255
        DrawText "Press Space or Tab to create new level",0,0
    End Method
End Class

Function createrandommap()
    Local r:Int=Rnd(0,3)
    Local w:Int,h:Int,tw:Int,th:Int
    Select r
    Case 0 
        w=20;h=15;tw=32;th=32
    Case 1 
        w=20*2;h=15*2;tw=16;th=16
    Case 2 
        w=20*4;h=15*4;tw=8;th=8
    End Select
    m = New tilemap(w,h,tw,th)
End Function

Function Main()
    New MyGame()
End Function

Wednesday, July 20, 2016

Monkey-X - Grey Rnd Poly grid backgrounds - code example


Import mojo

Class gridbackground
    Field mapwidth:Int
    Field mapheight:Int
    Field tilewidth:Float
    Field tileheight:Float
    Field mapdepth:Int
    Field mapx:Float[][]
    Field mapy:Float[][]
    Method New(mapwidth:Int,mapheight:Int)
        Self.mapwidth = mapwidth
        Self.mapheight = mapheight
        tilewidth = DeviceWidth()/Float(mapwidth)
        tileheight = DeviceHeight()/Float(mapheight)
        mapx = New Float[mapwidth][]
        mapy = New Float[mapwidth][]
        For Local i = 0 Until mapwidth
            mapx[i] = New Float[mapheight]
            mapy[i] = New float[mapheight]
        Next 
        makegrid    
    End Method
    Method makegrid()
        For Local y=0 Until mapheight
        For Local x=0 Until mapwidth
            mapx[x][y] = x*tilewidth + Rnd(-tilewidth/3,tilewidth/3)
            mapy[x][y] = y*tileheight + Rnd(-tileheight/3,tileheight/3)
        Next
        Next
    End Method
    Method draw()
        For Local y=0 Until mapheight-1
        For Local x=0 Until mapwidth-1
            Local pol:Float[8]
            pol[0] = mapx[x][y]
            pol[1] = mapy[x][y]
            pol[2] = mapx[x+1][y]
            pol[3] = mapy[x+1][y]
            pol[4] = mapx[x+1][y+1]
            pol[5] = mapy[x+1][y+1]
            pol[6] = mapx[x][y+1]
            pol[7] = mapy[x][y+1]
            Local a:Int=Rnd(0,256)
            SetColor a,a,a
            DrawPoly pol
        Next
        Next    
    End Method
End Class

Global mygbg:gridbackground

Class MyGame Extends App
    
    Method OnCreate()
        SetUpdateRate(1)
        mygbg = New gridbackground(25,25)
    End Method
    Method OnUpdate() 
        mygbg = New gridbackground(Rnd(10,30),Rnd(10,30))       
    End Method
    Method OnRender()
        Cls 0,0,0 
        SetColor 255,255,255
        mygbg.draw
    End Method
End Class


Function Main()
    New MyGame()
End Function

Tuesday, July 19, 2016

Monkey-X - Beginners - Sorting IntLists - code example


Import mojo

Class MyGame Extends App

    Field mylist1:List<Int> = New IntList
    Field mylist2:List<Int> = New IntList
    
    Method OnCreate()
        SetUpdateRate(60)
        mylist1.AddLast(10)
        mylist1.AddLast(50)
        mylist1.AddLast(1)                
        mylist1.AddLast(31)
        mylist1.AddLast(93)
        mylist1.AddLast(12)
        'sort low>hight
        mylist1.Sort()
        'list 2
        mylist2.AddLast(10)
        mylist2.AddLast(50)
        mylist2.AddLast(1)                
        mylist2.AddLast(31)
        mylist2.AddLast(93)
        mylist2.AddLast(12)
        'sort high>low
        mylist2.Sort(False)

    End Method
    Method OnUpdate()        
    End Method
    Method OnRender()
        Cls 0,0,0 
        SetColor 255,255,255
        DrawText "Sorting Lists",0,0
        Local cnt:Int=0
        For Local i:=Eachin mylist1
            DrawText i,10,cnt*10+50
            cnt+=1
        Next
        cnt=0
        For Local i:=Eachin mylist2
            DrawText i,200,cnt*10+50
            cnt+=1
        Next
    End Method
End Class


Function Main()
    New MyGame()
End Function

Monkey-X - Beginners - Sorting StringLists - code example


Import mojo

Class MyGame Extends App

    Field mylist1:List<String> = New StringList
    Field mylist2:List<String> = New StringList
    
    Method OnCreate()
        SetUpdateRate(60)
        mylist1.AddLast("hello")
        mylist1.AddLast("this")
        mylist1.AddLast("is")                
        mylist1.AddLast("a")
        mylist1.AddLast("test")
        mylist1.AddLast("mkay")
        'sort alphabetically
        mylist1.Sort()
        'list 2
        mylist2.AddLast("hello")
        mylist2.AddLast("this")
        mylist2.AddLast("is")                
        mylist2.AddLast("a")
        mylist2.AddLast("test")
        mylist2.AddLast("mkay")
        'sort reversed alhabetically
        mylist2.Sort(False)

    End Method
    Method OnUpdate()        
    End Method
    Method OnRender()
        Cls 0,0,0 
        SetColor 255,255,255
        DrawText "Sorting Lists",0,0
        Local cnt:Int=0
        For Local i:=Eachin mylist1
            DrawText i,10,cnt*10+50
            cnt+=1
        Next
        cnt=0
        For Local i:=Eachin mylist2
            DrawText i,200,cnt*10+50
            cnt+=1
        Next
    End Method
End Class


Function Main()
    New MyGame()
End Function

Monday, July 18, 2016

Monkey-X - Beginners - SetScissor - code example


Import mojo

Class MyGame Extends App

    Method OnCreate()
        SetUpdateRate(60)
    End Method
    Method OnUpdate()        
    End Method
    Method OnRender()
        Cls 0,0,0 
        SetColor 255,255,255
        DrawText "SetScissor Example (x,y,w,h)",10,10
        ' SetScissor x,y,w,h
        SetScissor(50,50,640-100,480-100)
        ' Here we draw a image on the entire screen
        ' and that will only be drawn inside the 
        ' scissor area.
        SetColor 50,20,0
        Local cx:Float=320
           Local cy:Float=240
        For Local angle=0 Until 360-10 Step 32
            Local x1:Float=cx+Cos(angle)*640
            Local y1:Float=cy+Sin(angle)*480
            Local x2:Float=cx+Cos(angle+10)*640
            Local y2:Float=cy+Sin(angle+10)*480
            DrawPoly([cx,cy,x1,y1,x2,y2])
        Next
        
    End Method
End Class


Function Main()
    New MyGame()
End function

Sunday, July 17, 2016

Monkey-X - Point in Triangle 2D - code example


Import mojo

Class MyGame Extends App

    ' set up the triangle
    Field x1:Float=100
    Field y1:Float=100
    Field x2:Float=100
    Field y2:Float=200
    Field x3:Float=200
    Field y3:Float=100
    ' collision info
    Field col:String
    
    Method OnCreate()
        SetUpdateRate(60)
    End Method
    Method OnUpdate()        
        If pointintriangle2d(MouseX(),MouseY(),x1,y1,x2,y2,x3,y3)
            col="Collision"
        Else
            col="No Collision"
        End If
    End Method
    Method OnRender()
        Cls 0,0,0 
        SetColor 255,255,255
        DrawPoly([x1,y1,x2,y2,x3,y3])
        DrawText col,0,0
    End Method
End Class

' by RaGR (Ralph G. Roeske). from blitzbasic.com
Function pointintriangle2d(px:Float,pz:Float, x1:Float,y1:Float,x2:Float,y2:Float,x3:Float,y3:Float) 
    Local bc:Float,ca:Float,ab:Float,ap:Float,bp:Float,cp:Float,abc:Float
    bc = x2*y3 - y2*x3 
    ca = x3*y1 - y3*x1 
    ab = x1*y2 - y1*x2
    ap = x1*pz - y1*px
    bp = x2*pz - y2*px
    cp = x3*pz - y3*px
    abc = Sgn(bc + ca + ab)
    If (abc*(bc-bp+cp)>=0) And (abc*(ca-cp+ap)>=0) And (abc*(ab-ap+bp)>=0) Return True
End Function

Function Main()
    New MyGame()
End Function

Sunday, May 22, 2016

Monkey-X - Grey Background Image Generator - code example


Import mojo

Class themap
    Field mapwidth:Int
    Field mapheight:Int
    Field tilewidth:Float
    Field tileheight:Float
    Field map:Float[][]
    Method New(    mapwidth:Int,
                mapheight:Int,
                numpoints:Int)
        Self.mapwidth = mapwidth
        Self.mapheight = mapheight
        tilewidth = DeviceWidth()/Float(mapwidth)
        tileheight = DeviceHeight()/Float(mapheight)
        map = New Float[mapwidth][]
        For Local i = 0 Until mapwidth
            map[i] = New Float[mapheight]
        Next
        addheightmappoints(numpoints)
        For Local i=0 Until numpoints
        expandheightmap
        Next
        dripmap()
        darken()
        blur()
    End Method
    Method blur()
        For Local i=0 Until 50000
            Local x:Int=Rnd(0,mapwidth)
            Local y:Int=Rnd(0,mapheight)
            If x+1<mapwidth-1
            If y+1<mapheight-1
            Local a=map[x+1][y]
            Local b=map[x][y+1]
            Local c=map[x+1][y+1]
            map[x][y] = (a+b+c)/3
            End If
            End If
        Next
    End Method
    Method darken()
        For Local x=0 Until mapwidth
        For Local y=0 Until mapheight
            If map[x][y]>40
                map[x][y] = map[x][y]/2
            End If
        Next
        Next
    End Method
    Method dripmap()
        For Local x=0 Until mapwidth
            Local dp:Int=Rnd(2,6)
            For Local do = 0 Until dp
            For Local y=mapheight-1 Until 1 Step -1
                   map[x][y] = map[x][y-1]
            Next
            Next
        Next
    End Method
    Method expandheightmap()
        Local stp:Int=Rnd(150000,250000)
        For Local n=0 To stp
            Local x1:Int=Rnd(1,mapwidth-1)
            Local y1:Int=Rnd(1,mapheight-1)
            If map[x1][y1] > 0
                For Local y2=y1-1 To y1+1
                For Local x2=x1-1 To x1+1
                    If map[x1][y1] > map[x2][y2]
                        map[x2][y2] = 
                                        (map[x1][y1]+
                                        map[x2][y2])*Rnd(0.49,0.5)
                    End If
                Next
                Next 
            End If
        Next
    End Method
    Method addheightmappoints(count:Int)
        For Local i=0 Until count
            Local x:Int=Rnd(    mapwidth/(i+1),
                                mapwidth-1)
            Local y:Int=Rnd(    0,
                                mapheight/2)
            map[x][y] = Rnd(64,200)
        Next
    End Method
    Method drawmap()
        For Local y:Float=0 Until mapheight Step 1
        For Local x:Float=0 Until mapwidth Step 1
            SetColor map[x][y],map[x][y],map[x][y]
            DrawRect     x*tilewidth,
                        y*tileheight,
                        tilewidth+1,
                        tileheight+1
        Next
        Next
    End Method
    Method clearheightmap()
    End Method
End Class

Global mymap:themap 

Class MyGame Extends App

    Method OnCreate()
        SetUpdateRate(1)
        Local date := GetDate()
        Seed = date[5]        
        mymap = New themap( 200,
                            150,
                            5)
    End Method
    Method OnUpdate()  
    mymap = New themap(200,150,5)      
    End Method
    Method OnRender()
        Cls 40,40,40 
        mymap.drawmap
        SetColor 255,255,255
        DrawText    "MonkeyX",
                    (DeviceWidth()/2),10,.5,.5
        DrawText     "Background",
                    (DeviceWidth()/2),25,.5,.5
    End Method
End Class


Function Main()
    New MyGame()
End Function