Compare commits
43
Commits
9e968b9390
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8d756beb1b | ||
|
|
86d33a7fc5 | ||
|
|
65f4ee3473 | ||
|
|
e13114a736 | ||
|
|
451d710326 | ||
|
|
585fccf59a | ||
|
|
3290d704e3 | ||
|
|
7b553d9758 | ||
|
|
e9e3731a0b | ||
|
|
ed9265939c | ||
|
|
826ef98f19 | ||
|
|
db3559b8c6 | ||
|
|
88faf2538b | ||
|
|
7252c3cd2c | ||
|
|
7da12d3035 | ||
|
|
ebf9369ba5 | ||
|
|
f6be8b2a16 | ||
|
|
beb4c28a70 | ||
|
|
2d22a50447 | ||
|
|
d059017989 | ||
|
|
49a57a6e5d | ||
|
|
f5770cd4e0 | ||
|
|
49633072ac | ||
|
|
7af90632fd | ||
|
|
e47799650a | ||
|
|
8440be2ab1 | ||
|
|
df4184eec4 | ||
|
|
e8a124fa63 | ||
|
|
78b4379143 | ||
|
|
b8106bc1aa | ||
|
|
f8d71bb27d | ||
|
|
7016961609 | ||
|
|
95502bc429 | ||
|
|
f689632a92 | ||
|
|
da8bb7d083 | ||
|
|
0a25d11ac5 | ||
|
|
71d1f6e929 | ||
|
|
a392755844 | ||
|
|
f4d3969a1f | ||
|
|
2cd9f263e6 | ||
|
|
ff40a5507b | ||
|
|
26398f52b5 | ||
|
|
38826d0cd8 |
+17
-4
@@ -6,15 +6,18 @@ end
|
||||
|
||||
local function drawHealth()
|
||||
love.graphics.setFont(GameFont)
|
||||
local height = love.graphics.getHeight()
|
||||
local width = love.graphics.getWidth()
|
||||
local height = love.graphics.getHeight() / _G.Y_SCALE
|
||||
local width = love.graphics.getWidth() / _G.X_SCALE
|
||||
love.graphics.print("P1:" .. UserPlayer1.health, 5, 5)
|
||||
love.graphics.print("P2:" .. UserPlayer2.health, width - 200, height - 95)
|
||||
end
|
||||
|
||||
function DrawGame()
|
||||
--STI
|
||||
GameMap:draw()
|
||||
local curWidth, curHeight = love.graphics.getDimensions()
|
||||
love.graphics.scale(_G.X_SCALE, _G.Y_SCALE)
|
||||
|
||||
GameMap:draw(0, 0, _G.X_SCALE, _G.Y_SCALE)
|
||||
GameMap:resize(curWidth / _G.X_SCALE, curHeight / _G.Y_SCALE)
|
||||
|
||||
-- WindField
|
||||
if DebugFlag then
|
||||
@@ -22,6 +25,7 @@ function DrawGame()
|
||||
drawFPS()
|
||||
end
|
||||
|
||||
-- Bullets
|
||||
for _, v in ipairs(Bullets1) do
|
||||
v:draw()
|
||||
end
|
||||
@@ -29,9 +33,18 @@ function DrawGame()
|
||||
v:draw()
|
||||
end
|
||||
|
||||
-- PowerUps
|
||||
for _, v in ipairs(PowerUps) do
|
||||
v:draw()
|
||||
end
|
||||
|
||||
UserPlayer1:draw()
|
||||
UserPlayer2:draw()
|
||||
|
||||
--Draw Health
|
||||
--TODO: make this nicer looking
|
||||
drawHealth()
|
||||
|
||||
--TODO: draw running score
|
||||
--drawScore()
|
||||
end
|
||||
|
||||
+37
-2
@@ -1,10 +1,15 @@
|
||||
function GameKeyPressed(key)
|
||||
if key == "escape" then
|
||||
if not MUTED then
|
||||
musicBattle:setVolume(0)
|
||||
musicPause:setVolume(0.6)
|
||||
else
|
||||
musicBattle:setVolume(0)
|
||||
musicPause:setVolume(0)
|
||||
end
|
||||
|
||||
_G.GAMESTATE = "PAUSE"
|
||||
print("STATE CHANEGD: PAUSED!")
|
||||
--print("STATE CHANEGD: PAUSED!")
|
||||
_G.PAUSED = true
|
||||
end
|
||||
|
||||
@@ -12,10 +17,40 @@ function GameKeyPressed(key)
|
||||
DebugFlag = not DebugFlag
|
||||
end
|
||||
|
||||
--TODO: Better restart
|
||||
if key == "r" and not _G.PAUSED then
|
||||
RestartGame()
|
||||
_G.GAMESTATE = "GAME"
|
||||
love.load()
|
||||
end
|
||||
|
||||
if key == "m" then
|
||||
_G.MUTED = not _G.MUTED
|
||||
-- Need to set the battle music to mute
|
||||
if _G.MUTED then
|
||||
musicBattle:setVolume(0)
|
||||
else
|
||||
musicBattle:setVolume(0.5)
|
||||
end
|
||||
end
|
||||
|
||||
if DebugFlag and key == "1" then
|
||||
--UserPlayer1.speed = 50000
|
||||
--print("player1 speed increased!")
|
||||
end
|
||||
|
||||
if DebugFlag and key == "2" then
|
||||
_G.CUR_LEVEL = 2
|
||||
RestartGame()
|
||||
love.load()
|
||||
end
|
||||
if DebugFlag and key == "3" then
|
||||
_G.CUR_LEVEL = 3
|
||||
RestartGame()
|
||||
love.load()
|
||||
end
|
||||
|
||||
if key == "p" then
|
||||
testP = PowerUp("speed", 300, 300, "assets/powerup.jpeg", 10)
|
||||
table.insert(PowerUps, testP)
|
||||
end
|
||||
end
|
||||
|
||||
+83
-16
@@ -1,12 +1,14 @@
|
||||
local function checkWinState()
|
||||
local function checkLossState()
|
||||
-- Check P1's health
|
||||
if UserPlayer1.health <= 0 then --P1 win
|
||||
if UserPlayer1.health <= 0 then --P1 Lost, P2 Win
|
||||
_G.P2_COUNT = _G.P2_COUNT + 1
|
||||
_G.P1_WIN = false
|
||||
_G.P2_WIN = true
|
||||
return true
|
||||
end
|
||||
|
||||
if UserPlayer2.health <= 0 then --P2 win
|
||||
if UserPlayer2.health <= 0 then --P2 Lost, P1 Win
|
||||
_G.P1_COUNT = _G.P1_COUNT + 1
|
||||
_G.P1_WIN = true
|
||||
_G.P2_WIN = false
|
||||
return true
|
||||
@@ -18,8 +20,8 @@ local max = math.max -- optimisations
|
||||
|
||||
function UpdateGame(dt)
|
||||
--Check if anyone has won
|
||||
if checkWinState() == true then
|
||||
print("STATE CHNAGED: WIN!")
|
||||
if checkLossState() == true then
|
||||
--print("STATE CHNAGED: WIN!")
|
||||
_G.GAMESTATE = "WIN"
|
||||
end
|
||||
--WindField
|
||||
@@ -35,8 +37,17 @@ function UpdateGame(dt)
|
||||
EnableKeyPress2 = true
|
||||
end
|
||||
|
||||
-- Update Bullets1
|
||||
for i, v in ipairs(Bullets1) do
|
||||
v:update(dt)
|
||||
|
||||
-- Check bounce count
|
||||
if v.bounce >= _G.BULLETS_BOUNCE_MAX then
|
||||
table.remove(Bullets1, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
|
||||
-- Handle screen edges
|
||||
if v.y < 0 then --top of screen
|
||||
table.remove(Bullets1, i)
|
||||
v.collider:destroy()
|
||||
@@ -44,27 +55,45 @@ function UpdateGame(dt)
|
||||
table.remove(Bullets1, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
|
||||
-- Hit player2
|
||||
if v.collider:enter("Player2") then
|
||||
print("Player1 hit Player2!")
|
||||
--print("Player1 hit Player2!")
|
||||
table.remove(Bullets1, i)
|
||||
v.collider:destroy()
|
||||
if UserPlayer1.health > 0 then
|
||||
UserPlayer1.health = UserPlayer1.health - 1
|
||||
if UserPlayer2.health > 0 then
|
||||
UserPlayer2.health = UserPlayer2.health - 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Hit player1
|
||||
if v.collider:enter("Player1") then
|
||||
print("Player 1 hit themselves!")
|
||||
--print("Player 1 hit themselves!")
|
||||
table.remove(Bullets1, i)
|
||||
v.collider:destroy()
|
||||
if UserPlayer1.health > 0 then
|
||||
UserPlayer1.health = UserPlayer1.health - 1
|
||||
end
|
||||
end
|
||||
|
||||
--Hit another bullet
|
||||
if v.collider:enter("Bullet1") then
|
||||
table.remove(Bullets1, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
-- Update Bullets2
|
||||
for i, v in ipairs(Bullets2) do
|
||||
v:update(dt)
|
||||
|
||||
-- Check bounce count
|
||||
if v.bounce >= _G.BULLETS_BOUNCE_MAX then
|
||||
table.remove(Bullets2, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
|
||||
-- Handle screen edges
|
||||
if v.y < 0 then --top of screen
|
||||
table.remove(Bullets2, i)
|
||||
v.collider:destroy()
|
||||
@@ -73,24 +102,62 @@ function UpdateGame(dt)
|
||||
v.collider:destroy()
|
||||
end
|
||||
|
||||
-- Hit player1
|
||||
if v.collider:enter("Player1") then
|
||||
print("Player2 hit Player1!")
|
||||
--print("Player2 hit Player1!")
|
||||
table.remove(Bullets2, i)
|
||||
v.collider:destroy()
|
||||
if UserPlayer1.health > 0 then
|
||||
UserPlayer1.health = UserPlayer1.health - 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Hit player2
|
||||
if v.collider:enter("Player2") then
|
||||
--print("Player 2 hit themselves!")
|
||||
table.remove(Bullets2, i)
|
||||
v.collider:destroy()
|
||||
if UserPlayer2.health > 0 then
|
||||
UserPlayer2.health = UserPlayer2.health - 1
|
||||
end
|
||||
end
|
||||
|
||||
--Hit another bullet
|
||||
if v.collider:enter("Bullet2") then
|
||||
table.remove(Bullets2, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
-- PowerUp updates
|
||||
for i, v in ipairs(PowerUps) do
|
||||
v:update(dt)
|
||||
if v.collider:enter("Player1") then
|
||||
UserPlayer1:getPowerUp(v)
|
||||
UserPlayer1:powerup()
|
||||
table.remove(PowerUps, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
if v.collider:enter("Player2") then
|
||||
print("Player 2 hit themselves!")
|
||||
table.remove(Bullets2, i)
|
||||
UserPlayer2:getPowerUp(v)
|
||||
UserPlayer2:powerup()
|
||||
table.remove(PowerUps, i)
|
||||
v.collider:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
if UserPlayer2.health > 0 then
|
||||
UserPlayer2.health = UserPlayer2.health - 1
|
||||
end
|
||||
end
|
||||
--PowerUp timer to place
|
||||
PUTimeToPlace = PUTimeToPlace - dt
|
||||
--print(PUTimeToPlace)
|
||||
if PUTimeToPlace <= 0 then
|
||||
local w, h = love.graphics.getDimensions()
|
||||
local ranx = love.math.random(30, w)
|
||||
local rany = love.math.random(100, h)
|
||||
local newPU = PowerUp("speed", ranx, rany, "assets/powerup.jpeg", 10)
|
||||
table.insert(PowerUps, newPU)
|
||||
PUTimeToPlace = _G.PU_TIMER --reset
|
||||
end
|
||||
|
||||
UserPlayer1:handleKeys("w", "s", "a", "d", dt)
|
||||
UserPlayer2:handleKeys("up", "down", "left", "right", dt)
|
||||
UserPlayer1:updateCol()
|
||||
|
||||
+8
-31
@@ -1,43 +1,20 @@
|
||||
local function button(x, y, w, h, text, selected)
|
||||
--x,y is the top left corner of the button
|
||||
local rounding = 30 -- used for rounding the buttons
|
||||
|
||||
if not selected then
|
||||
love.graphics.setColor(love.math.colorFromBytes(41, 134, 204))
|
||||
elseif selected then
|
||||
love.graphics.setColor(love.math.colorFromBytes(244, 67, 54))
|
||||
end
|
||||
-- Draw rectangle
|
||||
love.graphics.rectangle("line", x, y, w, h, rounding, rounding)
|
||||
|
||||
-- Get width and height of text
|
||||
local tw = MenuFont:getWidth(text)
|
||||
local th = MenuFont:getHeight(text)
|
||||
-- Calculate position to center the text
|
||||
local textX = x + (w - tw) / 2
|
||||
local textY = y + (h - th) / 2
|
||||
-- Place text inside the rectangle
|
||||
love.graphics.setFont(MenuFont)
|
||||
love.graphics.print(text, textX, textY)
|
||||
end
|
||||
|
||||
local function title()
|
||||
local height = love.graphics.getHeight()
|
||||
local width = love.graphics.getWidth()
|
||||
local height = love.graphics.getHeight() / _G.Y_SCALE
|
||||
local width = love.graphics.getWidth() / _G.X_SCALE
|
||||
love.graphics.setFont(GameFont)
|
||||
love.graphics.setColor(0.5, 1, 1)
|
||||
love.graphics.rectangle("fill", 0, 0, width, height)
|
||||
love.graphics.setColor(0, 0, 0)
|
||||
love.graphics.print("MENU", 100, 100)
|
||||
love.graphics.print("Tanks-A-Lot", 100, 100)
|
||||
end
|
||||
|
||||
function DrawMenu()
|
||||
local bwidth, bheight = 300, 140
|
||||
local bwidth, bheight = 300 * _G.X_SCALE, 140 * _G.Y_SCALE
|
||||
title()
|
||||
button(100, 200, bwidth, bheight, "Play", MENU_POS == 0 and true or false)
|
||||
button(100, 350, bwidth, bheight, "???", MENU_POS == 1 and true or false)
|
||||
button(100, 500, bwidth, bheight, "???", MENU_POS == 2 and true or false)
|
||||
button(100, 650, bwidth, bheight, "Quit", MENU_POS == 3 and true or false)
|
||||
GUI:newButton(100, 200, bwidth, bheight, "Play", MENU_POS == 0 and true or false)
|
||||
GUI:newButton(100, 350, bwidth, bheight, "???", MENU_POS == 1 and true or false)
|
||||
GUI:newButton(100, 500, bwidth, bheight, "???", MENU_POS == 2 and true or false)
|
||||
GUI:newButton(100, 650, bwidth, bheight, "Quit", MENU_POS == 3 and true or false)
|
||||
|
||||
love.graphics.setColor(255, 255, 255) -- reset colours
|
||||
end
|
||||
|
||||
+13
-4
@@ -7,12 +7,12 @@ function MenuKeyPressed(key)
|
||||
if MENU_POS == 0 then
|
||||
--Change state to GAME!
|
||||
_G.GAMESTATE = "GAME"
|
||||
print("STATE CHANEGD: GAME!")
|
||||
--print("STATE CHANEGD: GAME!")
|
||||
musicMenu:stop()
|
||||
elseif MENU_POS == 1 then
|
||||
print("STATE CHANEGD: DUNNO!")
|
||||
--print("STATE CHANEGD: DUNNO!")
|
||||
elseif MENU_POS == 2 then
|
||||
print("STATE CHANEGD: DUNNO!")
|
||||
--print("STATE CHANEGD: DUNNO!")
|
||||
elseif MENU_POS == 3 then
|
||||
love.event.quit()
|
||||
end
|
||||
@@ -38,8 +38,17 @@ function MenuKeyPressed(key)
|
||||
musicBattle:stop()
|
||||
musicMenu:stop()
|
||||
musicPause:stop()
|
||||
musicStory:stop()
|
||||
_G.GAMESTATE = "MENU"
|
||||
love.load()
|
||||
end
|
||||
|
||||
if key == "m" then
|
||||
MUTED = not MUTED
|
||||
|
||||
if MUTED then
|
||||
musicMenu:setVolume(0)
|
||||
else
|
||||
musicMenu:setVolume(0.5)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
+7
-30
@@ -1,32 +1,8 @@
|
||||
local function button(x, y, w, h, text, selected)
|
||||
--x,y is the top left corner of the button
|
||||
local rounding = 30 -- used for rounding the buttons
|
||||
|
||||
if not selected then
|
||||
love.graphics.setColor(love.math.colorFromBytes(41, 134, 204))
|
||||
elseif selected then
|
||||
love.graphics.setColor(love.math.colorFromBytes(244, 67, 54))
|
||||
end
|
||||
-- Draw rectangle
|
||||
love.graphics.rectangle("fill", x, y, w, h, rounding, rounding)
|
||||
|
||||
-- Get width and height of text
|
||||
local tw = MenuFont:getWidth(text)
|
||||
local th = MenuFont:getHeight(text)
|
||||
-- Calculate position to center the text
|
||||
local textX = x + (w - tw) / 2
|
||||
local textY = y + (h - th) / 2
|
||||
-- Place text inside the rectangle
|
||||
love.graphics.setFont(MenuFont)
|
||||
love.graphics.setColor(1, 1, 1) -- reset colours
|
||||
love.graphics.print(text, textX, textY)
|
||||
end
|
||||
|
||||
function DrawPause()
|
||||
local opacity = 0.3
|
||||
local height = love.graphics.getHeight()
|
||||
local width = love.graphics.getWidth()
|
||||
local bwidth, bheight = 300, 140
|
||||
local height = love.graphics.getHeight() / _G.Y_SCALE
|
||||
local width = love.graphics.getWidth() / _G.X_SCALE
|
||||
local bwidth, bheight = 300 * _G.X_SCALE, 140 * _G.Y_SCALE
|
||||
love.graphics.setFont(GameFont)
|
||||
|
||||
DrawGame() --Draw a single frame of the game
|
||||
@@ -37,8 +13,9 @@ function DrawPause()
|
||||
love.graphics.print("PAUSED", 100, 100)
|
||||
--love.graphics.print("" .. PAUSE_POS, 200,200)
|
||||
|
||||
button(100, 200, bwidth, bheight, "Return", PAUSE_POS == 0 and true or false)
|
||||
button(100, 350, bwidth, bheight, "Menu", PAUSE_POS == 1 and true or false)
|
||||
button(100, 500, bwidth, bheight, "Quit", PAUSE_POS == 2 and true or false)
|
||||
GUI:newButton(100, 200, bwidth, bheight, "Back", PAUSE_POS == 0 and true or false)
|
||||
GUI:newButton(100, 350, bwidth, bheight, "Menu", PAUSE_POS == 1 and true or false)
|
||||
GUI:newButton(100, 500, bwidth, bheight, "Quit", PAUSE_POS == 2 and true or false)
|
||||
|
||||
love.graphics.setColor(255, 255, 255) -- reset colours
|
||||
end
|
||||
|
||||
@@ -1,20 +1,42 @@
|
||||
function PauseKeyPressed(key)
|
||||
if key == "return" then
|
||||
if key == "escape" then
|
||||
-- quickly return to the game
|
||||
if not _G.MUTED then
|
||||
musicBattle:setVolume(0.5)
|
||||
musicPause:setVolume(0)
|
||||
else
|
||||
musicBattle:setVolume(0)
|
||||
musicPause:setVolume(0)
|
||||
end
|
||||
_G.GAMESTATE = "GAME"
|
||||
end
|
||||
|
||||
if key == "return" then
|
||||
-- quickly return to the game
|
||||
if not _G.MUTED then
|
||||
musicBattle:setVolume(0.5)
|
||||
musicPause:setVolume(0)
|
||||
else
|
||||
musicBattle:setVolume(0)
|
||||
musicPause:setVolume(0)
|
||||
end
|
||||
-- 0 Return to game
|
||||
-- 1 Quit
|
||||
if PAUSE_POS == 0 then
|
||||
-- unpause the game
|
||||
_G.GAMESTATE = "GAME"
|
||||
print("STATE CHANEGD: GAME!")
|
||||
--print("STATE CHANEGD: GAME!")
|
||||
_G.PAUSED = false
|
||||
if not MUTED then
|
||||
musicBattle:setVolume(0.5)
|
||||
musicPause:setVolume(0)
|
||||
else
|
||||
musicBattle:setVolume(0)
|
||||
musicPause:setVolume(0)
|
||||
end
|
||||
elseif PAUSE_POS == 1 then
|
||||
_G.GAMESTATE = "MENU"
|
||||
print("STATE CHANEGD: MENU!")
|
||||
--print("STATE CHANEGD: MENU!")
|
||||
_G.PAUSED = false
|
||||
musicPause:stop()
|
||||
musicBattle:stop()
|
||||
|
||||
+10
-4
@@ -1,12 +1,13 @@
|
||||
local function winner()
|
||||
local width = love.graphics.getWidth()
|
||||
local height = love.graphics.getHeight()
|
||||
local width = love.graphics.getWidth() / _G.X_SCALE
|
||||
local height = love.graphics.getHeight() / _G.Y_SCALE
|
||||
local opacity = 0.3
|
||||
local s = ""
|
||||
|
||||
if _G.P1_WIN then
|
||||
s = "P1 Win! R - Restart"
|
||||
elseif _G.P2_WIN then
|
||||
end
|
||||
if _G.P2_WIN then
|
||||
s = "P2 Win! R - Restart"
|
||||
end
|
||||
|
||||
@@ -23,7 +24,12 @@ local function winner()
|
||||
|
||||
love.graphics.setFont(MenuFont)
|
||||
love.graphics.setColor(1, 1, 1) -- white
|
||||
love.graphics.print(s, centreX - sw / 2, centreY - sh / 2)
|
||||
love.graphics.print(s, centreX - sw / 2, centreY - sh / 2) -- who won
|
||||
love.graphics.print(
|
||||
"" .. _G.P1_COUNT .. ":" .. "" .. _G.P2_COUNT,
|
||||
(centreX - sw / 2),
|
||||
(centreY - sh / 2) - sh / 1.5
|
||||
) -- score
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
+60
-19
@@ -1,7 +1,9 @@
|
||||
Bullet = Object:extend()
|
||||
cos = math.cos
|
||||
sin = math.sin --optimisation
|
||||
pi = math.pi
|
||||
local pi = math.pi
|
||||
local cos = math.cos
|
||||
local sin = math.sin
|
||||
local atan = math.atan
|
||||
local deg = math.deg
|
||||
|
||||
function Bullet:new(x, y, p, speed, rotation)
|
||||
self.image = love.graphics.newImage("assets/bullet.png")
|
||||
@@ -20,9 +22,13 @@ function Bullet:new(x, y, p, speed, rotation)
|
||||
self.originY = self.height / 2
|
||||
|
||||
self.collider = World:newCircleCollider(x, y, 10)
|
||||
--self.collider = World:newRectangleCollider(x, y, 10, 10)
|
||||
--self.collider:setType("")
|
||||
self.collider:setFixedRotation(true)
|
||||
self.collider:setPosition(self.x, self.y)
|
||||
|
||||
self.bounce = 0 -- how many times this bullet has bounced
|
||||
|
||||
if self.p == 1 then
|
||||
self.collider:setCollisionClass("Bullet1")
|
||||
elseif self.p == 2 then
|
||||
@@ -31,34 +37,69 @@ function Bullet:new(x, y, p, speed, rotation)
|
||||
end
|
||||
|
||||
function Bullet:update(dt)
|
||||
--If a bullet hits a wall, make it bounce off the wall and change its rotation
|
||||
if self.p == 1 then
|
||||
-- Calculate the velocity
|
||||
local dx = math.cos(self.rotation) * self.speed * dt
|
||||
local dy = math.sin(self.rotation) * self.speed * dt
|
||||
|
||||
-- Check for collisions
|
||||
if self.collider:enter("Wall") then
|
||||
--calculate normal of the wall
|
||||
--calculate the angle of reflection
|
||||
local angle = (math.atan2(dx, dy))
|
||||
--get normal of the wall without using getNormal()
|
||||
self.bounce = self.bounce + 1
|
||||
|
||||
----TODO: fix this
|
||||
-- Get the collision normal
|
||||
local collision_data = self.collider:getEnterCollisionData("Wall")
|
||||
local contact = collision_data.contact
|
||||
local normal_x, normal_y = contact:getNormal()
|
||||
|
||||
--set the new angle
|
||||
self.rotation = angle
|
||||
self.collider:setAngle(self.rotation)
|
||||
-- Debug print to verify normal values
|
||||
--print("---------------------------------")
|
||||
--print("Collision detected!")
|
||||
--print("Normal X:", normal_x, "Normal Y:", normal_y)
|
||||
--print("Initial Velocity X:", dx, "Initial Velocity Y:", dy)
|
||||
--print("Initial Angle: ", self.rotation)
|
||||
|
||||
-- Reflect the velocity using the normal
|
||||
local dot_product = dx * normal_x + dy * normal_y
|
||||
dx = dx - 2 * dot_product * normal_x
|
||||
dy = dy - 2 * dot_product * normal_y
|
||||
--print("################################")
|
||||
|
||||
-- Debug print to verify reflected velocity
|
||||
--print("Reflected Velocity X:", dx, "Reflected Velocity Y:", dy)
|
||||
self.rotation = deg(atan(dy, dx))
|
||||
|
||||
-- Update the rotation based on the new velocity direction
|
||||
--self.rotation = deg(atan(dy, dx))
|
||||
--print("Reflected Angle (radians):", self.rotation)
|
||||
--print("Reflected Angle (degrees):", self.rotation)
|
||||
--print("---------------------------------")
|
||||
end
|
||||
|
||||
-- Set the linear velocity of the collider
|
||||
self.collider:setLinearVelocity(dx, dy)
|
||||
|
||||
-- Update position
|
||||
self.x = self.collider:getX()
|
||||
self.y = self.collider:getY()
|
||||
end
|
||||
|
||||
--[[
|
||||
function Bullet:update(dt)
|
||||
local normal_x, normal_y = 0, 0
|
||||
local dx, dy = 0, 0
|
||||
if self.p == 1 or self.p == 2 then
|
||||
if self.collider:enter("Wall") then
|
||||
self.collider:setLinearVelocity(dx, dy)
|
||||
else
|
||||
dx = cos(self.rotation) * self.speed * dt
|
||||
dy = sin(self.rotation) * self.speed * dt
|
||||
self.collider:setLinearVelocity(dx, dy)
|
||||
end
|
||||
|
||||
if self.p == 2 then
|
||||
local dx = cos(self.rotation) * self.speed * dt
|
||||
local dy = sin(self.rotation) * self.speed * dt
|
||||
self.collider:setLinearVelocity(dx, dy)
|
||||
end
|
||||
|
||||
-- Update position
|
||||
self.x = self.collider:getX()
|
||||
self.y = self.collider:getY()
|
||||
end
|
||||
]]
|
||||
|
||||
function Bullet:draw()
|
||||
for _, _ in ipairs(Bullets1) do
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
--Config file for the game
|
||||
function love.conf(t)
|
||||
--t.window.width = 1366
|
||||
--t.window.height = 768
|
||||
|
||||
t.window.width = 1600
|
||||
t.window.height = 960
|
||||
|
||||
t.window.title = "Tanks-A-Lot"
|
||||
t.window.resizable = true
|
||||
t.version = "11.5"
|
||||
end
|
||||
|
||||
+28
-2
@@ -1,3 +1,16 @@
|
||||
-- WINDOW SCALE
|
||||
-- Used to scale the game up or down
|
||||
-- (scales STI world map and Walls in the game! )
|
||||
-- (see debug for more)
|
||||
X_SCALE = 1
|
||||
Y_SCALE = 1
|
||||
|
||||
-- TILE SCALE
|
||||
-- Since this game is put together rather badly
|
||||
-- the game world is 1600x960
|
||||
GAME_WORLD_DIM_WIDTH = 1600
|
||||
GAME_WORLD_DIM_HEIGHT = 960
|
||||
|
||||
--[[
|
||||
* Game states:
|
||||
* - MENU
|
||||
@@ -8,6 +21,9 @@
|
||||
--
|
||||
GAMESTATE = "MENU"
|
||||
|
||||
-- Mute for game
|
||||
MUTED = false
|
||||
|
||||
MENU_POS = 0
|
||||
MENU_MAX = 3 --0 play, 1 ?, 2 ?, 3 quit
|
||||
|
||||
@@ -16,13 +32,23 @@ PAUSE_POS = 0
|
||||
PAUSE_MAX = 2 -- 0 resume, 1 menu, 2 quit
|
||||
|
||||
BULLETS_MAX = 10 -- MAX amount of bullets a player can shoot
|
||||
--BULLETS_BOUCE_MAX = 7 -- MAX amount of bounces before exploding!
|
||||
BULLETS_LIFETIME = 50
|
||||
BULLETS_BOUNCE_MAX = 10 -- MAX amount of bounces before exploding!
|
||||
BULLETS_LIFETIME = 50 --TODO: impl. lifetime for a bullet!
|
||||
|
||||
-- Power up timer
|
||||
PU_TIMER = 10
|
||||
|
||||
-- WIN flags for P1 and P2
|
||||
P1_WIN = false
|
||||
P2_WIN = false
|
||||
|
||||
-- Default speeds for bullets and player
|
||||
DEFAULT_P_SPEED = 12000
|
||||
DEFAULT_B_SPEED = 22000
|
||||
|
||||
-- WIN counts!
|
||||
P1_COUNT = 0
|
||||
P2_COUNT = 0
|
||||
|
||||
-- Current Level
|
||||
CUR_LEVEL = 1
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
GUI = Object:extend()
|
||||
|
||||
function GUI:new() end
|
||||
|
||||
function GUI:newButton(x, y, w, h, text, selected)
|
||||
love.graphics.setColor(255, 255, 255) -- reset colours
|
||||
|
||||
--x,y is the top left corner of the button
|
||||
local rounding = 30 -- used for rounding the buttons
|
||||
local xoff = x + 10
|
||||
local yoff = y - 10
|
||||
local textX, textY = 0, 0
|
||||
-- Get width and height of text
|
||||
local tw = MenuFont:getWidth(text)
|
||||
local th = MenuFont:getHeight(text)
|
||||
love.graphics.setFont(MenuFont)
|
||||
|
||||
if not selected then
|
||||
love.graphics.setColor(love.math.colorFromBytes(41, 134, 204))
|
||||
love.graphics.rectangle("fill", x, y, w, h, rounding, rounding)
|
||||
|
||||
-- Calculate position to center the text
|
||||
textX = x + (w - tw) / 2
|
||||
textY = y + (h - th) / 2
|
||||
-- Place text inside the rectangle
|
||||
love.graphics.setColor(0, 0, 0)
|
||||
love.graphics.print(text, textX, textY)
|
||||
elseif selected then
|
||||
-- If selected, raise the button and draw a shadow
|
||||
love.graphics.setColor(love.math.colorFromBytes(0, 0, 0))
|
||||
love.graphics.rectangle("fill", x, y, w, h, rounding, rounding) -- shadow
|
||||
|
||||
love.graphics.setColor(love.math.colorFromBytes(244, 67, 54))
|
||||
love.graphics.rectangle("fill", xoff, yoff, w, h, rounding, rounding) -- button offset
|
||||
|
||||
-- Calculate position to center the text
|
||||
textX = xoff + (w - tw) / 2
|
||||
textY = yoff + (h - th) / 2
|
||||
-- Place text inside the rectangle
|
||||
love.graphics.setColor(1, 1, 1)
|
||||
love.graphics.print(text, textX, textY)
|
||||
end
|
||||
end
|
||||
@@ -1,195 +0,0 @@
|
||||
local clock = os.clock
|
||||
|
||||
--- Simple profiler written in Lua.
|
||||
-- @module profile
|
||||
-- @alias profile
|
||||
local profile = {}
|
||||
|
||||
-- function labels
|
||||
local _labeled = {}
|
||||
-- function definitions
|
||||
local _defined = {}
|
||||
-- time of last call
|
||||
local _tcalled = {}
|
||||
-- total execution time
|
||||
local _telapsed = {}
|
||||
-- number of calls
|
||||
local _ncalls = {}
|
||||
-- list of internal profiler functions
|
||||
local _internal = {}
|
||||
|
||||
--- This is an internal function.
|
||||
-- @tparam string event Event type
|
||||
-- @tparam number line Line number
|
||||
-- @tparam[opt] table info Debug info table
|
||||
function profile.hooker(event, line, info)
|
||||
info = info or debug.getinfo(2, "fnS")
|
||||
local f = info.func
|
||||
-- ignore the profiler itself
|
||||
if _internal[f] or info.what ~= "Lua" then
|
||||
return
|
||||
end
|
||||
-- get the function name if available
|
||||
if info.name then
|
||||
_labeled[f] = info.name
|
||||
end
|
||||
-- find the line definition
|
||||
if not _defined[f] then
|
||||
_defined[f] = info.short_src .. ":" .. info.linedefined
|
||||
_ncalls[f] = 0
|
||||
_telapsed[f] = 0
|
||||
end
|
||||
if _tcalled[f] then
|
||||
local dt = clock() - _tcalled[f]
|
||||
_telapsed[f] = _telapsed[f] + dt
|
||||
_tcalled[f] = nil
|
||||
end
|
||||
if event == "tail call" then
|
||||
local prev = debug.getinfo(3, "fnS")
|
||||
profile.hooker("return", line, prev)
|
||||
profile.hooker("call", line, info)
|
||||
elseif event == "call" then
|
||||
_tcalled[f] = clock()
|
||||
else
|
||||
_ncalls[f] = _ncalls[f] + 1
|
||||
end
|
||||
end
|
||||
|
||||
--- Sets a clock function to be used by the profiler.
|
||||
-- @tparam function func Clock function that returns a number
|
||||
function profile.setclock(f)
|
||||
assert(type(f) == "function", "clock must be a function")
|
||||
clock = f
|
||||
end
|
||||
|
||||
--- Starts collecting data.
|
||||
function profile.start()
|
||||
if rawget(_G, "jit") then
|
||||
jit.off()
|
||||
jit.flush()
|
||||
end
|
||||
debug.sethook(profile.hooker, "cr")
|
||||
end
|
||||
|
||||
--- Stops collecting data.
|
||||
function profile.stop()
|
||||
debug.sethook()
|
||||
for f in pairs(_tcalled) do
|
||||
local dt = clock() - _tcalled[f]
|
||||
_telapsed[f] = _telapsed[f] + dt
|
||||
_tcalled[f] = nil
|
||||
end
|
||||
-- merge closures
|
||||
local lookup = {}
|
||||
for f, d in pairs(_defined) do
|
||||
local id = (_labeled[f] or "?") .. d
|
||||
local f2 = lookup[id]
|
||||
if f2 then
|
||||
_ncalls[f2] = _ncalls[f2] + (_ncalls[f] or 0)
|
||||
_telapsed[f2] = _telapsed[f2] + (_telapsed[f] or 0)
|
||||
_defined[f], _labeled[f] = nil, nil
|
||||
_ncalls[f], _telapsed[f] = nil, nil
|
||||
else
|
||||
lookup[id] = f
|
||||
end
|
||||
end
|
||||
collectgarbage("collect")
|
||||
end
|
||||
|
||||
--- Resets all collected data.
|
||||
function profile.reset()
|
||||
for f in pairs(_ncalls) do
|
||||
_ncalls[f] = 0
|
||||
end
|
||||
for f in pairs(_telapsed) do
|
||||
_telapsed[f] = 0
|
||||
end
|
||||
for f in pairs(_tcalled) do
|
||||
_tcalled[f] = nil
|
||||
end
|
||||
collectgarbage("collect")
|
||||
end
|
||||
|
||||
--- This is an internal function.
|
||||
-- @tparam function a First function
|
||||
-- @tparam function b Second function
|
||||
-- @treturn boolean True if "a" should rank higher than "b"
|
||||
function profile.comp(a, b)
|
||||
local dt = _telapsed[b] - _telapsed[a]
|
||||
if dt == 0 then
|
||||
return _ncalls[b] < _ncalls[a]
|
||||
end
|
||||
return dt < 0
|
||||
end
|
||||
|
||||
--- Generates a report of functions that have been called since the profile was started.
|
||||
-- Returns the report as a numeric table of rows containing the rank, function label, number of calls, total execution time and source code line number.
|
||||
-- @tparam[opt] number limit Maximum number of rows
|
||||
-- @treturn table Table of rows
|
||||
function profile.query(limit)
|
||||
local t = {}
|
||||
for f, n in pairs(_ncalls) do
|
||||
if n > 0 then
|
||||
t[#t + 1] = f
|
||||
end
|
||||
end
|
||||
table.sort(t, profile.comp)
|
||||
if limit then
|
||||
while #t > limit do
|
||||
table.remove(t)
|
||||
end
|
||||
end
|
||||
for i, f in ipairs(t) do
|
||||
local dt = 0
|
||||
if _tcalled[f] then
|
||||
dt = clock() - _tcalled[f]
|
||||
end
|
||||
t[i] = { i, _labeled[f] or "?", _ncalls[f], _telapsed[f] + dt, _defined[f] }
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
local cols = { 3, 29, 11, 24, 32 }
|
||||
|
||||
--- Generates a text report of functions that have been called since the profile was started.
|
||||
-- Returns the report as a string that can be printed to the console.
|
||||
-- @tparam[opt] number limit Maximum number of rows
|
||||
-- @treturn string Text-based profiling report
|
||||
function profile.report(n)
|
||||
local out = {}
|
||||
local report = profile.query(n)
|
||||
for i, row in ipairs(report) do
|
||||
for j = 1, 5 do
|
||||
local s = row[j]
|
||||
local l2 = cols[j]
|
||||
s = tostring(s)
|
||||
local l1 = s:len()
|
||||
if l1 < l2 then
|
||||
s = s .. (" "):rep(l2 - l1)
|
||||
elseif l1 > l2 then
|
||||
s = s:sub(l1 - l2 + 1, l1)
|
||||
end
|
||||
row[j] = s
|
||||
end
|
||||
out[i] = table.concat(row, " | ")
|
||||
end
|
||||
|
||||
local row =
|
||||
" +-----+-------------------------------+-------------+--------------------------+----------------------------------+ \n"
|
||||
local col =
|
||||
" | # | Function | Calls | Time | Code | \n"
|
||||
local sz = row .. col .. row
|
||||
if #out > 0 then
|
||||
sz = sz .. " | " .. table.concat(out, " | \n | ") .. " | \n"
|
||||
end
|
||||
return "\n" .. sz .. row
|
||||
end
|
||||
|
||||
-- store all internal profiler functions
|
||||
for _, v in pairs(profile) do
|
||||
if type(v) == "function" then
|
||||
_internal[v] = true
|
||||
end
|
||||
end
|
||||
|
||||
return profile
|
||||
@@ -1,49 +0,0 @@
|
||||
-- Functions to handle restarting
|
||||
-- all objects
|
||||
-- Used in map switching and restarting!
|
||||
|
||||
function ClearWalls()
|
||||
for w in pairs(Walls) do
|
||||
Walls[w] = nil
|
||||
end
|
||||
|
||||
Walls = {}
|
||||
end
|
||||
|
||||
function StopAllMusic()
|
||||
-- TODO: maybe find a way
|
||||
-- to find all 'streaming'
|
||||
-- sounds and then stop them all!
|
||||
musicBattle:stop()
|
||||
musicMenu:stop()
|
||||
musicPause:stop()
|
||||
--musicStory:stop() -- Unused
|
||||
end
|
||||
|
||||
function ClearPlayerCollision()
|
||||
UserPlayer1.collider:destroy()
|
||||
UserPlayer2.collider:destroy()
|
||||
end
|
||||
|
||||
function ClearBullets(bullets)
|
||||
for i, v in ipairs(bullets) do
|
||||
v.collider:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
function RestartGame()
|
||||
-- Stop the music
|
||||
StopAllMusic()
|
||||
|
||||
-- Clear the players collision
|
||||
ClearPlayerCollision()
|
||||
|
||||
-- Work through and delete all bullets
|
||||
ClearBullets(Bullets1)
|
||||
ClearBullets(Bullets2)
|
||||
|
||||
--Clear Walls
|
||||
--ClearWalls()
|
||||
|
||||
-- Done!
|
||||
end
|
||||
@@ -1,14 +1,59 @@
|
||||
Object = require("libs/classic")
|
||||
|
||||
require("constants")
|
||||
WF = require("libs/windfield")
|
||||
STI = require("libs/sti")
|
||||
|
||||
World = WF.newWorld(0, 0) --no gravity
|
||||
World:setQueryDebugDrawing(true) -- Draws the area of a query for 10 frames
|
||||
--World:setQueryDebugDrawing(true) -- Draws the area of a query for 10 frames
|
||||
World:addCollisionClass("Player1")
|
||||
World:addCollisionClass("Bullet1")
|
||||
World:addCollisionClass("Player2")
|
||||
World:addCollisionClass("Bullet2")
|
||||
World:addCollisionClass("Wall")
|
||||
World:addCollisionClass("PowerUp")
|
||||
|
||||
require("gui")
|
||||
require("powerups/powerup")
|
||||
require("powerups/speed")
|
||||
require("restart")
|
||||
require("truncate")
|
||||
require("player")
|
||||
require("bullet")
|
||||
require("mapsloader")
|
||||
|
||||
require("Game/UpdateGame")
|
||||
require("Menu/UpdateMenu")
|
||||
require("Pause/UpdatePause")
|
||||
require("Win/UpdateWin")
|
||||
|
||||
require("Game/DrawGame")
|
||||
require("Menu/DrawMenu")
|
||||
require("Pause/DrawPause")
|
||||
require("Win/DrawWin")
|
||||
|
||||
require("Game/GameKeyPressed")
|
||||
require("Menu/MenuKeyPressed")
|
||||
require("Pause/PauseKeyPressed")
|
||||
require("Win/WinKeyPressed")
|
||||
|
||||
--Fonts used in the game
|
||||
GameFont = love.graphics.newFont("assets/Daydream.ttf", 60)
|
||||
DebugFont = love.graphics.newFont("assets/Daydream.ttf", 12)
|
||||
MenuFont = love.graphics.newFont("assets/Daydream.ttf", 45)
|
||||
Walls = {}
|
||||
|
||||
-- Music streaming
|
||||
musicMenu = love.audio.newSource("music/menu.mp3", "stream") or nil
|
||||
musicBattle = love.audio.newSource("music/battle.mp3", "stream") or nil
|
||||
--musicStory = love.audio.newSource("music/story.mp3", "stream") or nil
|
||||
|
||||
musicPause = musicBattle:clone()
|
||||
musicPause:setFilter({
|
||||
type = "lowpass",
|
||||
volume = 0.7,
|
||||
highgain = 0.4,
|
||||
})
|
||||
|
||||
function love.run()
|
||||
if love.load then
|
||||
@@ -64,70 +109,46 @@ function love.run()
|
||||
end
|
||||
end
|
||||
|
||||
function love.resized()
|
||||
--TOD0: fix scaling!
|
||||
end
|
||||
|
||||
function love.load()
|
||||
Object = require("libs/classic")
|
||||
require("libs/restart")
|
||||
require("player")
|
||||
require("bullet")
|
||||
require("mapsloader")
|
||||
-- Set a random seed
|
||||
love.math.setRandomSeed(love.timer.getTime())
|
||||
-- Figure out the X_SCALE and Y_SCALE
|
||||
local curWidth, curHeight = love.graphics.getDimensions()
|
||||
_G.X_SCALE = truncate(curWidth / GAME_WORLD_DIM_WIDTH, 3)
|
||||
_G.Y_SCALE = truncate(curHeight / GAME_WORLD_DIM_HEIGHT, 3)
|
||||
|
||||
require("Game/UpdateGame")
|
||||
require("Menu/UpdateMenu")
|
||||
require("Pause/UpdatePause")
|
||||
require("Win/UpdateWin")
|
||||
|
||||
require("Game/DrawGame")
|
||||
require("Menu/DrawMenu")
|
||||
require("Pause/DrawPause")
|
||||
require("Win/DrawWin")
|
||||
|
||||
require("Game/GameKeyPressed")
|
||||
require("Menu/MenuKeyPressed")
|
||||
require("Pause/PauseKeyPressed")
|
||||
require("Win/WinKeyPressed")
|
||||
|
||||
--Fonts used in the game
|
||||
GameFont = love.graphics.newFont("assets/Daydream.ttf", 60)
|
||||
DebugFont = love.graphics.newFont("assets/Daydream.ttf", 12)
|
||||
MenuFont = love.graphics.newFont("assets/Daydream.ttf", 45)
|
||||
|
||||
--Game consts
|
||||
--Game values (reset after each load)
|
||||
HEALTH = 3
|
||||
DELAY = 0.5
|
||||
P1_DELAY = 0.5
|
||||
P2_DELAY = 0.5
|
||||
|
||||
--Bullet lists
|
||||
Bullets1 = {}
|
||||
Bullets2 = {}
|
||||
|
||||
Walls = {}
|
||||
--PowerUp stuff
|
||||
PowerUps = {}
|
||||
PUTimeToPlace = _G.PU_TIMER
|
||||
|
||||
DebugFlag = false
|
||||
EnableKeyPress1 = true
|
||||
KeyPressTime1 = 0
|
||||
KeyDelay1 = DELAY
|
||||
KeyDelay1 = P1_DELAY
|
||||
|
||||
EnableKeyPress2 = true
|
||||
KeyPressTime2 = 0
|
||||
KeyDelay2 = DELAY
|
||||
KeyDelay2 = P2_DELAY
|
||||
|
||||
local playerSpeed = 12000
|
||||
UserPlayer1 = Player(1, 1000, 100, HEALTH, "assets/player1.png", playerSpeed)
|
||||
UserPlayer2 = Player(2, 200, 300, HEALTH, "assets/player2.png", playerSpeed)
|
||||
|
||||
-- Music streaming
|
||||
musicMenu = love.audio.newSource("music/menu.mp3", "stream") or nil
|
||||
musicBattle = love.audio.newSource("music/battle.mp3", "stream") or nil
|
||||
--musicStory = love.audio.newSource("music/story.mp3", "stream") or nil
|
||||
|
||||
musicPause = musicBattle:clone()
|
||||
musicPause:setFilter({
|
||||
type = "lowpass",
|
||||
volume = 0.7,
|
||||
highgain = 0.4,
|
||||
})
|
||||
--TODO: two player speeds for upgrades
|
||||
UserPlayer1 = Player(1, 1000, 100, HEALTH, "assets/player1.png", 12000)
|
||||
UserPlayer2 = Player(2, 200, 300, HEALTH, "assets/player2.png", 12000)
|
||||
|
||||
--STI Map loading
|
||||
LoadMap(1)
|
||||
LoadMap(_G.CUR_LEVEL)
|
||||
end
|
||||
|
||||
function love.keypressed(key)
|
||||
@@ -149,7 +170,7 @@ function love.update(dt)
|
||||
if _G.GAMESTATE == "MENU" then
|
||||
UpdateMenu(dt)
|
||||
-- Handle music
|
||||
if not musicMenu:isPlaying() then
|
||||
if not musicMenu:isPlaying() and not _G.MUTED then
|
||||
musicMenu:setVolume(0.5)
|
||||
love.audio.play(musicMenu)
|
||||
end
|
||||
@@ -157,9 +178,9 @@ function love.update(dt)
|
||||
if _G.GAMESTATE == "PAUSE" then
|
||||
UpdatePause(dt)
|
||||
-- Handle music
|
||||
if not musicPause:isPlaying() then
|
||||
--musicBattle:setVolume(0)
|
||||
--musicPause:setVolume(0.5)
|
||||
if not musicPause:isPlaying() and not _G.MUTED then
|
||||
musicBattle:setVolume(0)
|
||||
musicPause:setVolume(0.5)
|
||||
love.audio.play(musicBattle)
|
||||
love.audio.play(musicPause)
|
||||
end
|
||||
@@ -167,9 +188,9 @@ function love.update(dt)
|
||||
if _G.GAMESTATE == "GAME" then
|
||||
UpdateGame(dt)
|
||||
-- Handle music
|
||||
if not musicBattle:isPlaying() then
|
||||
--musicBattle:setVolume(0.5)
|
||||
--musicPause:setVolume(0)
|
||||
if not musicBattle:isPlaying() and not _G.MUTED then
|
||||
musicBattle:setVolume(0.5)
|
||||
musicPause:setVolume(0)
|
||||
love.audio.play(musicBattle)
|
||||
love.audio.play(musicPause)
|
||||
end
|
||||
@@ -188,11 +209,6 @@ function love.draw()
|
||||
end
|
||||
if _G.GAMESTATE == "GAME" then
|
||||
DrawGame()
|
||||
if DebugFlag then
|
||||
love.graphics.setFont(DebugFont)
|
||||
love.graphics.print("Debug Mode", 1200, 850)
|
||||
love.graphics.print("" .. GAMESTATE, 200, 200)
|
||||
end
|
||||
end
|
||||
if _G.GAMESTATE == "WIN" then
|
||||
DrawWin()
|
||||
|
||||
+290
@@ -0,0 +1,290 @@
|
||||
return {
|
||||
version = "1.10",
|
||||
luaversion = "5.1",
|
||||
tiledversion = "1.11.0",
|
||||
class = "",
|
||||
orientation = "orthogonal",
|
||||
renderorder = "right-down",
|
||||
width = 25,
|
||||
height = 15,
|
||||
tilewidth = 64,
|
||||
tileheight = 64,
|
||||
nextlayerid = 4,
|
||||
nextobjectid = 16,
|
||||
properties = {},
|
||||
tilesets = {
|
||||
{
|
||||
name = "floor",
|
||||
firstgid = 1,
|
||||
class = "",
|
||||
tilewidth = 64,
|
||||
tileheight = 64,
|
||||
spacing = 0,
|
||||
margin = 0,
|
||||
columns = 9,
|
||||
image = "../assets/tileset.png",
|
||||
imagewidth = 576,
|
||||
imageheight = 384,
|
||||
objectalignment = "unspecified",
|
||||
tilerendersize = "tile",
|
||||
fillmode = "stretch",
|
||||
tileoffset = {
|
||||
x = 0,
|
||||
y = 0
|
||||
},
|
||||
grid = {
|
||||
orientation = "orthogonal",
|
||||
width = 64,
|
||||
height = 64
|
||||
},
|
||||
properties = {},
|
||||
wangsets = {},
|
||||
tilecount = 54,
|
||||
tiles = {}
|
||||
}
|
||||
},
|
||||
layers = {
|
||||
{
|
||||
type = "tilelayer",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 25,
|
||||
height = 15,
|
||||
id = 1,
|
||||
name = "floor",
|
||||
class = "",
|
||||
visible = true,
|
||||
opacity = 1,
|
||||
offsetx = 0,
|
||||
offsety = 0,
|
||||
parallaxx = 1,
|
||||
parallaxy = 1,
|
||||
properties = {},
|
||||
encoding = "lua",
|
||||
data = {
|
||||
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21
|
||||
}
|
||||
},
|
||||
{
|
||||
type = "tilelayer",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 25,
|
||||
height = 15,
|
||||
id = 2,
|
||||
name = "inner walls",
|
||||
class = "",
|
||||
visible = true,
|
||||
opacity = 1,
|
||||
offsetx = 0,
|
||||
offsety = 0,
|
||||
parallaxx = 1,
|
||||
parallaxy = 1,
|
||||
properties = {},
|
||||
encoding = "lua",
|
||||
data = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 28, 29, 29, 29, 29, 29, 30, 0, 0, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 37, 38, 38, 38, 38, 38, 39, 0, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 46, 47, 38, 38, 38, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 28, 29, 30, 0, 0, 0, 0, 28, 29, 30, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 46, 47, 48, 0, 0, 0, 0, 46, 47, 48, 0, 0, 0, 0, 37, 38, 39, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 38, 38, 38, 29, 30, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 29, 30, 0, 0, 37, 38, 38, 38, 38, 38, 39, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, 39, 0, 0, 46, 47, 47, 47, 47, 47, 48, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
},
|
||||
{
|
||||
type = "objectgroup",
|
||||
draworder = "topdown",
|
||||
id = 3,
|
||||
name = "Walls",
|
||||
class = "",
|
||||
visible = false,
|
||||
opacity = 1,
|
||||
offsetx = 0,
|
||||
offsety = 0,
|
||||
parallaxx = 1,
|
||||
parallaxy = 1,
|
||||
properties = {},
|
||||
objects = {
|
||||
{
|
||||
id = 1,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 128,
|
||||
y = 128,
|
||||
width = 448,
|
||||
height = 192,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 2,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 256,
|
||||
y = 320,
|
||||
width = 192,
|
||||
height = 320,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 3,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 704,
|
||||
y = 80,
|
||||
width = 192,
|
||||
height = 176,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 4,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 704,
|
||||
y = 320,
|
||||
width = 192,
|
||||
height = 320,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 5,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 704,
|
||||
y = 704,
|
||||
width = 192,
|
||||
height = 192,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 6,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1024,
|
||||
y = 640,
|
||||
width = 448,
|
||||
height = 192,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 7,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1152,
|
||||
y = 320,
|
||||
width = 192,
|
||||
height = 320,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 9,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 1184,
|
||||
height = 16,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 10,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1184,
|
||||
y = 0,
|
||||
width = 416,
|
||||
height = 16,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 11,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1584,
|
||||
y = 0,
|
||||
width = 16,
|
||||
height = 960,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 12,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 0,
|
||||
y = 944,
|
||||
width = 1600,
|
||||
height = 16,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 13,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 16,
|
||||
height = 960,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="25" height="15" tilewidth="64" tileheight="64" infinite="0" nextlayerid="4" nextobjectid="16">
|
||||
<editorsettings>
|
||||
<export target="map2.lua" format="lua"/>
|
||||
</editorsettings>
|
||||
<tileset firstgid="1" name="floor" tilewidth="64" tileheight="64" tilecount="54" columns="9">
|
||||
<image source="../assets/tileset.png" width="576" height="384"/>
|
||||
</tileset>
|
||||
<layer id="1" name="floor" width="25" height="15">
|
||||
<data encoding="csv">
|
||||
1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="inner walls" width="25" height="15">
|
||||
<data encoding="csv">
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,28,29,30,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,28,29,29,29,29,29,30,0,0,37,38,39,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,37,38,38,38,38,38,39,0,0,46,47,48,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,46,47,38,38,38,47,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,37,38,39,0,0,0,0,28,29,30,0,0,0,0,28,29,30,0,0,0,0,
|
||||
0,0,0,0,37,38,39,0,0,0,0,37,38,39,0,0,0,0,37,38,39,0,0,0,0,
|
||||
0,0,0,0,37,38,39,0,0,0,0,37,38,39,0,0,0,0,37,38,39,0,0,0,0,
|
||||
0,0,0,0,37,38,39,0,0,0,0,37,38,39,0,0,0,0,37,38,39,0,0,0,0,
|
||||
0,0,0,0,46,47,48,0,0,0,0,46,47,48,0,0,0,0,37,38,39,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,29,38,38,38,29,30,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,28,29,30,0,0,37,38,38,38,38,38,39,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,37,38,39,0,0,46,47,47,47,47,47,48,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,46,47,48,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="Walls" visible="0">
|
||||
<object id="1" x="128" y="128" width="448" height="192"/>
|
||||
<object id="2" x="256" y="320" width="192" height="320"/>
|
||||
<object id="3" x="704" y="80" width="192" height="176"/>
|
||||
<object id="4" x="704" y="320" width="192" height="320"/>
|
||||
<object id="5" x="704" y="704" width="192" height="192"/>
|
||||
<object id="6" x="1024" y="640" width="448" height="192"/>
|
||||
<object id="7" x="1152" y="320" width="192" height="320"/>
|
||||
<object id="9" x="0" y="0" width="1184" height="16"/>
|
||||
<object id="10" x="1184" y="0" width="416" height="16"/>
|
||||
<object id="11" x="1584" y="0" width="16" height="960"/>
|
||||
<object id="12" x="0" y="944" width="1600" height="16"/>
|
||||
<object id="13" x="0" y="0" width="16" height="960"/>
|
||||
</objectgroup>
|
||||
</map>
|
||||
+368
@@ -0,0 +1,368 @@
|
||||
return {
|
||||
version = "1.10",
|
||||
luaversion = "5.1",
|
||||
tiledversion = "1.11.0",
|
||||
class = "",
|
||||
orientation = "orthogonal",
|
||||
renderorder = "right-down",
|
||||
width = 25,
|
||||
height = 15,
|
||||
tilewidth = 64,
|
||||
tileheight = 64,
|
||||
nextlayerid = 4,
|
||||
nextobjectid = 23,
|
||||
properties = {},
|
||||
tilesets = {
|
||||
{
|
||||
name = "tileset",
|
||||
firstgid = 1,
|
||||
class = "",
|
||||
tilewidth = 64,
|
||||
tileheight = 64,
|
||||
spacing = 0,
|
||||
margin = 0,
|
||||
columns = 9,
|
||||
image = "../assets/tileset.png",
|
||||
imagewidth = 576,
|
||||
imageheight = 384,
|
||||
objectalignment = "unspecified",
|
||||
tilerendersize = "tile",
|
||||
fillmode = "stretch",
|
||||
tileoffset = {
|
||||
x = 0,
|
||||
y = 0
|
||||
},
|
||||
grid = {
|
||||
orientation = "orthogonal",
|
||||
width = 64,
|
||||
height = 64
|
||||
},
|
||||
properties = {},
|
||||
wangsets = {},
|
||||
tilecount = 54,
|
||||
tiles = {}
|
||||
}
|
||||
},
|
||||
layers = {
|
||||
{
|
||||
type = "tilelayer",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 25,
|
||||
height = 15,
|
||||
id = 1,
|
||||
name = "floor",
|
||||
class = "",
|
||||
visible = true,
|
||||
opacity = 1,
|
||||
offsetx = 0,
|
||||
offsety = 0,
|
||||
parallaxx = 1,
|
||||
parallaxy = 1,
|
||||
properties = {},
|
||||
encoding = "lua",
|
||||
data = {
|
||||
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12,
|
||||
19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21
|
||||
}
|
||||
},
|
||||
{
|
||||
type = "tilelayer",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 25,
|
||||
height = 15,
|
||||
id = 2,
|
||||
name = "inner walls",
|
||||
class = "",
|
||||
visible = true,
|
||||
opacity = 1,
|
||||
offsetx = 0,
|
||||
offsety = 0,
|
||||
parallaxx = 1,
|
||||
parallaxy = 1,
|
||||
properties = {},
|
||||
encoding = "lua",
|
||||
data = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 33, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 31, 0, 0, 0,
|
||||
0, 42, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 54, 40, 0, 0, 0,
|
||||
0, 51, 52, 53, 0, 0, 0, 0, 0, 31, 31, 31, 0, 0, 0, 0, 0, 42, 43, 44, 54, 11, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 11, 11, 11, 40, 40, 40, 0, 0, 0, 0, 0, 51, 52, 53, 31, 11, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 32, 32, 32, 33, 34, 35, 31, 31, 0, 0, 0, 54, 54, 31, 40, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 41, 41, 41, 42, 43, 44, 40, 40, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 53, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 33, 34, 34, 34, 35, 0, 0, 0, 0, 41, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 42, 43, 43, 43, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, 54, 54, 0, 0, 0, 0,
|
||||
0, 0, 0, 42, 43, 43, 43, 44, 0, 0, 0, 0, 0, 0, 0, 33, 34, 34, 34, 34, 35, 0, 0, 0, 0,
|
||||
0, 0, 0, 51, 52, 52, 52, 53, 0, 0, 0, 0, 0, 0, 0, 42, 43, 43, 43, 43, 44, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 52, 52, 52, 52, 53, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
},
|
||||
{
|
||||
type = "objectgroup",
|
||||
draworder = "topdown",
|
||||
id = 3,
|
||||
name = "Walls",
|
||||
class = "",
|
||||
visible = false,
|
||||
opacity = 1,
|
||||
offsetx = 0,
|
||||
offsety = 0,
|
||||
parallaxx = 1,
|
||||
parallaxy = 1,
|
||||
properties = {},
|
||||
objects = {
|
||||
{
|
||||
id = 1,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 1600,
|
||||
height = 16,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 2,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1584,
|
||||
y = 0,
|
||||
width = 16,
|
||||
height = 960,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 3,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 0,
|
||||
y = 944,
|
||||
width = 1600,
|
||||
height = 16,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 4,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 0,
|
||||
y = 0,
|
||||
width = 16,
|
||||
height = 960,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 5,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 112,
|
||||
y = 64,
|
||||
width = 96,
|
||||
height = 192,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 6,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 400,
|
||||
y = 368,
|
||||
width = 160,
|
||||
height = 64,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 7,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 576,
|
||||
y = 208,
|
||||
width = 192,
|
||||
height = 96,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 8,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 608,
|
||||
y = 336,
|
||||
width = 128,
|
||||
height = 160,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 10,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 768,
|
||||
y = 336,
|
||||
width = 128,
|
||||
height = 96,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 11,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 768,
|
||||
y = 496,
|
||||
width = 128,
|
||||
height = 64,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 13,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 240,
|
||||
y = 528,
|
||||
width = 224,
|
||||
height = 224,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 14,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1008,
|
||||
y = 656,
|
||||
width = 272,
|
||||
height = 144,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 15,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1168,
|
||||
y = 592,
|
||||
width = 160,
|
||||
height = 32,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 16,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1120,
|
||||
y = 144,
|
||||
width = 128,
|
||||
height = 160,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 17,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1104,
|
||||
y = 336,
|
||||
width = 96,
|
||||
height = 32,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 19,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1216,
|
||||
y = 336,
|
||||
width = 64,
|
||||
height = 96,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 20,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1280,
|
||||
y = 80,
|
||||
width = 64,
|
||||
height = 288,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
},
|
||||
{
|
||||
id = 22,
|
||||
name = "",
|
||||
type = "",
|
||||
shape = "rectangle",
|
||||
x = 1344,
|
||||
y = 80,
|
||||
width = 64,
|
||||
height = 96,
|
||||
rotation = 0,
|
||||
visible = true,
|
||||
properties = {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="25" height="15" tilewidth="64" tileheight="64" infinite="0" nextlayerid="4" nextobjectid="23">
|
||||
<editorsettings>
|
||||
<export target="map3.lua" format="lua"/>
|
||||
</editorsettings>
|
||||
<tileset firstgid="1" name="tileset" tilewidth="64" tileheight="64" tilecount="54" columns="9">
|
||||
<image source="../assets/tileset.png" width="576" height="384"/>
|
||||
</tileset>
|
||||
<layer id="1" name="floor" width="25" height="15">
|
||||
<data encoding="csv">
|
||||
1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,
|
||||
19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21
|
||||
</data>
|
||||
</layer>
|
||||
<layer id="2" name="inner walls" width="25" height="15">
|
||||
<data encoding="csv">
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,33,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,31,0,0,0,
|
||||
0,42,43,44,0,0,0,0,0,0,0,0,0,0,0,0,0,33,34,35,54,40,0,0,0,
|
||||
0,51,52,53,0,0,0,0,0,31,31,31,0,0,0,0,0,42,43,44,54,11,0,0,0,
|
||||
0,0,0,0,0,0,11,11,11,40,40,40,0,0,0,0,0,51,52,53,31,11,0,0,0,
|
||||
0,0,0,0,0,0,32,32,32,33,34,35,31,31,0,0,0,54,54,31,40,0,0,0,0,
|
||||
0,0,0,0,0,0,41,41,41,42,43,44,40,40,0,0,0,0,0,40,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,51,52,53,32,32,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,33,34,34,34,35,0,0,0,0,41,41,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,42,43,43,43,44,0,0,0,0,0,0,0,0,0,0,54,54,54,0,0,0,0,
|
||||
0,0,0,42,43,43,43,44,0,0,0,0,0,0,0,33,34,34,34,34,35,0,0,0,0,
|
||||
0,0,0,51,52,52,52,53,0,0,0,0,0,0,0,42,43,43,43,43,44,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,52,52,52,52,53,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
|
||||
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
|
||||
</data>
|
||||
</layer>
|
||||
<objectgroup id="3" name="Walls" visible="0">
|
||||
<object id="1" x="0" y="0" width="1600" height="16"/>
|
||||
<object id="2" x="1584" y="0" width="16" height="960"/>
|
||||
<object id="3" x="0" y="944" width="1600" height="16"/>
|
||||
<object id="4" x="0" y="0" width="16" height="960"/>
|
||||
<object id="5" x="112" y="64" width="96" height="192"/>
|
||||
<object id="6" x="400" y="368" width="160" height="64"/>
|
||||
<object id="7" x="576" y="208" width="192" height="96"/>
|
||||
<object id="8" x="608" y="336" width="128" height="160"/>
|
||||
<object id="10" x="768" y="336" width="128" height="96"/>
|
||||
<object id="11" x="768" y="496" width="128" height="64"/>
|
||||
<object id="13" x="240" y="528" width="224" height="224"/>
|
||||
<object id="14" x="1008" y="656" width="272" height="144"/>
|
||||
<object id="15" x="1168" y="592" width="160" height="32"/>
|
||||
<object id="16" x="1120" y="144" width="128" height="160"/>
|
||||
<object id="17" x="1104" y="336" width="96" height="32"/>
|
||||
<object id="19" x="1216" y="336" width="64" height="96"/>
|
||||
<object id="20" x="1280" y="80" width="64" height="288"/>
|
||||
<object id="22" x="1344" y="80" width="64" height="96"/>
|
||||
</objectgroup>
|
||||
</map>
|
||||
+3
-3
@@ -1,15 +1,15 @@
|
||||
function LoadMap(lvl)
|
||||
ClearWalls()
|
||||
|
||||
local mapfilelocation = "maps/"
|
||||
local extention = ".lua"
|
||||
local mapname = mapfilelocation .. "map" .. lvl .. extention
|
||||
|
||||
GameMap = STI(mapname)
|
||||
--Walls = {}
|
||||
Walls = {}
|
||||
if GameMap.layers["Walls"] then
|
||||
for _, obj in ipairs(GameMap.layers["Walls"].objects) do
|
||||
local wall = World:newRectangleCollider(obj.x, obj.y, obj.width, obj.height)
|
||||
-- local wall =
|
||||
-- World:newRectangleCollider(obj.x * _G.X_SCALE, obj.y * _G.Y_SCALE, obj.width * _G.X_SCALE, obj.height * _G.Y_SCALE)
|
||||
wall:setType("static")
|
||||
table.insert(Walls, wall)
|
||||
Walls[#Walls]:setCollisionClass("Wall")
|
||||
|
||||
+49
-15
@@ -1,21 +1,28 @@
|
||||
Player = Object:extend()
|
||||
cos = math.cos
|
||||
sin = math.sin --optimisation
|
||||
local cos = math.cos
|
||||
local sin = math.sin --optimisation
|
||||
local max = math.max --optimisation
|
||||
|
||||
-- Constructor for the Player class
|
||||
function Player:new(p, x, y, health, image, speed, max)
|
||||
function Player:new(p, x, y, health, image, speed)
|
||||
self.p = p
|
||||
self.image = love.graphics.newImage(image)
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.health = health
|
||||
self.speed = speed
|
||||
self.max = max
|
||||
self.bulletSpeed = _G.DEFAULT_B_SPEED
|
||||
self.width = self.image:getWidth()
|
||||
self.height = self.image:getHeight()
|
||||
|
||||
--Power up flag
|
||||
self.PUName = ""
|
||||
self.PUTime = 0
|
||||
self.PUOn = false
|
||||
|
||||
-- Collision Stuff
|
||||
self.collider = World:newRectangleCollider(x, y, 64, 64)
|
||||
--self.collider = World:newRectangleCollider(x, y, 50, 62)
|
||||
self.collider = World:newCircleCollider(x, y, 24 * X_SCALE)
|
||||
self.collider:setFixedRotation(true)
|
||||
|
||||
if self.p == 1 then
|
||||
@@ -26,7 +33,9 @@ function Player:new(p, x, y, health, image, speed, max)
|
||||
|
||||
-- Rotation Stuff
|
||||
self.rotation = math.rad(90)
|
||||
self.rotSpeed = 2
|
||||
self.rotSpeed = 3
|
||||
--self.scaleX = 1 * _G.X_SCALE
|
||||
--self.scaleY = 1 * _G.Y_SCALE
|
||||
self.scaleX = 1
|
||||
self.scaleY = 1
|
||||
self.originX = self.width / 2
|
||||
@@ -60,15 +69,17 @@ function Player:handleKeys(up, down, left, right, dt)
|
||||
if love.keyboard.isDown(up) then
|
||||
self.vx = cos(self.rotation) * (self.speed * dt)
|
||||
self.vy = sin(self.rotation) * (self.speed * dt)
|
||||
elseif love.keyboard.isDown(down) then
|
||||
self.vx = cos(self.rotation) * (self.speed * dt) * -1
|
||||
self.vy = sin(self.rotation) * (self.speed * dt) * -1
|
||||
elseif love.keyboard.isDown(left) then
|
||||
end
|
||||
if love.keyboard.isDown(down) then
|
||||
self.vx = cos(self.rotation) * (self.speed / 2 * dt) * -1
|
||||
self.vy = sin(self.rotation) * (self.speed / 2 * dt) * -1
|
||||
end
|
||||
if love.keyboard.isDown(left) then
|
||||
self.rotation = self.rotation - (self.rotSpeed * dt)
|
||||
elseif love.keyboard.isDown(right) then
|
||||
end
|
||||
if love.keyboard.isDown(right) then
|
||||
self.rotation = self.rotation + (self.rotSpeed * dt)
|
||||
end
|
||||
|
||||
self.collider:setLinearVelocity(self.vx, self.vy)
|
||||
end
|
||||
|
||||
@@ -82,13 +93,36 @@ function Player:updateCol()
|
||||
end
|
||||
end
|
||||
|
||||
function Player:getPowerUp(powerup)
|
||||
self.PUName = powerup.name
|
||||
self.PUTime = powerup.time
|
||||
end
|
||||
|
||||
function Player:powerup()
|
||||
self.PUOn = true
|
||||
if self.PUName == "speed" then
|
||||
--print("" .. self.PUName .. " for " .. self.PUTime)
|
||||
self.speed = self.speed * 2.5
|
||||
self.rotSpeed = self.rotSpeed * 1.5
|
||||
end
|
||||
end
|
||||
|
||||
-- Update method for the Player class
|
||||
function Player:update(dt)
|
||||
local bulletSpeed = 20000
|
||||
if self.PUOn then
|
||||
self.PUTime = self.PUTime - dt
|
||||
|
||||
if max(0, self.PUTime) <= 0 then
|
||||
-- Reset the player
|
||||
self.PUName = "none"
|
||||
self.PUTime = 0
|
||||
self.PUOn = false
|
||||
self.speed = _G.DEFAULT_P_SPEED
|
||||
end
|
||||
end
|
||||
if EnableKeyPress1 == true and self.p == 1 then
|
||||
if love.keyboard.isDown("space") then
|
||||
local newBullet = self:shoot(bulletSpeed)
|
||||
local newBullet = self:shoot(self.bulletSpeed)
|
||||
table.insert(Bullets1, newBullet)
|
||||
KeyPressTime1 = KeyDelay1
|
||||
EnableKeyPress1 = false
|
||||
@@ -97,7 +131,7 @@ function Player:update(dt)
|
||||
|
||||
if EnableKeyPress2 == true and self.p == 2 then
|
||||
if love.keyboard.isDown("return") then
|
||||
local newBullet = self:shoot(bulletSpeed)
|
||||
local newBullet = self:shoot(self.bulletSpeed)
|
||||
table.insert(Bullets2, newBullet)
|
||||
KeyPressTime2 = KeyDelay2
|
||||
EnableKeyPress2 = false
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
PowerUp = Object:extend()
|
||||
|
||||
-- PowerUp is the super class for all power-ups
|
||||
-- found in the game
|
||||
|
||||
function PowerUp:new(name, x, y, image, time, lifetime)
|
||||
self.name = name
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.image = love.graphics.newImage(image)
|
||||
self.time = time
|
||||
self.lifetime = lifetime
|
||||
|
||||
self.width = self.image:getWidth()
|
||||
self.height = self.image:getHeight()
|
||||
|
||||
self.rotation = 1
|
||||
self.scaleX = 1
|
||||
self.scaleY = 1
|
||||
self.originX = self.width / 2
|
||||
self.originY = self.height / 2
|
||||
|
||||
-- Collider
|
||||
self.collider = World:newRectangleCollider(x, y, 20, 20)
|
||||
self.collider:setCollisionClass("PowerUp")
|
||||
self.collider:setType("static")
|
||||
self.collider:setPosition(self.x, self.y)
|
||||
end
|
||||
-- TODO: clean up colliosn on reset
|
||||
-- make image draw
|
||||
-- more stuff
|
||||
-- see you later
|
||||
|
||||
function PowerUp:apply(player) end
|
||||
|
||||
function PowerUp:remove(player) end
|
||||
|
||||
function PowerUp:update(dt)
|
||||
--check if the power up is past its lifetime
|
||||
|
||||
--spinnnnnn
|
||||
self.rotation = self.rotation + 1.5 * dt
|
||||
|
||||
--grown and shrink
|
||||
--[[
|
||||
if self.scaleX >= 1.0 then
|
||||
self.scaleX = self.scaleX - 0.2 * dt
|
||||
elseif self.scaleX <= 1.8 then
|
||||
self.scaleX = self.scaleX + 0.2 * dt
|
||||
end
|
||||
]]
|
||||
|
||||
self.x = self.collider:getX()
|
||||
self.y = self.collider:getY()
|
||||
end
|
||||
|
||||
function PowerUp:draw()
|
||||
for _, _ in ipairs(PowerUps) do
|
||||
love.graphics.draw(
|
||||
self.image,
|
||||
self.x,
|
||||
self.y,
|
||||
self.rotation,
|
||||
self.scaleX,
|
||||
self.scaleY,
|
||||
self.originX,
|
||||
self.originY
|
||||
)
|
||||
end
|
||||
end
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
-- Functions to handle restarting
|
||||
-- all objects
|
||||
-- Used in map switching and restarting!
|
||||
|
||||
function ClearWalls(walls)
|
||||
for i = #walls, 1, -1 do
|
||||
walls[i]:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
function ClearPowerUps(powerup)
|
||||
for i, v in ipairs(powerup) do
|
||||
v.collider:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
function StopAllMusic()
|
||||
-- TODO: maybe find a way
|
||||
-- to find all 'streaming'
|
||||
-- sounds and then stop them all!
|
||||
musicBattle:stop()
|
||||
musicMenu:stop()
|
||||
musicPause:stop()
|
||||
--musicStory:stop() -- Unused
|
||||
end
|
||||
|
||||
function ClearPlayerCollision()
|
||||
UserPlayer1.collider:destroy()
|
||||
UserPlayer2.collider:destroy()
|
||||
end
|
||||
|
||||
function ClearBullets(bullets)
|
||||
for i, v in ipairs(bullets) do
|
||||
v.collider:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
local function setNewLevelFromRandom(count)
|
||||
local level = math.random(1, count)
|
||||
_G.CUR_LEVEL = level
|
||||
end
|
||||
|
||||
local function getLevelCount()
|
||||
local levelcount = 0
|
||||
local suf = ".lua"
|
||||
local files = love.filesystem.getDirectoryItems("maps/")
|
||||
|
||||
for _, file in ipairs(files) do
|
||||
if string.find(file, suf) then
|
||||
levelcount = levelcount + 1
|
||||
--print(k .. ". " .. file) --outputs something like "1. main.lua"
|
||||
end
|
||||
end
|
||||
return levelcount
|
||||
end
|
||||
|
||||
function RestartGame()
|
||||
setNewLevelFromRandom(getLevelCount())
|
||||
|
||||
--reset wins
|
||||
_G.P1_WIN = false
|
||||
_G.P2_WIN = false
|
||||
|
||||
-- Stop the music
|
||||
--StopAllMusic()
|
||||
|
||||
-- Clear the players collision
|
||||
ClearPlayerCollision()
|
||||
|
||||
-- Work through and delete all bullets
|
||||
ClearBullets(Bullets1)
|
||||
ClearBullets(Bullets2)
|
||||
|
||||
--Clear Walls
|
||||
ClearWalls(Walls)
|
||||
|
||||
--ClearPowerUps
|
||||
ClearPowerUps(PowerUps)
|
||||
|
||||
-- Done!
|
||||
end
|
||||
@@ -0,0 +1,6 @@
|
||||
function truncate(number, decdigits)
|
||||
number = number * (10 ^ decdigits)
|
||||
number = math.floor(number)
|
||||
number = number / (10 ^ decdigits)
|
||||
return number
|
||||
end
|
||||
Reference in New Issue
Block a user