150 lines
3.1 KiB
Lua
150 lines
3.1 KiB
Lua
Entity = {}
|
||
|
||
function Entity:New(x,y)
|
||
o = {}
|
||
o.pos = {x = x, y = y}
|
||
o.vel = {x = 0, y = 0}
|
||
o.target = {x = 0, y = 0}
|
||
o.hitbox = 0
|
||
o.angle = 0
|
||
o.direction = 0
|
||
o.show_health = false
|
||
o.id = {}
|
||
setmetatable(o, self)
|
||
self.__index = self
|
||
return o
|
||
end
|
||
|
||
function Entity:Damage(damage)
|
||
self.health = self.health - damage
|
||
if self.health <= 0 then
|
||
self:Kill()
|
||
end
|
||
end
|
||
|
||
function Entity:DrawHealth()
|
||
local width = 400
|
||
local height = 10
|
||
love.graphics.setColor(1,1,1)
|
||
love.graphics.rectangle(
|
||
"fill",
|
||
self.pos.x - width/2,
|
||
self.pos.y - height * self.draw_scale,
|
||
width,
|
||
height
|
||
)
|
||
love.graphics.setColor(1,0,0)
|
||
love.graphics.rectangle(
|
||
"fill",
|
||
self.pos.x - width/2+1,
|
||
self.pos.y - height * self.draw_scale+1,
|
||
self.health/self.max_health*(width-2),
|
||
height-2
|
||
)
|
||
love.graphics.setColor(1,1,1)
|
||
|
||
end
|
||
|
||
function Entity:AddList(list)
|
||
table.insert(list,self)
|
||
|
||
if list == List.Simulate then
|
||
self.id.Simulate = #list
|
||
elseif list == List.Enemy then
|
||
self.id.Enemy = #list
|
||
elseif list == List.EnemyBullet then
|
||
self.id.EnemyBullet = #list
|
||
elseif list == List.FriendlyBullet then
|
||
self.id.FriendlyBullet = #list
|
||
end
|
||
end
|
||
|
||
function Entity:CollisionWith(obj)
|
||
if math.sqrt((obj.pos.x-self.pos.x)^2 + (obj.pos.y-self.pos.y)^2) < obj.hitbox + self.hitbox then
|
||
return true
|
||
else
|
||
return false
|
||
end
|
||
end
|
||
|
||
function Entity:RemoveList(list)
|
||
if list == List.Simulate then
|
||
for _, e in pairs(list) do
|
||
if e.id.Simulate > self.id.Simulate then
|
||
e.id.Simulate = e.id.Simulate - 1
|
||
end
|
||
end
|
||
table.remove(list,self.id.Simulate)
|
||
elseif list == List.Enemy then
|
||
for _, e in pairs(list) do
|
||
if e.id.Enemy > self.id.Enemy then
|
||
e.id.Enemy = e.id.Enemy - 1
|
||
end
|
||
end
|
||
table.remove(list,self.id.Enemy)
|
||
elseif list == List.EnemyBullet then
|
||
for _, e in pairs(list) do
|
||
if e.id.EnemyBullet > self.id.EnemyBullet then
|
||
e.id.EnemyBullet = e.id.EnemyBullet - 1
|
||
end
|
||
end
|
||
table.remove(list,self.id.EnemyBullet)
|
||
elseif list == List.FriendlyBullet then
|
||
for _, e in pairs(list) do
|
||
if e.id.FriendlyBullet > self.id.FriendlyBullet then
|
||
e.id.FriendlyBullet = e.id.FriendlyBullet - 1
|
||
end
|
||
end
|
||
table.remove(list,self.id.FriendlyBullet)
|
||
end
|
||
end
|
||
|
||
function Entity:AngleTowards(x,y)
|
||
target_x = x - self.pos.x
|
||
target_y = y - self.pos.y
|
||
|
||
self.angle = GetAngle(target_x,target_y)
|
||
end
|
||
|
||
function Entity:Kill()
|
||
if self.id.Simulate ~= nil then
|
||
self:RemoveList(List.Simulate)
|
||
end
|
||
if self.id.Enemy ~= nil then
|
||
self:RemoveList(List.Enemy)
|
||
end
|
||
if self.id.EnemyBullet ~= nil then
|
||
self:RemoveList(List.EnemyBullet)
|
||
end
|
||
if self.id.FriendlyBullet ~= nil then
|
||
self:RemoveList(List.FriendlyBullet)
|
||
end
|
||
|
||
self = nil
|
||
end
|
||
|
||
function Entity:MoveTowards(x,y,speed)
|
||
target_x = x - self.pos.x
|
||
target_y = y - self.pos.y
|
||
|
||
local angle = GetAngle(target_x,target_y)
|
||
|
||
if speed ~= 0 then
|
||
if target_x ~= 0 then
|
||
self.vel.x = speed * math.cos(angle)
|
||
else
|
||
self.vel.x = 0
|
||
end
|
||
if target_y ~= 0 then
|
||
self.vel.y = speed * math.sin(angle)
|
||
else
|
||
self.vel.y = 0
|
||
end
|
||
end
|
||
end
|
||
|
||
require "scripts/entities/player"
|
||
require "scripts/entities/enemy/fang"
|
||
require "scripts/entities/enemy/shooter"
|
||
require "scripts/entities/bullet"
|