Pardon the mess, Play My Code is in beta!

READY TO PLAY?
CLICK TO LOG IN!

sign up - lost password

Jumper »

You do not own this project, so changes will not be saved

/* Created by Lucas Short
 * 2011.07.14
 * play, learn, love
 */
$state = :reset //Reset state initializes all the classes

onEachFrame() do
    if $state == :reset then reset()         end
    if $state == :intro then $intro.update() end
    if $state == :game  then $game.update()  end
end

def reset()
    $intro = new Intro()
    $game = new Game()
    $controls = getControls()
    $state = :intro //The state the game will start in
end    

def echo(txt,x,y)
    setColor(0,0,0){fillText(txt,x+1,y+1)}
    fillText(txt,x,y)
end

def echo(txt,x,y,s)
    setColor(0,0,0){fillText(txt,x+s,y+s)}
    fillText(txt,x,y)
end

class Intro
    def new()
        @fade = 0.015
        @alpha = 0
        @logo = new image("maclizard.png")
    end
    def update()
        fill(0,0,0)
        @alpha = @alpha + @fade
        setColor(255,255,255,@alpha)
        drawImage(@logo,130,160)
        setFont("Arial", 45){fillText("lgshort.com",210,170)}
        setFont("Monospace", 16) {fillText("powered by PlayMyCode.com",350,350)}
        if @alpha > 1.25 then @fade = -0.015 elseif @alpha < 0 then setColor(255,255,255); $state = :game end
    end
end

