batman = { states = {IDLE=1, WALK=2, JUMP=3, FALL=4, FALLTHROUGH=5, STAIRS_IDLE=6, STAIRS_MOVING=7}, x = 7*8, y = 14*8, surface = nil, flip = false, frames = {0}, frame = 1, state = 1, jump_counter = 0, ignore_first_tile = 0, init = function() batman.surface = surf.load("batman.gif") batman.frames = {0,1,2,3} end, draw = function() surf.source(batman.surface) local f = batman.frames[batman.frame] draw.surf((f%8)*16,(f//8)*16,16,16,batman.x,batman.y,16,16,batman.flip) local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) draw.rect((tx1)*8,ty*8,8,8, 4) draw.rect((tx2)*8,ty*8,8,8, 4) end, update = function() batman.frame = batman.frame + 1 if batman.frame > #batman.frames then batman.frame = 1 end -- Si està IDLE if batman.state == batman.states.IDLE then -- Mirem si comença a caminar if key.down(key.RIGHT) then batman.state = batman.states.WALK batman.frames = {0,1,2,3} batman.frame = 1 elseif key.down(key.LEFT) then batman.state = batman.states.WALK batman.frames = {0,1,2,3} batman.frame = 1 elseif key.down(key.DOWN) then local tx, ty = ((batman.x+4)//8), ((batman.y+8)//8) if (mapa.isStairs(tx,ty)) then batman.state = batman.states.STAIRS_IDLE batman.frames = {10} batman.frame = 1 batman.x = ((batman.x+4)//8)*8 if (mapa.isStairs(tx-1,ty)) then batman.x = batman.x - 8 end elseif key.down(key.X) then local tx, ty = ((batman.x+4)//8), ((batman.y+24)//8) if (not mapa.isSolid(tx,ty)) then batman.state = batman.states.FALL batman.ignore_first_tile = 4 end end elseif key.down(key.UP) then local tx, ty = ((batman.x+4)//8), ((batman.y)//8) if (mapa.isStairs(tx,ty)) then batman.state = batman.states.STAIRS_IDLE batman.frames = {10} batman.frame = 1 --batman.x = (batman.x//8)*8 batman.x = ((batman.x+4)//8)*8 if (mapa.isStairs(tx-1,ty)) then batman.x = batman.x - 8 end end end -- Mirem si ha de caure local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) if (not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty)) then batman.state = batman.states.FALL end -- Mirem si comença a botar if (batman.state ~= batman.states.FALL) and (key.down(key.X)) then batman.state = batman.states.JUMP batman.jump_counter = 0 end end if batman.state == batman.states.WALK then -- Mirem si comença a caminar if key.down(key.RIGHT) then batman.state = batman.states.WALK batman.flip=false local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8) if not mapa.isSolid(tx,ty) then batman.x = batman.x + 2 end elseif key.down(key.LEFT) then batman.state = batman.states.WALK batman.flip=true local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8) if not mapa.isSolid(tx,ty) then batman.x = batman.x - 2 end else -- Ha parat de caminar batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end -- Mirem si ha de caure local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) if (not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty)) then batman.state = batman.states.FALL end -- Mirem si comença a botar if key.down(key.X) then batman.state = batman.states.JUMP batman.jump_counter = 0 end end if batman.state == batman.states.JUMP then batman.y = batman.y - 4 batman.jump_counter = batman.jump_counter + 1 if batman.jump_counter == 5 then batman.jump_counter = 0 batman.state = batman.states.FALL batman.frames = {4} batman.frame = 1 end if key.down(key.RIGHT) then batman.flip=false local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8) if not mapa.isBlock(tx,ty) then batman.x = batman.x + 2 end elseif key.down(key.LEFT) then batman.flip=true local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8) if not mapa.isBlock(tx,ty) then batman.x = batman.x - 2 end end end if batman.state == batman.states.FALL then if key.down(key.RIGHT) then batman.flip=false local tx, ty = ((batman.x+12)//8), ((batman.y+8)//8) if not mapa.isSolid(tx,ty) then batman.x = batman.x + 2 end elseif key.down(key.LEFT) then batman.flip=true local tx, ty = ((batman.x+3)//8), ((batman.y+8)//8) if not mapa.isSolid(tx,ty) then batman.x = batman.x - 2 end end local tx1, tx2, ty = ((batman.x+4)//8), ((batman.x+10)//8), ((batman.y+16)//8) if (batman.ignore_first_tile>0) or ((not mapa.isSolid(tx1,ty)) and (not mapa.isSolid(tx2,ty))) then if batman.ignore_first_tile>0 then batman.ignore_first_tile = batman.ignore_first_tile - 1 end batman.state = batman.states.FALL batman.frames = {4} batman.frame = 1 batman.y = batman.y + 4 else batman.y = (batman.y//8)*8 batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end end if batman.state == batman.states.STAIRS_IDLE then local moving = false if key.down(key.DOWN) then moving = true local tx, ty = ((batman.x+4)//8), ((batman.y+16)//8) if (mapa.isStairs(tx,ty)) then if #batman.frames==1 then batman.frames = {8,10,9,10} batman.frame = 1 end batman.y = batman.y + 2; else batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end elseif key.down(key.UP) then moving = true local tx, ty = ((batman.x+4)//8), ((batman.y+7)//8) if (mapa.isStairs(tx,ty)) then if #batman.frames==1 then batman.frames = {8,10,9,10} batman.frame = 1 end batman.y = batman.y - 2; else batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end elseif key.down(key.X) then batman.state = batman.states.IDLE batman.frames = {0} batman.frame = 1 end if not moving then batman.frames = {10} batman.frame = 1 end end end, }