add shooting of bolts
This commit is contained in:
parent
d06472f57b
commit
8600abcdda
@ -9,4 +9,6 @@ return {
|
|||||||
aim_down = "down",
|
aim_down = "down",
|
||||||
aim_left = "left",
|
aim_left = "left",
|
||||||
aim_right = "right",
|
aim_right = "right",
|
||||||
|
|
||||||
|
shoot = "space"
|
||||||
}
|
}
|
||||||
|
@ -362,6 +362,27 @@ function Pool:remove(f)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Pool:removeEntity(e)
|
||||||
|
checkArgument(1, e, 'table')
|
||||||
|
for groupName, group in pairs(self.groups) do
|
||||||
|
for i = #group.entities, 1, -1 do
|
||||||
|
if group.entities[i] == e then
|
||||||
|
self:emit('removeFromGroup', groupName, e)
|
||||||
|
table.remove(group.entities, i)
|
||||||
|
group.hasEntity[e] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i = #self.entities, 1, -1 do
|
||||||
|
if self.entities[i] == e then
|
||||||
|
self:emit('remove', e)
|
||||||
|
table.remove(self.entities, i)
|
||||||
|
self.hasEntity[e] = nil
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--- Registers a function to be called when an event is emitted.
|
--- Registers a function to be called when an event is emitted.
|
||||||
-- @string event the event to listen for
|
-- @string event the event to listen for
|
||||||
-- @tparam function f the function to call
|
-- @tparam function f the function to call
|
||||||
|
@ -2,6 +2,7 @@ local Gamestate = require("lib.hump.gamestate")
|
|||||||
|
|
||||||
function love.load()
|
function love.load()
|
||||||
love.math.setRandomSeed(love.timer.getTime())
|
love.math.setRandomSeed(love.timer.getTime())
|
||||||
|
love.keyboard.setKeyRepeat(true)
|
||||||
math.randomseed(love.timer.getTime())
|
math.randomseed(love.timer.getTime())
|
||||||
|
|
||||||
Gamestate.switch(require("states.main"))
|
Gamestate.switch(require("states.main"))
|
||||||
|
@ -2,18 +2,24 @@ local MainState = {}
|
|||||||
local pprint = require("lib.pprint")
|
local pprint = require("lib.pprint")
|
||||||
local nata = require("lib.nata")
|
local nata = require("lib.nata")
|
||||||
local Vec = require("lib.brinevector")
|
local Vec = require("lib.brinevector")
|
||||||
|
local data = require("data")
|
||||||
|
|
||||||
function MainState:enter()
|
function MainState:enter()
|
||||||
self.ecs = nata.new{
|
self.ecs = nata.new{
|
||||||
groups = {
|
groups = {
|
||||||
physical = {filter = {"pos", "vel"}},
|
physical = {filter = {"pos", "vel"}},
|
||||||
player = {filter = {"pos", "acc", "speed", "score"}},
|
player = {filter = {
|
||||||
sprite = {filter = {"sprite"}}
|
"pos", "acc", "speed",
|
||||||
|
"bolt_count",
|
||||||
|
"bolt_cooldown", "bolt_speed", "bolt_friction"
|
||||||
|
}},
|
||||||
|
sprite = {filter = {"sprite"}},
|
||||||
|
bolt = {filter={"pos", "vel", "bolt"}}
|
||||||
},
|
},
|
||||||
systems = {
|
systems = {
|
||||||
require("systems.physics"),
|
require("systems.physics"),
|
||||||
require("systems.player"),
|
require("systems.player"),
|
||||||
require("systems.sprite"),
|
require("systems.sprite")
|
||||||
},
|
},
|
||||||
data = {}
|
data = {}
|
||||||
}
|
}
|
||||||
@ -22,9 +28,14 @@ function MainState:enter()
|
|||||||
pos = Vec(100, 100),
|
pos = Vec(100, 100),
|
||||||
vel = Vec(0, 0),
|
vel = Vec(0, 0),
|
||||||
acc = Vec(),
|
acc = Vec(),
|
||||||
score = 0,
|
|
||||||
sprite = {},
|
sprite = {},
|
||||||
speed = 100
|
friction = 0.998,
|
||||||
|
speed = 800,
|
||||||
|
bolt_count = 1,
|
||||||
|
bolt_speed = 1000,
|
||||||
|
bolt_cooldown = 0.2,
|
||||||
|
bolt_friction = 0.9
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -41,6 +52,10 @@ function MainState:mousemoved(...)
|
|||||||
self.ecs:emit("mousemoved", ...)
|
self.ecs:emit("mousemoved", ...)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function MainState:keypressed(...)
|
||||||
|
self.ecs:emit("keypressed", ...)
|
||||||
|
end
|
||||||
|
|
||||||
function MainState:draw()
|
function MainState:draw()
|
||||||
self.ecs:emit("draw")
|
self.ecs:emit("draw")
|
||||||
end
|
end
|
||||||
|
@ -5,6 +5,9 @@ function Physics:update(dt)
|
|||||||
if e.acc then
|
if e.acc then
|
||||||
e.vel = e.vel + e.acc * dt
|
e.vel = e.vel + e.acc * dt
|
||||||
end
|
end
|
||||||
|
if e.friction then
|
||||||
|
e.vel = e.vel * (1 - math.min(e.friction, 1)) ^ dt
|
||||||
|
end
|
||||||
|
|
||||||
e.pos = e.pos + e.vel * dt
|
e.pos = e.pos + e.vel * dt
|
||||||
end
|
end
|
||||||
|
@ -35,6 +35,12 @@ function Player:getAimDirection(player)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Player:addToGroup(group, e)
|
||||||
|
if group == "player" then
|
||||||
|
e.bolt_cooldown_timer = e.bolt_cooldown_timer or 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function Player:update(dt)
|
function Player:update(dt)
|
||||||
local move_direction = self:getMoveDirection()
|
local move_direction = self:getMoveDirection()
|
||||||
|
|
||||||
@ -42,9 +48,42 @@ function Player:update(dt)
|
|||||||
self.use_mouse_aim = false
|
self.use_mouse_aim = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Update each player
|
||||||
for _, e in ipairs(self.pool.groups.player.entities) do
|
for _, e in ipairs(self.pool.groups.player.entities) do
|
||||||
|
-- Update where they are aiming/looking
|
||||||
e.aim_dir = self:getAimDirection(e)
|
e.aim_dir = self:getAimDirection(e)
|
||||||
|
-- Update acceleration to make the player move
|
||||||
e.acc = move_direction * e.speed
|
e.acc = move_direction * e.speed
|
||||||
|
|
||||||
|
-- Check if the player tried to shoot a bolt
|
||||||
|
if love.keyboard.isDown(controls.shoot) and
|
||||||
|
(e.aim_dir.x ~= 0 or e.aim_dir.y ~= 0) and
|
||||||
|
e.bolt_cooldown_timer == 0 and
|
||||||
|
e.bolt_count > 0
|
||||||
|
then
|
||||||
|
e.bolt_cooldown_timer = e.bolt_cooldown
|
||||||
|
e.bolt_count = e.bolt_count - 1
|
||||||
|
self.pool:queue{
|
||||||
|
pos = e.pos + e.aim_dir * 30,
|
||||||
|
vel = e.aim_dir * e.bolt_speed,
|
||||||
|
friction = e.bolt_friction,
|
||||||
|
bolt = true,
|
||||||
|
sprite = {}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Decrease bolt cooldown timer
|
||||||
|
if e.bolt_cooldown_timer > 0 then
|
||||||
|
e.bolt_cooldown_timer = math.max(0, e.bolt_cooldown_timer - dt)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- If the player is nearby a non-moving bolt, pick it up
|
||||||
|
for _, bolt in ipairs(self.pool.groups.bolt.entities) do
|
||||||
|
if (e.pos-bolt.pos).length < 30 and bolt.vel.length < 1 then
|
||||||
|
self.pool:removeEntity(bolt)
|
||||||
|
e.bolt_count = e.bolt_count + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user