class Game
    def new()
        @state = :title
        @bgColor = [0,0,0]
        @fill = [0,0,0]
        @drawType = :fade
        @alpha = 1
        @score = 0
        @level = 1
        @steps = 3000
        @player = new Player()
        @block = []
        @block[0] = new Block(0,350,620,70,0)
        @blockTrigger = 0
        @blockGarbage = []
        @token = []
        @tokenTrigger = 0
        @tokenGarbage = []
        @monster = []
        @monsterTrigger = 0
        @monsterGarbage = []
        @monsterMAX = 4
        @sound = [new Sound("007.mp3"), new Sound("004.mp3"), new Sound("005.mp3"), new Sound("006.mp3")]
        @sound[0].play()
        @sound[0].setRepeating(true)
        @sound[1].setRepeating(true)
        end
    def update()
        draw()
        //Process gravity effect on Tokens
        @token.length().times() do |j|
            if @token[j].gravity() > 0
                @block.length().times() do |i|
                    if isRectOverlap(@token[j].X(),@token[j].Y()+1,@token[j].diameter(),@token[j].diameter(),@block[i].X(),@block[i].Y(),@block[i].width(),@block[i].height()) == true
                        @token[j].gravity(0)
                        @token[j].Y(@block[i].Y()-@token[j].diameter())
                    end
                end
            end
        end
        
        //Process gravity effect on Monsters
        @monster.length().times() do |j|
            if @monster[j].gravity() > 0
                @block.length().times() do |i|
                    if isRectOverlap(@monster[j].X(),@monster[j].Y()+1,@monster[j].width(),@monster[j].height(),@block[i].X(),@block[i].Y(),@block[i].width(),@block[i].height()) == true
                        @monster[j].gravity(0)
                        @monster[j].Y(@block[i].Y()-@monster[j].height())
                    end
                end
            end
        end
        
        //Process gravity effect on the Player
        if @player.gravity() > 0
            @block.length().times() do |i|
                if isRectOverlap(@player.X(),@player.Y()+@player.height(),@player.width(),3,@block[i].X(),@block[i].Y(),@block[i].width(),@block[i].height()) == true
                    @player.gravity(0)
                    @player.Y(@block[i].Y()-@player.height())
                end
            end
        end
        
        //Process block movement
        @block.length().times() do |i|
            @block[i].update()
            if @block[i].gone() == true
                @blockGarbage[@blockGarbage.length()] = i
            end
            @block[i].draw(@bgColor)
        end
        //Destroy blocks that have left the screen
        @blockGarbage.length().times() do |i|
            @block.deleteAt(@blockGarbage[i])
        end
        @blockGarbage = []

        //Process token interaction with Player
        @token.length().times() do |i|
            if isRectOverlap(@player.X(),@player.Y(),@player.width(),@player.height(),@token[i].X(),@token[i].Y(),@token[i].diameter(),@token[i].diameter()) == true
                @bgColor[0] = @bgColor[0] + @token[i].red()*0.01
                @bgColor[1] = @bgColor[1] + @token[i].green()*0.01
                @bgColor[2] = @bgColor[2] + @token[i].blue()*0.01
                @tokenGarbage[@tokenGarbage.length()] = i
                @score = @score + 1
            end
        end
        //Process token movement
        @token.length().times() do |i|
            @token[i].update()
            if @token[i].gone() == true
                @tokenGarbage[@tokenGarbage.length()] = i
            end
            @token[i].draw()
        end
        //Destroy tokens that have left the screen
        @tokenGarbage.length().times() do |i|
            @token.deleteAt(@tokenGarbage[i])
        end
        @tokenGarbage = []

        //Process monster interaction with the Player
        @monster.length().times() do |i|
            if isRectOverlap(@player.X()+3,@player.Y()+5,@player.width()-6,@player.height()-10,@monster[i].X(),@monster[i].Y(),@monster[i].width(),@monster[i].height()) == true
                @monsterGarbage[@monsterGarbage.length()] = i
                @player.life(-1)
                if @player.life() < 1
                    @alpha = 1
                    @drawType = :fill
                    @state = :gameover
                end
            end
        end
        //Process monster movement
        @monster.length().times() do |i|
            @monster[i].update()
            if @monster[i].gone() == true
                @monsterGarbage[@monsterGarbage.length()] = i
            end
            @monster[i].draw()
        end
        //Destroy monsters that have left the screen
        @monsterGarbage.length().times() do |i|
            @monster.deleteAt(@monsterGarbage[i])
        end
        @monsterGarbage = []

        @player.draw()
        if @state == :title
            @alpha = 1
            @player.update()
            setFont("Arial", 65){echo("Jumper",195,130,3)}
            setFont("Arial", 14){
                echo("Use arrow keys",250,205)
                echo("UP: Jump up", 260,230)
                echo("LEFT: Move left", 243,245)
                echo("RIGHT: Move Right", 236,260)
            }
            setFont("Arial", 25, "bold"){echo("Press 'ENTER' to start", 160,360)}
            if $controls.isKeyPressed('enter') == true then @state = :play end
        else if @state == :play
            @player.update()
            if @blockTrigger < (new time()).toMilliseconds() and @block.length() < 20
                @blockTrigger = (new time()).toMilliseconds()+(2000-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000)
                if (@blockTrigger-(new time()).toMilliseconds()) < 500 then @blockTrigger = 500 end
                bw = rand(50,200)-(@bgColor[0]+@bgColor[1]+@bgColor[2])*10
                if bw < 50 then bw = 50 end
                @block[@block.length()] = new Block(600,rand(1,4).round()*70,bw,20,4)
            end
            if @tokenTrigger < (new time()).toMilliseconds()
                @tokenTrigger = (new time()).toMilliseconds()+(@steps-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000)
                @token[@token.length()] = new Token(rand(1,5).round()*100,rand(1,4).round()*70,30,rand(-3,5),[rand(100,255).round(),rand(0,100).round(),rand(50,150).round()])
            end
            if @monsterTrigger < (new time()).toMilliseconds() and @monster.length() < @monsterMAX
                @monsterTrigger = (new time()).toMilliseconds()+(@steps-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000)
                @monster[@monster.length()] = new Monster(rand(0,1).round()*590,rand(0,3).round()*100,32,32,rand(3,5),[rand(0,255).round(),rand(0,255).round(),rand(0,255).round()])
            end
            if (@steps-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000) < 800
                @monsterMAX = 0
                @sound[1].play()
                vol = @sound[0].getVolume()
                if vol > 0
                    @sound[0].setVolume(vol-0.01)
                else if @sound[0].isPlaying() == true
                    @sound[0].stop()
                end
            end
            if (@steps-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000) < 300
                @drawType = :fade
                @alpha = @alpha - 0.005
            end
            if (@steps-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000) < 0
                @drawType = :fade
                @alpha = @alpha - 0.005
                @sound[2].play()
                vol = @sound[1].getVolume()
                if vol > 0
                    @sound[1].setVolume(vol-0.05)
                else if @sound[1].isPlaying() == true
                    @sound[1].stop()
                end
            end
            if (@steps-(@bgColor[0]+@bgColor[1]+@bgColor[2])*1000) < -1000
                @fill = [255,255,255]
                @state = :next
            end
            if @alpha < 0.2 then @alpha = 0.2 end
            setFont("Arial", 25, "bold"){echo("Level: "+@level, 10,360)}
            setFont("Arial", 25, "bold"){echo("Score: "+@score, 140,360)}
            setFont("Arial", 25, "bold"){echo("Life: ", 400,360)}
            setColor(0,100,250){fillRect(470,360,@player.life()*10,25)}
        else if @state == :next
            @player.update()
            if @token.length() < 1
                @drawType = :fill
                if @fill[0] > 0
                    @fill = [@fill[0]-5,@fill[1]-5,@fill[2]-5]
                    @sound[3].play()
                    if @sound[2].isPlaying() == true
                        @sound[2].stop()
                    end
                end
            end
            if @fill[0] < 1
                setFont("Arial",55,"bold"){echo("Level Complete!",120,100,2)}
                setFont("Arial", 25, "bold"){echo(" Score: "+@score,170,160)}
                setFont("Arial", 25, "bold"){echo("Press 'ENTER' for next level", 125,360)}
                if $controls.isKeyPressed('enter') == true
                    @state = :play 
                    @drawType = :fade
                    @alpha = 1
                    @monsterMAX = @level*4
                    @bgColor = [0,0,0]
                    @fill = [0,0,0]
                    @steps = @steps + 500
                    @bgColor[rand(0,2).round()] = @level*0.2
                    @level = @level + 1
                    @sound[0].setVolume(1)
                    @sound[1].setVolume(1)
                    @sound[0].play()
                end
            else
                setFont("Arial", 25, "bold"){echo("Level: "+@level, 10,360)}
                setFont("Arial", 25, "bold"){echo("Score: "+@score, 140,360)}
                setFont("Arial", 25, "bold"){echo("Life: ", 400,360)}
                setColor(0,100,250){fillRect(470,360,@player.life()*10,25)}
            end
        else if @state == :gameover
            if @alpha > 0.4
                @alpha = @alpha - 0.05 
            else
                setFont("Arial", 55, "bold"){echo("Game Over",150,100,2)}
                setFont("Arial", 25, "bold"){echo("Final Score: "+@score,170,160)}
                setFont("Arial", 25, "bold"){echo("Press 'ENTER' to play again", 135,360)}
                if $controls.isKeyPressed('enter') == true 
                    $state = :reset 
                    @sound.length().times() do |i|
                        @sound[i].stop()
                    end
                end
            end
        end
    end
    def draw()
        if @drawType == :fill
            fill(@fill[0],@fill[1],@fill[2])
        end
        11.times() do |i|
            setColor(@bgcolor[0]*(i+1)*25,@bgcolor[1]*(i+1)*25,(i+1)*25,@alpha){fillRect(0,-13+(i*33),620,33)}
        end
        setColor(@bgcolor[0]*200,200,@bgcolor[2]*200,@alpha){fillRect(0,350,620,70)}
    end
