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
- ▶Language Reference
- ▶Core
- ▶Graphics
- ▶Image Class
- new
- clear
- clearTransforms
- clone
- drawCircle
- drawEllipse
- drawImage
- drawInnerSegment
- drawLine
- drawPixel
- drawPolygon
- drawRect
- drawRotatedImage
- drawRoundedRect
- drawSegment
- drawText
- fill
- fillCircle
- fillEllipse
- fillInnerSegment
- fillPolygon
- fillRect
- fillRoundedRect
- fillSegment
- fillText
- getAlpha
- getBlue
- getColors
- getGreen
- getHeight
- getPixel
- getPixelAlpha
- getPixelBlue
- getPixelGreen
- getPixelRed
- getRed
- getWidth
- isOverlap
- isPixelOverlap
- multAlpha
- rotate
- scale
- setAlpha
- setBlend
- setColor
- setFont
- setPixel
- setTransform
- size
- transform
- translate
- undoTransform
- ▶Transformations
- How Alignment Works
- Using Colors
- drawCircle
- drawEllipse
- drawImage
- drawInnerSegment
- drawLine
- drawPixel
- drawPolygon
- drawRect
- drawRotatedImage
- drawRoundedRect
- drawSegment
- drawText
- fill
- fillCircle
- fillEllipse
- fillInnerSegment
- fillPolygon
- fillRect
- fillRoundedRect
- fillSegment
- fillText
- getAlpha
- getBlue
- getColors
- getGreen
- getRed
- multAlpha
- setAlpha
- setBlend
- setColor
- setFont
- ▶Image Class
- ▶Audio
- ▶Controls
- ▶Collisions
- ▶Utility
- ▶Debugging
