203 lines
7.8 KiB
Lua
203 lines
7.8 KiB
Lua
|
|
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,
|
|
|
|
} |