end

class Player
    def new()
        @x = 0
        @y = 0
        @width = 32
        @height = 48
        @frame = 0
        @speed = [0,3]
        @gravity = 0
        @images =[new image("player01.png"), new image("player02.png")]
        @life = 15
    end
    def X()
        return @x
    end
    def Y()
        return @y
    end
    def Y(i)
        @y = i
    end
    def width()
        return @width
    end
    def height()
        return @height
    end 
    def gravity()
        return @gravity
    end
    def gravity(i)
        @gravity = i
    end
    def life()
        return @life
    end
    def life(i)
        @life = @life + i
    end
    def update()
        @y = @y + @gravity
        if @speed[0]>@speed[1] and @gravity == 0
            @frame = 1 - @frame
            @speed[0] = 0
        end
        if @gravity != 0
            @frame = 1
        end
        @speed[1] = 3
        if $controls.isKeyDown('left') == true 
            if @x > 10
                @x = @x - 6 
            end
            @speed[1] = 5
        end
        if $controls.isKeyDown('right') == true
            if @x < 550
                @x = @x + 6 
            end
            @speed[1] = 1
        end
        if $controls.isKeyPressed('up') == true
            if @gravity == 0
                @gravity = @gravity - 12
            end
        end
        @speed[0] = @speed[0] + 1
        @gravity = @gravity + 0.6
        if @gravity > 9 then @gravity = 9 end
    end
    def draw()
        drawImage(@images[@frame],@x,@y)
    end
end

class Monster
    def new(x,y,width,height,movement,color)
        @x = x
        @y = y
        @width = width
        @height = height
        @movement = movement
        @color = color
        @frame = 0
        @speed = [0,3]
        @gravity = 0
        if @x > 100
            @movement = (-1)*@movement
            @images = [new image("monster03.png"), new image("monster04.png")]
        else
            @images = [new image("monster01.png"), new image("monster02.png")]
        end
    end
    def X()
        return @x
    end
    def Y()
        return @y
    end
    def Y(i)
        @y = i
    end
    def width()
        return @width
    end
    def height()
        return @height
    end 
    def gravity()
        return @gravity
    end
    def gravity(i)
        @gravity = i
    end
    def gone()
        if @x + @width < 0
            return true
        end
        if @x > 600
            return true
        end
        return false
    end
    def update()
        @y = @y + @gravity
        @x = @x + @movement
        if @speed[0]>@speed[1] and @gravity == 0
            @frame = 1 - @frame 
            @speed[0] = 0
        end
        @speed[0] = @speed[0] + 1
        @gravity = @gravity + 0.6
        if @gravity > 9 then @gravity = 9 end
    end
    def draw()
        setColor(@color[0],@color[1],@color[2]){drawImage(@images[@frame],@x,@y)}
    end
