diff options
| -rw-r--r-- | ai.lua | 6 | ||||
| -rw-r--r-- | camera.lua | 6 | ||||
| -rw-r--r-- | collisions.lua | 26 | ||||
| -rw-r--r-- | dyl.lua | 6 | ||||
| -rw-r--r-- | entity.lua | 15 | ||||
| -rw-r--r-- | math.lua | 2 |
6 files changed, 50 insertions, 11 deletions
@@ -26,16 +26,17 @@ function AiController:update(dt) end function gliding_gun() - _glider_damage = { amount = 2, knockback = { magnitude = 300, time = 0.080 } } + _glider_damage = { amount = 2, knockback = { magnitude = 300, time = 0.070 } } GlidingGunBuilder = EntityBuilder:new(World) function GlidingGunBuilder:transition_state() end return GlidingGunBuilder:b_type(Entities.Bullet) :b_line_of_sight(vec2(1, 0)) :b_position(vec2(100, 100)) + :b_health() :b_render_order(0) :b_collidable() - :b_live_for(25) + :b_live_for(2) :b_velocity(vec2(-40, 0)) :b_collision_bounds(vec2(3, 4), vec2(5, 6)) :b_add_state( @@ -48,6 +49,7 @@ function gliding_gun() } } ) + :b_damage(_glider_damage) :b_state(States.Active) :build() end @@ -42,6 +42,12 @@ end _cull_factor = 1/4 function Camera:render(entity) screen_position = (entity.sprite_position or entity.position) - self.position + if DEBUG and entity.collision then + entity_collision_box = { top_left = screen_position + entity.collision_bounds.top_left, bottom_right = screen_position + entity.collision_bounds.bottom_right } + -- entity_collision_box = { top_left = screen_position, bottom_right = screen_position + vec2(8, 8)} + -- entity_collision_box = entity_collision_bounds + rect(entity_collision_box.top_left.x, entity_collision_box.top_left.y, entity_collision_box.bottom_right.x, entity_collision_box.bottom_right.y, 5) + end if screen_position:in_bounds(SCREEN * -_cull_factor, SCREEN * (1 + _cull_factor)) then entity:render(screen_position) end diff --git a/collisions.lua b/collisions.lua index 3d3ba46..093d57c 100644 --- a/collisions.lua +++ b/collisions.lua @@ -5,9 +5,24 @@ function is_colliding(a, b) ) end +_kills = { + vec2(Entities.Sword, Entities.Bullet) +} +function kills(a, b) + return some(_kills, function (v) return a.entity_type == v.x and b.entity_type == v.y end) +end +_consume = { + -- Consume the bullet as soon as it hits a target + vec2(Entities.Player, Entities.Bullet), + vec2(Entities.Wife, Entities.Bullet) +} +function consume(a, b) + return some(_consume, function (v) return a.entity_type == v.x and b.entity_type == v.y end) +end _hurts = { vec2(Entities.Bullet, Entities.Player), vec2(Entities.Sword, Entities.Enemy), + vec2(Entities.Enemy, Entities.Player) } function hurts(a, b) if b:is_in_iframe() then @@ -26,6 +41,12 @@ function handle_collision(a, b) end if hurts(a, b) then b:take_damage(a.line_of_sight, a.damage) + if consume(b, a) then + a:kill() + end + end + if kills(a, b) then + b:kill() end end @@ -36,10 +57,7 @@ function run_collisions() if a.id == b.id then goto continue end - if is_colliding( - {top_left = (a.collision_bounds.top_left + a.position), bottom_right = (a.collision_bounds.bottom_right + a.position) }, - {top_left = (b.collision_bounds.top_left + b.position), bottom_right = (b.collision_bounds.bottom_right + b.position) } - ) then + if is_colliding(a:collision_box(), b:collision_box()) then handle_collision(a, b) end ::continue:: @@ -1,3 +1,5 @@ +DEBUG = true + _slashing_timer_sec = .12 _slash_animation_distance = 3 function slashing_particle(following) @@ -53,6 +55,7 @@ function fire() end function enemy() + _enemy_damage_spec = { amount = 2, knockback = { magnitude = 200, time = 0.120 } } EnemyBuilder = EntityBuilder:new(World) function EnemyBuilder:transition_state() end @@ -61,6 +64,7 @@ function enemy() :b_position(vec2(30, -40)) :b_sprite_position(vec2(30, 40)) :b_line_of_sight(vec2(1, 0)) + :b_damage(_enemy_damage_spec) :b_render_order(1) :b_collidable() :b_add_state( @@ -263,7 +267,9 @@ function player() :b_render_order(2) :b_collidable() :b_position(vec2(30, 30)) + :b_health(10) :b_sprite_position(vec2(30, 30)) + :b_collision_bounds(vec2(2, 2), vec2(5, 6)) :b_add_state( States.Idle, { animation = { @@ -68,6 +68,7 @@ function Entity:update(dt) if self.life_time ~= nil then self.life_time -= dt + if self.life_time <= 0 then self:kill() return end end if self.health ~= nil and self.health <= 0 then self:kill() @@ -186,6 +187,10 @@ function _get_animation_key(line_of_sight) return _animation_keys[n_line_of_sight.x + 2] .. "_x" end +function Entity:collision_box() + return {top_left = (self.collision_bounds.top_left + self.position), bottom_right = (self.collision_bounds.bottom_right + self.position) } +end + function Entity:render(screen_position) animation = self.states[self.state].animation if (animation == nil) then return end @@ -263,6 +268,12 @@ function EntityBuilder:b_equipped(equipped) end function EntityBuilder:b_collidable() self.collision = true + if (self.collision_bounds == nil) then + self.collision_bounds = { + top_left = vec2(0, 0), + bottom_right = vec2(SPRITE_DIMS) + } + end return self end function EntityBuilder:b_live_for(t) @@ -286,10 +297,6 @@ function EntityBuilder:b_collision_bounds(top_left, bottom_right) end function EntityBuilder:build() self.equipped = {} - self.collision_bounds = { - top_left = vec2(0, 0), - bottom_right = vec2(SPRITE_DIMS) - } return self.build_context.world.add(setmetatable(self, Entity)) end
\ No newline at end of file @@ -9,7 +9,7 @@ Vec2.__mul = function(a, b) return vec2(a.x * b.x, a.y * b.y) end Vec2.__div = function(a, b) - if (type(b) == "number") then return vec2(a.x / b, a.y / b) end -- scalar mult + if (type(b) == "number") then return vec2(a.x / b, a.y / b) end -- scalar div return vec2(a.x / b.x, a.y / b.y) end Vec2.__tostring = function(a) return "(" .. fmt(a.x) .. "," .. fmt(a.y) .. ")" end |
