Skip to content

Commit 90b9926

Browse files
committed
Add ability to have two players.
1 parent 64b88a2 commit 90b9926

File tree

6 files changed

+112
-68
lines changed

6 files changed

+112
-68
lines changed

EntityManager.lua

Lines changed: 62 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ end
2727

2828
function EntityManager:addEntity(entity, type)
2929
if type == EntityTypes.PLAYER then
30-
self.player = entity
30+
table.insert(self.player, entity)
3131
elseif type == EntityTypes.ENEMY then
3232
table.insert(self.enemies, entity)
3333
elseif type == EntityTypes.WALL then
@@ -75,63 +75,69 @@ function EntityManager:unfreezeEnemies()
7575
end
7676

7777
function EntityManager:freezeGame()
78-
self.gameFrozen = true
79-
self.player:freezeIfAlive()
78+
self.gameFrozen = true
79+
for _, e in pairs(self.player) do
80+
e:freezeIfAlive()
81+
end
8082
end
8183

8284
function EntityManager:unfreezeGame()
83-
self.gameFrozen = false
84-
self.player:unfreeze()
85+
self.gameFrozen = false
86+
for _, e in pairs(self.player) do
87+
e:unfreeze()
88+
end
8589
end
8690

8791
function EntityManager:update(dt)
8892

89-
if self.player then
90-
self.player:update(dt)
93+
for _, e in pairs(self.player) do
94+
e:update(dt)
9195
end
9296

93-
if not self.gameFrozen then
94-
95-
if self.player.state == "alive" then
96-
97-
for i,v in ipairs(self.walls) do
98-
if v:collide(self.player) then
99-
self.player:resetPosition()
100-
end
101-
end
102-
103-
for i,v in ipairs(self.enemies) do
104-
if v:collide(self.player) and self.player.state == "alive" then
105-
self.player:die()
106-
end
107-
end
108-
109-
for i,v in ipairs(self.flowers) do
110-
if v:collide(self.player) then
111-
v:onCollide()
112-
end
113-
end
114-
115-
for _, t in pairs(self.turnstiles) do
116-
local row, col = getTileForPosition(self.player.x, self.player.y)
117-
t:update(
118-
row,
119-
col,
120-
self.player.orientation
121-
)
122-
end
123-
124-
for i,v in ipairs(self.gameObjects) do
125-
if v.type == "skull" and v:collide(self.player) then
126-
v:destroy()
127-
self.player:die()
128-
elseif v.type == "plant" and v:collide(self.player) then
129-
Event.dispatch("plantEaten", v)
130-
v:destroy()
131-
end
132-
end
97+
if not self.gameFrozen then
98+
99+
for _, e in pairs(self.player) do
100+
if e.state == "alive" then
101+
102+
for i,v in ipairs(self.walls) do
103+
if v:collide(e) then
104+
e:resetPosition()
105+
end
106+
end
107+
108+
for i,v in ipairs(self.enemies) do
109+
if v:collide(e) and e.state == "alive" then
110+
e:die()
111+
end
112+
end
113+
114+
for i,v in ipairs(self.flowers) do
115+
if v:collide(e) then
116+
v:onCollide()
117+
end
118+
end
119+
120+
for _, t in pairs(self.turnstiles) do
121+
local row, col = getTileForPosition(e.x, e.y)
122+
t:update(
123+
row,
124+
col,
125+
e.orientation
126+
)
127+
end
128+
129+
for i,v in ipairs(self.gameObjects) do
130+
if v.type == "skull" and v:collide(e) then
131+
v:destroy()
132+
e:die()
133+
elseif v.type == "plant" and v:collide(e) then
134+
Event.dispatch("plantEaten", v)
135+
v:destroy()
136+
end
137+
end
138+
end
133139

134-
end
140+
end
135141

136142
--- Update door positions based on turnstiles & their respective orientation
137143

@@ -160,11 +166,13 @@ function EntityManager:update(dt)
160166
end
161167
end
162168

163-
for i,v in ipairs(self.letters) do
164-
if v:collide(self.player) then
165-
v:onCollide()
166-
end
167-
end
169+
for i,v in ipairs(self.letters) do
170+
for _, e in pairs(self.player) do
171+
if v:collide(e) then
172+
v:onCollide()
173+
end
174+
end
175+
end
168176

169177
self:updateTable(self.gameObjects, dt)
170178
end
@@ -181,7 +189,7 @@ function EntityManager:draw()
181189
self:drawTable(self.flowers)
182190
self:drawTable(self.letters)
183191
self:drawTable(self.enemies)
184-
self.player:draw()
192+
self:drawTable(self.player)
185193
end
186194

187195

entities/Enemy.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ function Enemy:update(dt)
184184
self.hitbox.y2 = self.y + 14
185185

186186
local ownRow, ownCol = getTileForPosition(self.x, self.y)
187-
local playerRow, playerCol = getTileForPosition(self.entityManager.player.x, self.entityManager.player.y)
187+
local playerRow, playerCol = getTileForPosition(self.entityManager.player[1].x, self.entityManager.player[1].y)
188188

189189
local row, col = self:getNextStep(ownRow, ownCol, playerRow, playerCol, self.entityManager.tilemap)
190190
self:moveTo(row, col)
@@ -236,4 +236,4 @@ function Enemy:unfreeze()
236236
end
237237