end

class Block
    def new(x,y,width,height,speed)
        @x = x
        @y = y
        @width = width
        @height = height
        @speed = speed
    end
    def X()
        return @x
    end
    def Y()
        return @y
    end
    def width()
        return @width
    end
    def height()
        return @height
    end 
    def update()
        @x = @x - @speed
    end
    def draw(arr)
        setColor(arr[0]*200,200,arr[2]*200){fillRect(@x,@y,@width,@height)}
    end
    def gone()
        if @x + @width < 0
            return true
        end
        return false
    end
end

class Token
    def new(x,y,diameter,speed,color)
        @x = x
        @y = y
        @diameter = diameter
        @speed = speed
        @color = color
        @gravity = 0
    end
    def X()
        return @x
    end
    def Y()
        return @y
    end
    def Y(i)
        @y = i
    end
    def diameter()
        return @diameter
    end
    def update()
        @y = @y + @gravity
        @x = @x - @speed
        @gravity = @gravity + 0.6
        if @gravity > 9 then @gravity = 9 end
    end
    def red()
        return (@color[0]/100).round()
    end
    def green()
        return (@color[1]/100).round()
    end
    def blue()
        return (@color[2]/100).round()
    end
    def gravity()
        return @gravity
    end
    def gravity(i)
        @gravity = i
    end
    def draw()
        setColor(@color[0],@color[1],@color[2]){fillCircle(@x,@y,@diameter)}
    end
    def gone()
        if @x + @diameter < 0
            return true
        end
        if @x > 600
            return true
        end
        return false
    end
end

class Sounds
    def new(arr)
        @sounds = []
        @fade = false
        @looop = false
        @playlist = []
        @playingList = false
        @fps = 1
        @fps_data = []
        arr.length().times() do |i|
            @sounds[i] = new Sound(arr[i])
        end
    end
    def add(i)
        @playlist[@playlist.length()] = i
        stoplist(:loop)
        @playingList = true
    end
    def play(i)
        @sounds[i].play()
    end
    def play(i,l)
        @sounds[i].play()
        if l == :loop
            @sounds[i].setRepeating(true)
        end
    end
    def playlist()
        @playlist.length().times() do |i|
            @sounds[@playlist[i]].play()
        end
    end
    def playlist(j)
        @playlist.length().times() do |i|
            @sounds[@playlist[i]].play()
            if j == :loop
                @sounds[@playlist[i]].setRepeating(true)
                @looop = true
            end
        end
    end
    def stop(i)
        @sounds[i].stop()
    end
    def stoplist()
        @playlist.length().times() do |i|
            @sounds[@playlist[i]].stop()
        end
        @playingList = false
    end
    def stoplist(j)
        @playlist.length().times() do |i|
            if j == :loop
                @sounds[@playlist[i]].setRepeating(false)
            else if j == :fade
                @sounds[@playlist[i]].setRepeating(false)
                @fade = true
            end
        end
        @playingList = false
    end
    def clearlist()
        @playlist = []
    end
    def update()
        echo(@playlist.length(),0,0)
        echo(@fps,0,50)
        if @fade == true
            @playlist.length().times() do |i|
                @sounds[@playlist[i]].setVolume(@sounds[@playlist[i]].getVolume()-(1/(@fps*(@sounds[@playlist[i]].getDurationLeft()/1000))))
            end
        end
        if isPlaying() == false
                playlist(:loop)
        end
        @fps_data[0] = (new time()).seconds()
        if @fps_data[0] != @fps_data[1]
            @fps = @fps_data[2]
            @fps_data[2] = 0
            @fps_data[1] = @fps_data[0]
        end
        @fps_data[2] = @fps_data[2]+1
    end
        
    def isPlaying()
        @playlist.length().times() do |i|
            if @sounds[@playlist[i]].isPlaying() == true
                return true
            end
            return false
        end
    end
end

ERRORS

YOUR BROWSER DOES NOT SUPPORT HTML5!

Please use one of these instead

Our games cannot run in your browser