diff options
| author | Elizabeth Hunt <me@liz.coffee> | 2026-04-25 20:42:30 -0700 |
|---|---|---|
| committer | Elizabeth Hunt <me@liz.coffee> | 2026-04-25 20:42:30 -0700 |
| commit | a81b080cc830d3073fda40ec777ab24f72cacfb9 (patch) | |
| tree | b92a2461993a2aedb3ea946ee10aa09ca7df3c5d /dyl.lua | |
| parent | 24b0469237285a05d9ffc05d18e43cc5dcdef00f (diff) | |
| download | dyl8-a81b080cc830d3073fda40ec777ab24f72cacfb9.tar.gz dyl8-a81b080cc830d3073fda40ec777ab24f72cacfb9.zip | |
Getting a sword slashing animation working
Diffstat (limited to 'dyl.lua')
| -rw-r--r-- | dyl.lua | 248 |
1 files changed, 168 insertions, 80 deletions
@@ -1,64 +1,139 @@ +_slashing_timer_sec = 0.12 +function spawn_slashing_particle(e) + slash_animation = entity() + _slash_animation_distance = 3 + function slash_animation:transition_state() + -- TODO: Find a better place to put this lol. This has nothing to do with state + -- transitions + slash_animation:equipped_from(e, _slash_animation_distance) + end + return slash_animation:b_type(Entities.Enemy) + :b_line_of_sight(e.line_of_sight) + :b_position(vec2(e.position)) + :b_sprite_position(vec2(position)) + :b_render_order(-1) + :b_live_for(_slashing_timer_sec) + :b_add_state( + States.Active, { + animation = { + pos_y = { sequence = { 115, 116, 117 }, dt = _slashing_timer_sec / 3, reflect = vec2(true, true) }, + neg_y = { sequence = { 115, 116, 117 }, dt = _slashing_timer_sec / 3 }, + pos_x = { sequence = { 112, 113, 114 }, dt = _slashing_timer_sec / 3 }, + neg_x = { sequence = { 112, 113, 114 }, dt = _slashing_timer_sec / 3, reflect = vec2(true, false) } + } + } + ) + :b_state(States.Active) + :build() +end + +enemy = entity() +function enemy:transition_state() +end +enemy:b_type(Entities.Enemy) + :b_position(vec2(30, 40)) + :b_sprite_position(vec2(30, 30)) + :b_line_of_sight(vec2(1, 0)) + :b_render_order(1) + :b_collidable() + :b_add_state( + States.Idle, { + animation = { + pos_y = { sequence = { 32, 33 }, dt = 1 }, + neg_y = { sequence = { 32, 33 }, dt = 1 }, + pos_x = { sequence = { 32, 33 }, dt = 1 }, + neg_x = { sequence = { 32, 33 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_add_state( + States.Walk, { + animation = { + pos_x = { sequence = { 32, 34 }, dt = 0.20 }, + neg_x = { sequence = { 32, 34 }, dt = 0.20, reflect = vec2(true, false) }, + pos_y = { sequence = { 32, 34 }, dt = 0.20 }, + neg_y = { sequence = { 32, 34 }, dt = 0.20 } + } + } + ) + :b_state(States.Walk) + :b_equipped({ sword }) + :build() + + bow = entity() function bow:transition_state() end -bow - :b_type(Entities.Bow) +bow:b_type(Entities.Bow) :b_position(vec2(0, 0)) :b_sprite_position(vec2(0, 0)) :b_line_of_sight(vec2(1, 0)) :b_render_order(1) :b_collidable() - :b_add_state(States.Equipped, { - animation={ - pos_y = { sequence = { 96 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 96 }, dt = 1 }, - pos_x = { sequence = { 80 }, dt = 1 }, - neg_x = { sequence = { 80 }, dt = 1, reflect = vec2(true, false) } - } - }) - :b_add_state(States.Drawn, { - animation={ - pos_y = { sequence = { 81 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 81 }, dt = 1 }, - pos_x = { sequence = { 81 }, dt = 1 }, - neg_x = { sequence = { 81 }, dt = 1, reflect = vec2(true, false) } - } - }) - :b_add_state(States.Drawing, { - animation = bow.states[States.Equipped] - }) + :b_add_state( + States.Equipped, { + animation = { + pos_y = { sequence = { 96 }, dt = 1, reflect = vec2(false, true) }, + neg_y = { sequence = { 96 }, dt = 1 }, + pos_x = { sequence = { 80 }, dt = 1 }, + neg_x = { sequence = { 80 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_add_state( + States.Drawn, { + animation = { + pos_y = { sequence = { 81 }, dt = 1, reflect = vec2(false, true) }, + neg_y = { sequence = { 81 }, dt = 1 }, + pos_x = { sequence = { 81 }, dt = 1 }, + neg_x = { sequence = { 81 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_add_state( + States.Drawing, { + animation = bow.states[States.Equipped] + } + ) :b_state(States.Equipped) :build() sword = entity() -_slashing_timer_ms = 500 function sword:transition_state() - if(btn(5)) then self:transition_to(States.Slashing) - elseif self.state == States.Slashing and self.state_stopwatch > _slashing_timer_ms then self:transition_to(States.Equipped) end + if button_just_pressed(5) and self.state == States.Equipped then + self:transition_to(States.Slashing) + spawn_slashing_particle(self) + elseif self.state == States.Slashing and self.state_stopwatch > _slashing_timer_sec then + self:transition_to(States.Equipped) + end end sword :b_type(Entities.Sword) :b_line_of_sight(vec2(1, 0)) :b_position(vec2(0, 0)) :b_sprite_position(vec2(0, 0)) - :b_render_order(1) + :b_render_order(0) :b_collidable() - :b_add_state(States.Equipped, { - animation={ - pos_y = { sequence = { 82 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 82 }, dt = 1, reflect = vec2(true, false)}, - pos_x = { sequence = { 82 }, dt = 1 }, - neg_x = { sequence = { 82 }, dt = 1, reflect = vec2(true, false) } - } - }) - :b_add_state(States.Slashing, { - animation={ - pos_y = { sequence = { 82, 82+16 }, dt = 1, reflect = vec2(false, true) }, - neg_y = { sequence = { 82, 82+16 }, dt = 1, reflect = vec2(true, false)}, - pos_x = { sequence = { 82, 82+16 }, dt = 1 }, - neg_x = { sequence = { 82, 82+16 }, dt = 1, reflect = vec2(true, false) } - } - }) + :b_add_state( + States.Equipped, { + animation = { + pos_y = { sequence = { 99 }, dt = 1, reflect = vec2(false, true) }, + neg_y = { sequence = { 99 }, dt = 1, reflect = vec2(true, false) }, + pos_x = { sequence = { 98 }, dt = 1 }, + neg_x = { sequence = { 98 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_add_state( + States.Slashing, { + animation = { + pos_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, true) }, + neg_y = { sequence = { 82, 98 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) }, + pos_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(false, false)}, + neg_x = { sequence = { 82, 99 }, dt = _slashing_timer_sec / 2, reflect = vec2(true, false) } + } + } + ) :b_state(States.Equipped) :build() @@ -70,61 +145,74 @@ function player:transition_state() self:transition_to(States.Walk) end end -player:b_type(Entities.Player) +player + :b_type(Entities.Player) :b_line_of_sight(vec2(1, 0)) - :b_render_order(0) + :b_render_order(2) :b_collidable() - :b_position(vec2(30,30)) - :b_sprite_position(vec2(30,30)) - :b_add_state(States.Idle, { - animation = { - pos_y = { sequence = { 3, 19 }, dt = 1 }, - neg_y = { sequence = { 6, 22 }, dt = 1 }, - pos_x = { sequence = { 0, 1 }, dt = 1 }, - neg_x = { sequence = { 0, 1 }, dt = 1, reflect = vec2(true, false) } - } - }) - :b_add_state(States.Walk, { - animation = { - pos_x = { sequence = { 2, 0 }, dt = 0.20 }, - neg_x = { sequence = { 2, 0 }, dt = 0.20, reflect = vec2(true, false) }, - pos_y = { sequence = { 4, 5 }, dt = 0.20 }, - neg_y = { sequence = { 7, 8 }, dt = 0.20 } - } - }) - :b_state("idle") + :b_position(vec2(30, 30)) + :b_sprite_position(vec2(30, 30)) + :b_add_state( + States.Idle, { + animation = { + pos_y = { sequence = { 3, 19 }, dt = 1 }, + neg_y = { sequence = { 6, 22 }, dt = 1 }, + pos_x = { sequence = { 0, 1 }, dt = 1 }, + neg_x = { sequence = { 0, 1 }, dt = 1, reflect = vec2(true, false) } + } + } + ) + :b_add_state( + States.Walk, { + animation = { + pos_x = { sequence = { 2, 0 }, dt = 0.20 }, + neg_x = { sequence = { 2, 0 }, dt = 0.20, reflect = vec2(true, false) }, + pos_y = { sequence = { 4, 5 }, dt = 0.20 }, + neg_y = { sequence = { 7, 8 }, dt = 0.20 } + } + } + ) + :b_state(States.Idle) :b_equipped({ sword }) :build() _walk_speed = 35 -- powerup increase? function handle_input() - dpos = vec2(0, 0) - if btn(0) then dpos.x -= 1 end - if btn(1) then dpos.x += 1 end - if btn(3) then dpos.y += 1 end - if btn(2) then dpos.y -= 1 end + dpos = vec2(0, 0) + if btn(0) then dpos.x -= 1 end + if btn(1) then dpos.x += 1 end + if btn(3) then dpos.y += 1 end + if btn(2) then dpos.y -= 1 end - player.velocity = dpos:normal() * _walk_speed + player.velocity = dpos:normal() * _walk_speed end function _init() end -step_t = time() -function _update60() - cls(0) -- clear here in case we want to print to screen outside of _draw +_step_t = time() +function _update() + -- clear here in case we want to print to screen outside of _draw + cls(0) + + old_step = _step_t + _step_t = time() + step_dt = _step_t - old_step - old_step = step_t - step_t = time() - step_dt = step_t - old_step + foreach(update_hooks, function(f) f(step_dt) end) - handle_input() - qsort(World, function(a, b) return a.equipped != nil end) - foreach(World, function (e) e:update(step_dt) end) + handle_input() + World.foreach(function(e) if (not e.equipped) then e:update(step_dt) end end) + World.foreach(function(e) if (e.equipped) then e:update(step_dt) end end) - run_collisions() + run_collisions() + + World.cull_the_dead() end function _draw() - foreach(qsort(World, function(a, b) return a.render_order < b.render_order end), function (e) e:render() end) -end + qsort(World, function(a, b) return b.render_order < a.render_order end) + World.foreach(function(e) + e:render() + end) +end
\ No newline at end of file |