238238

239-
return Enemy
239+
return Enemy

entities/Player.lua

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,20 @@
11
Player = Class{__includes = Entity}
22

3-
function Player:init()
3+
function Player:init(n)
44
Entity.init(self, VIRTUAL_WIDTH / 2 - 8, 184)
55

6+
self.number = n
7+
if (n == 1) then
8+
self.left = "left"
9+
self.right = "right"
10+
self.up = "up"
11+
self.down = "down"
12+
else
13+
self.left = "a"
14+
self.right = "d"
15+
self.up = "w"
16+
self.down = "s"
17+
end
618
self.hitbox = {}
719

820
self.hitbox.x1 = self.x + 4
@@ -56,16 +68,16 @@ function Player:update(dt)
5668
self.lastX = self.x
5769
self.lastY = self.y
5870

59-
if love.keyboard.isDown("left") then
71+
if love.keyboard.isDown(self.left) then
6072
self.orientation = Orientation.LEFT
6173
self:move(-PLAYER_SPEED * dt, 0)
62-
elseif love.keyboard.isDown("right") then
74+
elseif love.keyboard.isDown(self.right) then
6375
self.orientation = Orientation.RIGHT
6476
self:move(PLAYER_SPEED * dt, 0)
65-
elseif love.keyboard.isDown("up") then
77+
elseif love.keyboard.isDown(self.up) then
6678
self.orientation = Orientation.UP
6779
self:move(0, -PLAYER_SPEED * dt)
68-
elseif love.keyboard.isDown("down") then
80+
elseif love.keyboard.isDown(self.down) then
6981
self.orientation = Orientation.DOWN
7082
self:move(0, PLAYER_SPEED * dt, 0)
7183
end

states/LevelStartState.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ function LevelStartState:enter(params)
5252
self.level = params.level or 1
5353
self.lives = params.lives or 3
5454
self.score = params.score or 0
55+
self.players = params.players or 1
5556

5657
-- RNG stuff
5758

@@ -73,7 +74,8 @@ function LevelStartState:enter(params)
7374
{
7475
level = self.level,
7576
score = self.score,
76-
lives = self.lives ,
77+
lives = self.lives,
78+
players = self.players,
7779
extraLetter = self.extraLetter,
7880
specialLetter = self.specialLetter,
7981
commonLetter = self.commonLetter,
@@ -87,4 +89,4 @@ function LevelStartState:enter(params)
8789
end
8890

8991
function LevelStartState:exit()
90-
end
92+
end

states/PlayState.lua

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ function PlayState:update(dt)
2323
level = self.level + 1,
2424
score = self.score,
2525
lives = self.lives,
26+
players = self.players,
2627
extraLettersLit = self.extraLettersLit,
2728
specialLettersLit = self.specialLettersLit
2829
}
@@ -153,6 +154,7 @@ function PlayState:enter(params)
153154
self.level = params.level
154155
self.score = params.score
155156
self.lives = params.lives
157+
self.players = params.players
156158
local extraLetter = params.extraLetter
157159
local specialLetter = params.specialLetter
158160
local commonLetter = params.commonLetter
@@ -173,7 +175,10 @@ function PlayState:enter(params)
173175
self.plantTexture = love.graphics.newImage(data.fruitFile)
174176

175177
self.entityManager = EntityManager()
176-
self.entityManager:addEntity(Player(), EntityTypes.PLAYER)
178+
self.entityManager:addEntity(Player(1), EntityTypes.PLAYER)
179+
if params.players == 2 then
180+
self.entityManager:addEntity(Player(2), EntityTypes.PLAYER)
181+
end
177182

178183
local available_tiles = {}
179184

@@ -338,7 +343,9 @@ function PlayState:enter(params)
338343
enemy:destroy()
339344
end
340345

341-
self.entityManager.player:destroy()
346+
for _, e in pairs(self.entityManager.player) do
347+
e:destroy()
348+
end
342349

343350
self.lives = self.lives - 1
344351

@@ -361,7 +368,9 @@ function PlayState:enter(params)
361368
if not changed then gStateMachine:change('title') end
362369
end
363370

364-
self.entityManager:addEntity(Player(), EntityTypes.PLAYER)
371+
for i, e in pairs(self.entityManager.player) do
372+
self.entityManager.player[i] = Player(i)
373+
end
365374

366375
self.trappedEnemies = {}
367376

@@ -472,4 +481,4 @@ function PlayState:freeze(seconds)
472481
self:startClockTick()
473482
end)
474483

475-
end
484+
end

states/TitleState.lua

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ function TitleState:update(dt)
1414
level = 1,
1515
score = 0,
1616
lives = 3,
17+
players = 1,
18+
extraLettersLit = {},
19+
specialLettersLit = {}
20+
})
21+
end
22+
23+
if love.keyboard.keyPressed['2'] then
24+
gStateMachine:change('levelstart',
25+
{
26+
level = 1,
27+
score = 0,
28+
lives = 3,
29+
players = 2,
1730
extraLettersLit = {},
1831
specialLettersLit = {}
1932
})
@@ -58,4 +71,4 @@ function TitleState:enter()
5871
end
5972

6073
function TitleState:exit()
61-
end
74+
end

0 commit comments

Comments
 (0)