| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- require "Scripts/Player"
- require "Scripts/Fly"
- require "Scripts/HUD"
- class "Level"
- function Level:Level(levelFile)
- self.loaded = false
- self.levelFile = levelFile
- self.coinSound = Sound("Resources/sounds/coin.wav")
- self.buttonSound = Sound("Resources/sounds/button.wav")
- self:initLevel()
- end
- function Level:initLevel()
- self.backgroundScreen = Screen()
- self.backgroundScreen:setNormalizedCoordinates(true, 720)
- for i=0,4 do
- self.background = ScreenImage("Resources/images/background.png")
- self.backgroundScreen:addChild(self.background)
- self.background.position.x = -450 + (1280 * i)
- self.background.position.y = -720/2
- end
- self.screen = PhysicsScreen(40, 60.0)
- self.screen:setGravity(Vector2(0.0, 80))
- self.screen:setNormalizedCoordinates(true, 720)
- self.level = ScreenEntityInstance("Resources/levels/"..self.levelFile..".entity2d")
- self.screen:addChild(self.level)
- self.playerEntity = self.level:getScreenEntityById("player", true)
- self.player = Player(self.screen, self.playerEntity)
- self.screen:trackCollisionChild(self.player.groundSensor, PhysicsScreenEntity.ENTITY_RECT)
- local ground_blocks = self.level:getScreenEntitiesByTag("ground", true)
- for i=1,count(ground_blocks) do
- self.screen:trackPhysicsChild(ground_blocks[i], PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
- end
- self.coins = self.level:getScreenEntitiesByTag("coin", true)
- for i=1,count(self.coins) do
- self.coins[i].width = 20
- self.coins[i].height = 20
- self.screen:trackCollisionChild(self.coins[i], PhysicsScreenEntity.ENTITY_CIRCLE)
- end
- self.buttons = self.level:getScreenEntitiesByTag("button", true)
- for i=1,count(self.buttons) do
- self.buttons[i].width = 40
- self.buttons[i].height = 95
- self.screen:trackPhysicsChild(self.buttons[i], PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
- end
- self.enemies = {}
- local flies = self.level:getScreenEntitiesByTag("fly", true)
- for i=1,count(flies) do
- self.screen:trackCollisionChild(flies[i], PhysicsScreenEntity.ENTITY_CIRCLE)
- self.enemies[count(self.enemies)+1] = Fly(flies[i])
- end
-
- self.screen:addEventListener(self, Level.onNewCollision, PhysicsScreenEvent.EVENT_NEW_SHAPE_COLLISION)
- self.coinSinVal = 0
- self.hud = HUD()
- self.loaded = true
- end
- function Level:clearLevel()
- self.screen.rootEntity:setOwnsChildrenRecursive(true)
- self.backgroundScreen.rootEntity:setOwnsChildrenRecursive(true)
- self.hud.screen.rootEntity:setOwnsChildrenRecursive(true)
- safe_delete(self.player.jumpSound)
- safe_delete(self.player.dieSound )
- safe_delete(self.screen)
- safe_delete(self.backgroundScreen)
- safe_delete(self.hud.screen)
- self.loaded = false
- end
- function Level:reloadLevel()
- self:clearLevel()
- self:initLevel()
- end
- function Level:onNewCollision(event)
- physicsEvent = safe_cast(event, PhysicsScreenEvent)
- local collidedEntity = physicsEvent:getSecondEntity()
- local firstEntity = physicsEvent:getFirstEntity()
- if same_c_class(firstEntity, self.player.groundSensor) then
- if collidedEntity:hasTag("button") then
- local buttonUp = collidedEntity:getEntityById("button_up", true)
- local buttonDown = collidedEntity:getEntityById("button_down", true)
- if buttonUp.visible == true then
- buttonUp.visible = false
- buttonDown.visible = true
- self.screen:stopTrackingChild(collidedEntity)
- collidedEntity.height = 55
- self.screen:trackPhysicsChild(collidedEntity, PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
- self.buttonSound:Play()
- self:levelButtonPushed(collidedEntity.id)
- end
- end
- end
- if same_c_class(firstEntity, self.player.playerEntity) then
- if collidedEntity:hasTag("coin") and collidedEntity.visible == true then
- collidedEntity.visible = false
- self.player.numCoins = self.player.numCoins + 1
- self.coinSound:Play()
- elseif collidedEntity:hasTag("enemy") and self.player.dead == false then
- self.player:Die()
- end
- end
- end
- function Level:levelButtonPushed(buttonID)
- if buttonID == "level_end_button" then
- self.hud.winLabel.visible = true
- end
- end
- function Level:Update(elapsed)
- if self.player.deadCounter > 2.0 then
- self:reloadLevel()
- end
- if self.loaded == false then return end
- self.player:Update(elapsed)
- for i=1,count(self.enemies) do
- self.enemies[i]:Update(elapsed)
- end
- self.coinSinVal = self.coinSinVal + elapsed * 5.0
- for i=1,count(self.coins) do
- self.coins[i].scale.x = sin(self.coinSinVal)
- end
- local screenOffset = Vector2(-self.player.playerEntity.position.x, -self.player.playerEntity.position.y)
- if screenOffset.y < 310 then
- screenOffset.y = 310
- end
- if screenOffset.x > -650 then
- screenOffset.x = -650
- end
- self.screen:setScreenOffset(screenOffset.x, 310)
- self.backgroundScreen:setScreenOffset(screenOffset.x/3, 0.0)
- self.hud.coinsLabel:setText("COINS: "..self.player.numCoins)
- end
|