require "animations" sprites = { hero = nil, list = {}, init = function() sprites.hero = { pos = { x=24, y=15 }, size= { w=16, h=17 }, bbo = { left=0, top=0, right=0, bottom=0 }, flipped = false, jumping = 0, animation = "hero_stand", stairs = false, current_frame = 1, current_wait = 1 } end, set_animation=function(sprite, animation) if sprite.animation ~= animation then sprite.animation = animation sprite.current_frame = 1 sprite.current_wait = 1 end end, check_sprite_collision = function() return false end, check_tile_collision = function() end, update = function() sprites.update_sprite(sprites.hero) -- Update hero local anim = "hero_stand" local move_anim = "hero_walk" if sprites.hero.jumping > 0 then anim = "hero_jump" local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3 if map.tile(tx1,ty) == 0 and map.tile(tx2,ty) == 0 then sprites.hero.pos.y = sprites.hero.pos.y - 2 end sprites.hero.jumping = sprites.hero.jumping - 2 else local txm, ty = (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.y+8)>>3 if (map.tile(txm,ty) > 0 and map.tile(txm,ty) < 16) or (map.tile(txm,ty+1) > 0 and map.tile(txm,ty+1) < 16) then anim = "hero_stairs_idle" move_anim = "hero_stairs" if key.down(key.UP) then anim = move_anim local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y)>>3 if map.tile(tx1,ty) < 16 or map.tile(tx2,ty) < 16 then sprites.hero.pos.y = sprites.hero.pos.y - 1 end elseif key.down(key.DOWN) then anim = move_anim local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3 if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then sprites.hero.pos.y = sprites.hero.pos.y + 1 end end else local tx1, txm, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+8)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3 draw.rect(tx1<<3, (ty+2)<<3,8,8,8) draw.rect(tx2<<3, (ty+2)<<3,8,8,28) if map.tile(tx1,ty+2) == 0 and map.tile(tx2,ty+2) == 0 then sprites.hero.pos.y = sprites.hero.pos.y + 2 else sprites.hero.pos.y = (ty<<3)-1 anim = "hero_stand" if (map.tile(txm,ty+2) < 16 and map.tile(txm,ty+2) > 0) then if key.down(key.DOWN) then anim = "hero_stairs" --local tx1, tx2, ty = (sprites.hero.pos.x+4)>>3, (sprites.hero.pos.x+11)>>3, (sprites.hero.pos.y+1)>>3 --if map.tile(tx1,ty+2) < 16 or map.tile(tx2,ty+2) < 16 then sprites.hero.pos.x = (txm << 3)-4 sprites.hero.pos.y = sprites.hero.pos.y + 1 --end end end if key.down(key.SPACE) then sprites.hero.jumping = 16 end end end end if key.down(key.LEFT) then sprites.hero.flipped = true anim = move_anim local tx, ty = (sprites.hero.pos.x+3)>>3, (sprites.hero.pos.y+16)>>3 if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then sprites.hero.pos.x = sprites.hero.pos.x - 1 end elseif key.down(key.RIGHT) then sprites.hero.flipped = false anim = move_anim local tx, ty = (sprites.hero.pos.x+13)>>3, (sprites.hero.pos.y+16)>>3 if map.tile(tx,ty) < 16 and map.tile(tx,ty-1) < 16 then sprites.hero.pos.x = sprites.hero.pos.x + 1 end end sprites.set_animation(sprites.hero, anim) end, update_sprite = function(sprite) if sys.beat() then sprite.current_wait = sprite.current_wait - 1 if sprite.current_wait == 0 then if sprite.current_frame < #animations[sprite.animation].cycle then sprite.current_frame = sprite.current_frame + 1 else sprite.current_frame = 1 end local cycle = animations[sprite.animation].cycle[sprite.current_frame] sprite.current_wait = animations[sprite.animation].frames[cycle].wait end end end, draw = function() surf.source(surf_sprites) sprites.draw_sprite(sprites.hero) end, draw_sprite = function(sprite) local cycle = animations[sprite.animation].cycle[sprite.current_frame] local frame = animations[sprite.animation].frames[cycle] local reversed = frame.reversed or false draw.surf(frame.frame.x, frame.frame.y, frame.frame.w, frame.frame.h, sprite.pos.x, sprite.pos.y, sprite.size.w, sprite.size.h, (not reversed) ~= (not sprite.flipped)) end }