Level.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. require "Scripts/Player"
  2. require "Scripts/Fly"
  3. require "Scripts/HUD"
  4. class "Level"
  5. function Level:Level(levelFile)
  6. self.loaded = false
  7. self.levelFile = levelFile
  8. self.coinSound = Sound("Resources/sounds/coin.wav")
  9. self.buttonSound = Sound("Resources/sounds/button.wav")
  10. self:initLevel()
  11. end
  12. function Level:initLevel()
  13. self.backgroundScreen = Screen()
  14. self.backgroundScreen:setNormalizedCoordinates(true, 720)
  15. for i=0,4 do
  16. self.background = ScreenImage("Resources/images/background.png")
  17. self.backgroundScreen:addChild(self.background)
  18. self.background.position.x = -450 + (1280 * i)
  19. self.background.position.y = -720/2
  20. end
  21. self.screen = PhysicsScreen(40, 60.0)
  22. self.screen:setGravity(Vector2(0.0, 80))
  23. self.screen:setNormalizedCoordinates(true, 720)
  24. self.level = ScreenEntityInstance("Resources/levels/"..self.levelFile..".entity2d")
  25. self.screen:addChild(self.level)
  26. self.playerEntity = self.level:getScreenEntityById("player", true)
  27. self.player = Player(self.screen, self.playerEntity)
  28. self.screen:trackCollisionChild(self.player.groundSensor, PhysicsScreenEntity.ENTITY_RECT)
  29. local ground_blocks = self.level:getScreenEntitiesByTag("ground", true)
  30. for i=1,count(ground_blocks) do
  31. self.screen:trackPhysicsChild(ground_blocks[i], PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
  32. end
  33. self.coins = self.level:getScreenEntitiesByTag("coin", true)
  34. for i=1,count(self.coins) do
  35. self.screen:trackCollisionChild(self.coins[i], PhysicsScreenEntity.ENTITY_CIRCLE)
  36. end
  37. self.buttons = self.level:getScreenEntitiesByTag("button", true)
  38. for i=1,count(self.buttons) do
  39. self.screen:trackPhysicsChild(self.buttons[i], PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
  40. end
  41. self.enemies = {}
  42. local flies = self.level:getScreenEntitiesByTag("fly", true)
  43. for i=1,count(flies) do
  44. self.screen:trackCollisionChild(flies[i], PhysicsScreenEntity.ENTITY_CIRCLE)
  45. self.enemies[count(self.enemies)+1] = Fly(flies[i])
  46. end
  47. self.screen:addEventListener(self, Level.onNewCollision, PhysicsScreenEvent.EVENT_NEW_SHAPE_COLLISION)
  48. self.coinSinVal = 0
  49. self.hud = HUD()
  50. self.loaded = true
  51. end
  52. function Level:clearLevel()
  53. self.screen.rootEntity:setOwnsChildrenRecursive(true)
  54. self.backgroundScreen.rootEntity:setOwnsChildrenRecursive(true)
  55. self.hud.screen.rootEntity:setOwnsChildrenRecursive(true)
  56. safe_delete(self.player.jumpSound)
  57. safe_delete(self.player.dieSound )
  58. safe_delete(self.screen)
  59. safe_delete(self.backgroundScreen)
  60. safe_delete(self.hud.screen)
  61. self.loaded = false
  62. end
  63. function Level:reloadLevel()
  64. self:clearLevel()
  65. self:initLevel()
  66. end
  67. function Level:onNewCollision(event)
  68. physicsEvent = safe_cast(event, PhysicsScreenEvent)
  69. local collidedEntity = physicsEvent.entity2
  70. local firstEntity = physicsEvent.entity1
  71. if firstEntity == self.player.groundSensor then
  72. if collidedEntity:hasTag("button") then
  73. local buttonUp = collidedEntity:getEntityById("button_up", true)
  74. local buttonDown = collidedEntity:getEntityById("button_down", true)
  75. if buttonUp.visible == true then
  76. buttonUp.visible = false
  77. buttonDown.visible = true
  78. self.screen:stopTrackingChild(collidedEntity)
  79. collidedEntity.height = 55
  80. self.screen:trackPhysicsChild(collidedEntity, PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
  81. self.buttonSound:Play()
  82. self:levelButtonPushed(collidedEntity.id)
  83. end
  84. end
  85. end
  86. if firstEntity == self.player.playerEntity then
  87. if collidedEntity:hasTag("coin") and collidedEntity.visible == true then
  88. collidedEntity.visible = false
  89. self.player.numCoins = self.player.numCoins + 1
  90. self.coinSound:Play()
  91. elseif collidedEntity:hasTag("enemy") and self.player.dead == false then
  92. self.player:Die()
  93. end
  94. end
  95. end
  96. function Level:levelButtonPushed(buttonID)
  97. if buttonID == "level_end_button" then
  98. self.hud.winLabel.visible = true
  99. end
  100. end
  101. function Level:Update(elapsed)
  102. if self.player.deadCounter > 2.0 then
  103. self:reloadLevel()
  104. end
  105. if self.loaded == false then return end
  106. self.player:Update(elapsed)
  107. for i=1,count(self.enemies) do
  108. self.enemies[i]:Update(elapsed)
  109. end
  110. self.coinSinVal = self.coinSinVal + elapsed * 5.0
  111. for i=1,count(self.coins) do
  112. self.coins[i].scale.x = sin(self.coinSinVal)
  113. end
  114. local screenOffset = Vector2(-self.player.playerEntity.position.x, -self.player.playerEntity.position.y)
  115. if screenOffset.y < 310 then
  116. screenOffset.y = 310
  117. end
  118. if screenOffset.x > -650 then
  119. screenOffset.x = -650
  120. end
  121. self.screen:setScreenOffset(screenOffset.x, 310)
  122. self.backgroundScreen:setScreenOffset(screenOffset.x/3, 0.0)
  123. self.hud.coinsLabel:setText("COINS: "..self.player.numCoins)
  124. end