diff --git a/src/Player.lua b/src/Player.lua index 8ac3763..8aed642 100644 --- a/src/Player.lua +++ b/src/Player.lua @@ -38,6 +38,15 @@ function Player:init(def, level ) end) end +function Player:isMoveAllowed(point) + for i,segment in pairs (self.trailSegments) do + if segment:pointInSegment(point) then + return false + end + end + return true +end + function Player:changeState(state) Entity.changeState(self,state) end @@ -88,6 +97,7 @@ function Player:onEdge() end function Player:onWalking() + -- if position of player collides with its own trail, stop motion if #self.trail > 1 then table.remove(self.trail) table.remove(self.trailSegments) @@ -113,9 +123,6 @@ function Player:onChangeDirection() table.remove(self.trailSegments) end - local k = #self.trailSegments - local j = #self.trail + 1 - table.insert(self.trail, {['x'] = self.x + self.width/2,['y'] = self.y + self.height/2} ) diff --git a/src/Segment.lua b/src/Segment.lua index 5f59725..61fe0ea 100644 --- a/src/Segment.lua +++ b/src/Segment.lua @@ -292,3 +292,19 @@ end function Segment:insert(list) end + +function Segment:pointInSegment(point) + if self.direction == 'up' or self.direction == 'down' then + if point[1] <= self.firstPointX + 1 and + point[1] >= self.firstPointX - 1 then + return true + end + else + if point[2] <= self.firstPointY + 1 and + point[2] >= self.firstPointY - 1 then + return true + end + end + + return false +end \ No newline at end of file diff --git a/src/entity/Entity.lua b/src/entity/Entity.lua index 72aac96..63d0b82 100644 --- a/src/entity/Entity.lua +++ b/src/entity/Entity.lua @@ -25,6 +25,10 @@ function Entity:changeState(name) -- printChangeState to "..name) end +-- function Entity:isMoveAllowed(point) +-- return point.x, point.y +-- end + function Entity:changeAnimation(name) self.currentAnimation = self.animations[name] end diff --git a/src/states/entity/EntityWalkState.lua b/src/states/entity/EntityWalkState.lua index 9ec19bd..3f71818 100644 --- a/src/states/entity/EntityWalkState.lua +++ b/src/states/entity/EntityWalkState.lua @@ -10,32 +10,40 @@ end function EntityWalkState:update(dt) if self.entity.direction == 'up' then - self.entity.y = self.entity.y - self.entity.walkingSpeed * dt - if self.entity.y + TILE_SIZE / 2 < LEVEL_RENDER_OFFSET_TOP - 2 then - self.entity.y = self.entity.y + self.entity.walkingSpeed * dt - Event.dispatch('back-to-wall') - self.entity:changeState('edge') + if self.entity:isMoveAllowed({self.entity.x, self.entity.y - self.entity.walkingSpeed * dt}) then + self.entity.y = self.entity.y - self.entity.walkingSpeed * dt + if self.entity.y + TILE_SIZE / 2 < LEVEL_RENDER_OFFSET_TOP - 2 then + self.entity.y = self.entity.y + self.entity.walkingSpeed * dt + Event.dispatch('back-to-wall') + self.entity:changeState('edge') + end end elseif self.entity.direction == 'down' then - self.entity.y = self.entity.y + self.entity.walkingSpeed * dt - if self.entity.y + TILE_SIZE / 2 > VIRTUAL_HEIGHT - LEVEL_RENDER_OFFSET + 2 then - self.entity.y = self.entity.y - self.entity.walkingSpeed * dt - Event.dispatch('back-to-wall') - self.entity:changeState('edge') + if self.entity:isMoveAllowed({self.entity.x, self.entity.y + self.entity.walkingSpeed * dt}) then + self.entity.y = self.entity.y + self.entity.walkingSpeed * dt + if self.entity.y + TILE_SIZE / 2 > VIRTUAL_HEIGHT - LEVEL_RENDER_OFFSET + 2 then + self.entity.y = self.entity.y - self.entity.walkingSpeed * dt + Event.dispatch('back-to-wall') + self.entity:changeState('edge') + end end elseif self.entity.direction == 'right' then - self.entity.x = self.entity.x + self.entity.walkingSpeed * dt - if self.entity.x + TILE_SIZE / 2 > VIRTUAL_WIDTH - TILE_SIZE / 2 + 2 or self.entity.previousdirection == 'left' then - self.entity.x = self.entity.x - self.entity.walkingSpeed * dt - Event.dispatch('back-to-wall') - self.entity:changeState('edge') + if self.entity:isMoveAllowed({self.entity.x + self.entity.walkingSpeed * dt, self.entity.y}) then + self.entity.x = self.entity.x + self.entity.walkingSpeed * dt + if self.entity.x + TILE_SIZE / 2 > VIRTUAL_WIDTH - TILE_SIZE / 2 + 2 or self.entity.previousdirection == 'left' then + self.entity.x = self.entity.x - self.entity.walkingSpeed * dt + Event.dispatch('back-to-wall') + self.entity:changeState('edge') + end end elseif self.entity.direction == 'left' then - self.entity.x = self.entity.x - self.entity.walkingSpeed * dt - if self.entity.x < 0 or self.entity.previousdirection == 'right' then - self.entity.x = self.entity.x + self.entity.walkingSpeed * dt - Event.dispatch('back-to-wall') - self.entity:changeState('edge') + if self.entity:isMoveAllowed({self.entity.x - self.entity.walkingSpeed * dt, self.entity.y}) then + self.entity.x = self.entity.x - self.entity.walkingSpeed * dt + if self.entity.x < 0 or self.entity.previousdirection == 'right' then + self.entity.x = self.entity.x + self.entity.walkingSpeed * dt + Event.dispatch('back-to-wall') + self.entity:changeState('edge') + end end end if love.keyboard.isDown('left') then diff --git a/src/states/game/PlayState.lua b/src/states/game/PlayState.lua index f0e28cc..2f50ec6 100644 --- a/src/states/game/PlayState.lua +++ b/src/states/game/PlayState.lua @@ -24,6 +24,7 @@ function PlayState:update(dt) self.level:update(dt) self.player:update(dt) self:updateBalls(dt, self.level) + self:checkEndLevel(self.level) end function PlayState:render() @@ -81,6 +82,18 @@ function PlayState:updateBalls(dt, level) end end +function PlayState:checkEndLevel (level) + if #self.balls <= 0 then + -- game over - reset level + self:gameOver() + end + + -- check perimeter of level, if low enough, create new level move on to the next stage + if level:getPerimeter() < 500 then + self:nextStage() + end +end + function PlayState:renderBalls(dt) for k,ball in pairs(self.balls) do ball:render()