Level.lua 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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.coins[i].width = 20
  36. self.coins[i].height = 20
  37. self.screen:trackCollisionChild(self.coins[i], PhysicsScreenEntity.ENTITY_CIRCLE)
  38. end
  39. self.buttons = self.level:getScreenEntitiesByTag("button", true)
  40. for i=1,count(self.buttons) do
  41. self.buttons[i].width = 40
  42. self.buttons[i].height = 95
  43. self.screen:trackPhysicsChild(self.buttons[i], PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
  44. end
  45. self.enemies = {}
  46. local flies = self.level:getScreenEntitiesByTag("fly", true)
  47. for i=1,count(flies) do
  48. self.screen:trackCollisionChild(flies[i], PhysicsScreenEntity.ENTITY_CIRCLE)
  49. self.enemies[count(self.enemies)+1] = Fly(flies[i])
  50. end
  51. self.screen:addEventListener(self, Level.onNewCollision, PhysicsScreenEvent.EVENT_NEW_SHAPE_COLLISION)
  52. self.coinSinVal = 0
  53. self.hud = HUD()
  54. self.loaded = true
  55. end
  56. function Level:clearLevel()
  57. self.screen.rootEntity:setOwnsChildrenRecursive(true)
  58. self.backgroundScreen.rootEntity:setOwnsChildrenRecursive(true)
  59. self.hud.screen.rootEntity:setOwnsChildrenRecursive(true)
  60. safe_delete(self.player.jumpSound)
  61. safe_delete(self.player.dieSound )
  62. safe_delete(self.screen)
  63. safe_delete(self.backgroundScreen)
  64. safe_delete(self.hud.screen)
  65. self.loaded = false
  66. end
  67. function Level:reloadLevel()
  68. self:clearLevel()
  69. self:initLevel()
  70. end
  71. function Level:onNewCollision(event)
  72. physicsEvent = safe_cast(event, PhysicsScreenEvent)
  73. local collidedEntity = physicsEvent:getSecondEntity()
  74. local firstEntity = physicsEvent:getFirstEntity()
  75. if same_c_class(firstEntity, self.player.groundSensor) then
  76. if collidedEntity:hasTag("button") then
  77. local buttonUp = collidedEntity:getEntityById("button_up", true)
  78. local buttonDown = collidedEntity:getEntityById("button_down", true)
  79. if buttonUp.visible == true then
  80. buttonUp.visible = false
  81. buttonDown.visible = true
  82. self.screen:stopTrackingChild(collidedEntity)
  83. collidedEntity.height = 55
  84. self.screen:trackPhysicsChild(collidedEntity, PhysicsScreenEntity.ENTITY_RECT , true, 2.0, 1, 0, false, false)
  85. self.buttonSound:Play()
  86. self:levelButtonPushed(collidedEntity.id)
  87. end
  88. end
  89. end
  90. if same_c_class(firstEntity, self.player.playerEntity) then
  91. if collidedEntity:hasTag("coin") and collidedEntity.visible == true then
  92. collidedEntity.visible = false
  93. self.player.numCoins = self.player.numCoins + 1
  94. self.coinSound:Play()
  95. elseif collidedEntity:hasTag("enemy") and self.player.dead == false then
  96. self.player:Die()
  97. end
  98. end
  99. end
  100. function Level:levelButtonPushed(buttonID)
  101. if buttonID == "level_end_button" then
  102. self.hud.winLabel.visible = true
  103. end
  104. end
  105. function Level:Update(elapsed)
  106. if self.player.deadCounter > 2.0 then
  107. self:reloadLevel()
  108. end
  109. if self.loaded == false then return end
  110. self.player:Update(elapsed)
  111. for i=1,count(self.enemies) do
  112. self.enemies[i]:Update(elapsed)
  113. end
  114. self.coinSinVal = self.coinSinVal + elapsed * 5.0
  115. for i=1,count(self.coins) do
  116. self.coins[i].scale.x = sin(self.coinSinVal)
  117. end
  118. local screenOffset = Vector2(-self.player.playerEntity.position.x, -self.player.playerEntity.position.y)
  119. if screenOffset.y < 310 then
  120. screenOffset.y = 310
  121. end
  122. if screenOffset.x > -650 then
  123. screenOffset.x = -650
  124. end
  125. self.screen:setScreenOffset(screenOffset.x, 310)
  126. self.backgroundScreen:setScreenOffset(screenOffset.x/3, 0.0)
  127. self.hud.coinsLabel:setText("COINS: "..self.player.numCoins)
  128. end