5 changed files with 207 additions and 0 deletions
@ -0,0 +1,40 @@ |
|||||
|
--! file: e-fighter.lua |
||||
|
require("entities.enemy") |
||||
|
|
||||
|
local E_Fighter = Enemy:extend() |
||||
|
|
||||
|
function E_Fighter:new(x, y, radius, playableArea) |
||||
|
E_Fighter.super.new(x, y, radius, playableArea) |
||||
|
|
||||
|
self.image = love.graphics.newImage("/assets/enemy/e-fighter.png") |
||||
|
|
||||
|
self.type = "enemy fighter" |
||||
|
self.health = 10 |
||||
|
self.speed = 70 |
||||
|
self.scoreValue = 100 |
||||
|
self.fireRate = 1 |
||||
|
|
||||
|
self.height = 22 |
||||
|
self.width = 24 |
||||
|
self.x_offset = 18 |
||||
|
self.y_offset = 20 |
||||
|
end |
||||
|
|
||||
|
function E_Fighter:draw() |
||||
|
love.graphics.draw( |
||||
|
self.image, |
||||
|
self.x, |
||||
|
self.y, |
||||
|
3.14159, |
||||
|
1, |
||||
|
1, |
||||
|
(self.x_offset + self.width * 2 - 4), |
||||
|
(self.y_offset + self.height * 2) |
||||
|
) |
||||
|
|
||||
|
for _, v in ipairs(self.enemyBullets) do |
||||
|
v:draw() |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
function E_Fighter:update() end |
||||
@ -0,0 +1,140 @@ |
|||||
|
--! file enemy.lua |
||||
|
require("blaster") |
||||
|
Enemy = Object:extend() |
||||
|
|
||||
|
--int x, y, radius |
||||
|
--playableArea -> {int[2]} |
||||
|
function Enemy:new(x, y, radius, playableArea) |
||||
|
self.origin = { x, y } |
||||
|
self.image = love.graphics.newImage("/assets/enemy/e-fighter.png") |
||||
|
|
||||
|
self.x = x |
||||
|
self.y = y |
||||
|
self.playableLeft = playableArea[1] |
||||
|
self.playableRight = playableArea[2] |
||||
|
|
||||
|
self.type = "enemy" |
||||
|
self.health = 10 |
||||
|
self.scoreValue = 100 |
||||
|
self.move_radius = radius |
||||
|
self.speed = 80 |
||||
|
self.fireRate = 1 |
||||
|
self.destroy = false |
||||
|
|
||||
|
self.height = 22 |
||||
|
self.width = 24 |
||||
|
self.x_offset = 18 |
||||
|
self.y_offset = 20 |
||||
|
|
||||
|
self.hitbox = { |
||||
|
(self.x + self.x_offset), |
||||
|
(self.x + self.x_offset + self.width), |
||||
|
(self.y + self.y_offset), |
||||
|
(self.y + self.y_offset + self.height), |
||||
|
} |
||||
|
|
||||
|
self.move_bounds = self:setMoveBounds() |
||||
|
--print("Move Bounds: ", self.move_bounds[1], " , ", self.move_bounds[2]) |
||||
|
self.fireTime = love.timer.getTime() |
||||
|
self.enemyBullets = {} |
||||
|
end |
||||
|
|
||||
|
function Enemy:draw() |
||||
|
--draw stuff |
||||
|
--for the base class, draw the hitbox |
||||
|
--if the enemy is destroyed, remove the image and display the score for two seconds |
||||
|
love.graphics.rectangle("line", self.hitbox[1], self.hitbox[3], self.width, self.height) |
||||
|
--TODO: Resolve this magic number bullshit on line 52. (Why do I subtract 4?) |
||||
|
love.graphics.draw( |
||||
|
self.image, |
||||
|
self.x, |
||||
|
self.y, |
||||
|
3.14159, |
||||
|
1, |
||||
|
1, |
||||
|
(self.x_offset + self.width * 2 - 4), |
||||
|
(self.y_offset + self.height * 2) |
||||
|
) |
||||
|
|
||||
|
for _, v in ipairs(self.enemyBullets) do |
||||
|
v:draw() |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
function Enemy:update(dt, player) |
||||
|
-- if spawn location is near the edge, adjust the bounds such that the radius |
||||
|
-- does not overlap the bounds of the playable area |
||||
|
local window_height = love.graphics.getHeight() |
||||
|
|
||||
|
self.x = self.x + self.speed * dt |
||||
|
--self.hitbox = { (self.x + 18), (self.x + 44), (self.y + 20), (self.y + 44) } |
||||
|
self:setHitbox() |
||||
|
|
||||
|
--movement |
||||
|
if self.hitbox[1] < self.move_bounds[1] then |
||||
|
--self.x = self.move_bounds[1] |
||||
|
self.speed = -self.speed |
||||
|
elseif self.hitbox[2] > self.move_bounds[2] then |
||||
|
--self.x = self.move_bounds[2] - self.width - self.x_offset |
||||
|
self.speed = -self.speed |
||||
|
end |
||||
|
|
||||
|
--firing! |
||||
|
self:fire() |
||||
|
|
||||
|
for i, v in ipairs(self.enemyBullets) do |
||||
|
v:update(dt) |
||||
|
|
||||
|
if v.y > window_height then |
||||
|
v.destroy = true |
||||
|
end |
||||
|
|
||||
|
if v.destroy == true then |
||||
|
--print("Enemy Bullet Removed! Bullets in table remaining: ", #enemyBullets) |
||||
|
table.remove(self.enemyBullets, i) |
||||
|
end |
||||
|
|
||||
|
v:checkCollision(player) |
||||
|
end |
||||
|
--health check |
||||
|
if self.health < 0 then |
||||
|
self.destroy = true |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
--shoot at the player a variable number of seconds |
||||
|
function Enemy:fire() |
||||
|
--local fire_origin = { self.x + 26, self.y + 44 } |
||||
|
local fire_origin = { ((self.x + (self.width / 2)) + self.x_offset), (self.y + self.height + self.y_offset) } |
||||
|
if love.timer.getTime() - self.fireTime > self.fireRate then |
||||
|
table.insert(self.enemyBullets, Blaster(fire_origin[1], fire_origin[2], "enemy")) |
||||
|
self.fireTime = love.timer.getTime() |
||||
|
end |
||||
|
end |
||||
|
|
||||
|
function Enemy:setMoveBounds() |
||||
|
local result = {} |
||||
|
|
||||
|
if (self.hitbox[1] - self.move_radius) < self.playableLeft then |
||||
|
result[1] = self.playableLeft |
||||
|
--result[2] = self.playableLeft + self.hitbox[1] + self.move_radius |
||||
|
result[2] = self.playableLeft + (self.move_radius * 2) |
||||
|
elseif (self.hitbox[2] + self.move_radius) > self.playableRight then |
||||
|
--result[1] = self.playableRight - self.hitbox[2] - self.move_radius |
||||
|
result[1] = self.playableRight - (self.move_radius * 2) |
||||
|
result[2] = self.playableRight |
||||
|
else |
||||
|
result[1] = self.x - self.move_radius |
||||
|
result[2] = self.x + self.move_radius |
||||
|
end |
||||
|
return result |
||||
|
end |
||||
|
|
||||
|
function Enemy:setHitbox() |
||||
|
self.hitbox = { |
||||
|
(self.x + self.x_offset), |
||||
|
(self.x + self.width + self.x_offset), |
||||
|
(self.y + self.y_offset), |
||||
|
(self.y + self.height + self.y_offset), |
||||
|
} |
||||
|
end |
||||
@ -0,0 +1,22 @@ |
|||||
|
--! file: mastercontroller.lua |
||||
|
--This is the master game controller for my little space game |
||||
|
|
||||
|
function MasterController:new(bounds) |
||||
|
self.score = 0 |
||||
|
self.lives = 3 |
||||
|
self.playableBounds = bounds |
||||
|
end |
||||
|
|
||||
|
function MasterController:spawnEnemy() end |
||||
|
--Handle game stages |
||||
|
--Stage Types: Meteor Swarm |
||||
|
--Enemy Attack (various types?) |
||||
|
--Boss Battle |
||||
|
|
||||
|
--Spawn enemies |
||||
|
|
||||
|
--Handle Score / Cash |
||||
|
|
||||
|
--Set interlevel bid from Space Cop or Space Waifu |
||||
|
|
||||
|
--End of Level Ledger / Score Sheet |
||||
Loading…
Reference in new issue