Advertisement
Hendrix000007

Untitled

Nov 28th, 2012
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.61 KB | None | 0 0
  1. local storyboard = require( "storyboard" )
  2. local scene = storyboard.newScene()
  3.  
  4. ----------------------------------------------------------------------------------
  5. --
  6. -- NOTE:
  7. --
  8. -- Code outside of listener functions (below) will only be executed once,
  9. -- unless storyboard.removeScene() is called.
  10. --
  11. ---------------------------------------------------------------------------------
  12.  
  13. ---------------------------------------------------------------------------------
  14. -- BEGINNING OF YOUR IMPLEMENTATION
  15. ---------------------------------------------------------------------------------
  16.  
  17. local _W = display.contentWidth
  18. local _H = display.contentHeight
  19. local mRandom = math.random
  20.  
  21. local score
  22. local scoreText
  23.  
  24. local gameTimer
  25. local gameTimerText
  26. local gameTimerBar
  27. local gameTimerBar_bg
  28.  
  29.  
  30. local gemsTable = {}
  31. local numberOfMarkedToDestroy = 0
  32. local gemToBeDestroyed -- used as a placeholder
  33. local isGemTouchEnabled = true -- blocker for double touching gems
  34.  
  35. local gameOverLayout
  36. local gameOverText1
  37. local gameOverText2
  38.  
  39. local timers = {}
  40.  
  41. -- pre-declaration of function
  42. local onGemTouch
  43.  
  44.  
  45. local function newGem (i,j)
  46.  
  47.     local newGem
  48.         local img = img
  49.  
  50.     local R = mRandom(1,4)
  51.    
  52.     if      (R == 1 ) then
  53.         img = "fish.png"
  54.         newGem.gemType = "fish"
  55.     elseif  (R == 2 ) then
  56.         img = "star.png"
  57.         newGem.gemType = "star"
  58.    
  59.     elseif  (R == 3 ) then
  60.         img = "turtle.png"
  61.         newGem.gemType = "turtle"
  62.    
  63.     elseif  (R == 4 ) then
  64.         img = "shell.png"
  65.         newGem.gemType = "shell"
  66.    
  67.     end
  68.  
  69.     newGem = display.newImageRect(img, 40, 40)
  70.     newGem.x = i*40 -20
  71.     newGem.y = -60
  72.     newGem.i = i
  73.     newGem.j = j
  74.     newGem.isMarkedToDestroy = false
  75.  
  76.     newGem.destination_y = j*40+60
  77.  
  78.    
  79.     --new gem falling animation
  80.     transition.to( newGem, { time=100, y= newGem.destination_y} )
  81.  
  82.     groupGameLayer:insert( newGem )
  83.  
  84.  
  85.     newGem.touch = onGemTouch
  86.     newGem:addEventListener( "touch", newGem )
  87.  
  88. return newGem
  89. end
  90.  
  91.  
  92.  
  93. local function shiftGems () -- not working yet <-- you stupid.. oh u <_< of coz it's working! :P
  94.  
  95. print ("Shifting Gems")
  96.  
  97. -- first roww
  98. for i = 1, 8, 1 do
  99. if gemsTable[i][1].isMarkedToDestroy then
  100.  
  101. -- current gem must go to a 'gemToBeDestroyed' variable holder to prevent memory leaks
  102. -- cannot destroy it now as gemsTable will be sorted and elements moved down
  103. gemToBeDestroyed = gemsTable[i][1]
  104.  
  105. -- create a new one
  106. gemsTable[i][1] = newGem(i,1)
  107.  
  108. -- destroy old gem
  109. gemToBeDestroyed:removeSelf()
  110. gemToBeDestroyed = nil
  111. end
  112. end
  113.  
  114. -- rest of the rows
  115. for j = 2, 8, 1 do -- j = row number - need to do like this it needs to be checked row by row
  116. for i = 1, 8, 1 do
  117.  
  118. if gemsTable[i][j].isMarkedToDestroy then --if you find and empty hole then shift down all gems in column
  119.  
  120. gemToBeDestroyed = gemsTable[i][j]
  121.  
  122. -- shiftin whole column down, element by element in one column
  123. for k = j, 2, -1 do -- starting from bottom - finishing at the second row
  124.  
  125. -- curent markedToDestroy Gem is replaced by the one above in the gemsTable
  126. gemsTable[i][k] = gemsTable[i][k-1]
  127. gemsTable[i][k].destination_y = gemsTable[i][k].destination_y +40
  128. transition.to( gemsTable[i][k], { time=100, y= gemsTable[i][k].destination_y} )
  129.  
  130. -- we change its j value as it has been 'moved down' in the gemsTable
  131. gemsTable[i][k].j = gemsTable[i][k].j + 1
  132.  
  133. end
  134.  
  135. -- create a new gem at the first row as there is en ampty space due to gems
  136. -- that have been moved in the column
  137. gemsTable[i][1] = newGem(i,1)
  138.  
  139. -- destroy the old gem (the one that was invisible and placed in gemToBeDestroyed holder)
  140. gemToBeDestroyed:removeSelf()
  141. gemToBeDestroyed = nil
  142. end
  143. end
  144. end
  145. end --shiftGems()
  146.  
  147.  
  148.  
  149. local function markToDestroy( self )
  150.  
  151. self.isMarkedToDestroy = true
  152. numberOfMarkedToDestroy = numberOfMarkedToDestroy + 1
  153.  
  154. -- check on the left
  155. if self.i>1 then
  156. if (gemsTable[self.i-1][self.j]).isMarkedToDestroy == false then
  157.  
  158. if (gemsTable[self.i-1][self.j]).gemType == self.gemType then
  159.  
  160. markToDestroy( gemsTable[self.i-1][self.j] )
  161. end
  162. end
  163. end
  164.  
  165. -- check on the right
  166. if self.i<8 then
  167. if (gemsTable[self.i+1][self.j]).isMarkedToDestroy == false then
  168.  
  169. if (gemsTable[self.i+1][self.j]).gemType == self.gemType then
  170.  
  171. markToDestroy( gemsTable[self.i+1][self.j] )
  172. end
  173. end
  174. end
  175.  
  176. -- check above
  177. if self.j>1 then
  178. if (gemsTable[self.i][self.j-1]).isMarkedToDestroy == false then
  179.  
  180. if (gemsTable[self.i][self.j-1]).gemType == self.gemType then
  181.  
  182. markToDestroy( gemsTable[self.i][self.j-1] )
  183. end
  184. end
  185. end
  186.  
  187. -- check below
  188. if self.j<8 then
  189. if (gemsTable[self.i][self.j+1]).isMarkedToDestroy== false then
  190.  
  191. if (gemsTable[self.i][self.j+1]).gemType == self.gemType then
  192.  
  193. markToDestroy( gemsTable[self.i][self.j+1] )
  194. end
  195. end
  196. end
  197. end
  198.  
  199.  
  200.  
  201. local function enableGemTouch()
  202.  
  203. isGemTouchEnabled = true
  204. end
  205.  
  206.  
  207.  
  208. local function destroyGems()
  209. print ("Destroying Gems. Marked to Destroy = "..numberOfMarkedToDestroy)
  210.  
  211.  
  212. for i = 1, 8, 1 do
  213. for j = 1, 8, 1 do
  214.  
  215. if gemsTable[i][j].isMarkedToDestroy then
  216.  
  217. isGemTouchEnabled = false
  218. transition.to( gemsTable[i][j], { time=300, alpha=0.2, xScale=2, yScale = 2, onComplete=enableGemTouch } )
  219.  
  220. -- update score
  221. score = score + 10
  222. scoreText.text = string.format( "SCORE: %6.0f", score )
  223. scoreText:setReferencePoint(display.TopLeftReferencePoint)
  224. scoreText.x = 60
  225.  
  226. end
  227. end
  228. end
  229.  
  230. numberOfMarkedToDestroy = 0
  231. timer.performWithDelay( 320, shiftGems )
  232.  
  233. end
  234.  
  235.  
  236.  
  237. local function cleanUpGems()
  238. print("Cleaning Up Gems")
  239.  
  240. numberOfMarkedToDestroy = 0
  241.  
  242. for i = 1, 8, 1 do
  243. for j = 1, 8, 1 do
  244.  
  245. -- show that there is not enough
  246. if gemsTable[i][j].isMarkedToDestroy then
  247. transition.to( gemsTable[i][j], { time=100, xScale=1.2, yScale = 1.2 } )
  248. transition.to( gemsTable[i][j], { time=100, delay=100, xScale=1.0, yScale = 1.0} )
  249. end
  250.  
  251. gemsTable[i][j].isMarkedToDestroy = false
  252.  
  253.  
  254. end
  255. end
  256. end
  257.  
  258.  
  259.  
  260. function onGemTouch( self, event )  -- was pre-declared
  261.  
  262. if event.phase == "began" and isGemTouchEnabled then
  263.  
  264. print("Gem touched i= "..self.i.." j= "..self.j)
  265.  
  266. markToDestroy(self)
  267.  
  268. if numberOfMarkedToDestroy >= 3 then
  269.  
  270. destroyGems()
  271. else
  272. cleanUpGems()
  273. end
  274. end
  275.  
  276. return true
  277.  
  278. end
  279.  
  280.  
  281.  
  282. function onTouchGameOverScreen ( self, event )
  283.  
  284.     if event.phase == "began" then
  285.        
  286.         storyboard.gotoScene( "menu-scene", "fade", 400  )
  287.        
  288.         return true
  289.     end
  290. end
  291.  
  292.  
  293. local function showGameOver ()
  294.  
  295.     gameOverLayout.alpha = 0.8
  296.     gameOverText1.alpha = 1
  297.     gameOverText2.alpha = 1
  298.  
  299.  
  300. end
  301.  
  302. local function gameTimerUpdate ()
  303.  
  304.     gameTimer = gameTimer - 1
  305.    
  306.     if gameTimer >= 0 then gameTimerText.text = gameTimer
  307.  
  308.     else
  309.         gameOverText2.text = string.format( "SCORE: %6.0f", score )
  310.         showGameOver()
  311.  
  312.     end
  313. end
  314.  
  315.  
  316. -- Called when the scene's view does not exist:
  317. function scene:createScene( event )
  318.         local screenGroup = self.view
  319.  
  320.         print( "\n1: createScene event")
  321.  
  322.         -----------------------------------------------------------------------------
  323.                
  324.         --      CREATE display objects and add them to 'group' here.
  325.         --      Example use-case: Restore 'group' from previously saved state.
  326.        
  327.         -----------------------------------------------------------------------------
  328.  
  329.     -- reseting values
  330.     score       = 0
  331.     gameTimer   = 30
  332.  
  333.  
  334.     groupGameLayer = display.newGroup()
  335.     groupEndGameLayer = display.newGroup()
  336.    
  337.     local bgGameImage = display.newImageRect( "bg.png", 320, 480, true )
  338.     bgGameImage.x = _W * 0.5
  339.     bgGameImage.y = _H * 0.5
  340.     groupGameLayer:insert(bgGameImage)
  341.     --score text
  342.    
  343.     scoreText = display.newText( "SCORE:" , 40, 20, native.systemFontBold, 32 )
  344.     scoreText.text = string.format( "SCORE: %6.0f", score )
  345.     scoreText:setReferencePoint(display.TopLeftReferencePoint)
  346.     scoreText.x = 60
  347.     scoreText:setTextColor(0, 0, 255)
  348.    
  349.    
  350.     gameTimerBar_bg = display.newRoundedRect( 20, 430, 280, 20, 4)
  351.     gameTimerBar_bg:setFillColor( 60, 60, 60 )
  352.     gameTimerBar = display.newRoundedRect( 20, 430, 280, 20, 4)
  353.     gameTimerBar:setFillColor( 0, 150, 0 )
  354.     gameTimerBar:setReferencePoint(display.TopLeftReferencePoint)
  355.  
  356.    
  357.     gameTimerText = display.newText( gameTimer , 0, 0, native.systemFontBold, 18 )
  358.     gameTimerText:setTextColor( 255, 255, 255 )
  359.     gameTimerText:setReferencePoint(display.TopLeftReferencePoint)
  360.     gameTimerText.x = _W * 0.5 - 12
  361.     gameTimerText.y = 426
  362.    
  363.     groupGameLayer:insert ( scoreText )
  364.     groupGameLayer:insert ( gameTimerBar_bg )
  365.     groupGameLayer:insert ( gameTimerBar )
  366.     groupGameLayer:insert ( gameTimerText )
  367.  
  368.     --gemsTable
  369.     for i = 1, 8, 1 do
  370.  
  371.         gemsTable[i] = {}
  372.  
  373.         for j = 1, 8, 1 do
  374.  
  375.             gemsTable[i][j] = newGem(i,j)
  376.    
  377.         end
  378.     end
  379.        
  380.  
  381.     gameOverLayout = display.newRect( 0, 0, 320, 480)
  382.     gameOverLayout:setFillColor( 0, 0, 0 )
  383.     gameOverLayout.alpha = 0
  384.    
  385.     gameOverText1 = display.newText( "GAME OVER", 0, 0, native.systemFontBold, 24 )
  386.     gameOverText1:setTextColor( 255 )
  387.     gameOverText1:setReferencePoint( display.CenterReferencePoint )
  388.     gameOverText1.x, gameOverText1.y = _W * 0.5, _H * 0.5 -150
  389.     gameOverText1.alpha = 0
  390.  
  391.     gameOverText2 = display.newText( "SCORE: ", 0, 0, native.systemFontBold, 24 )
  392.     gameOverText2.text = string.format( "SCORE: %6.0f", score )
  393.     gameOverText2:setTextColor( 255 )
  394.     gameOverText2:setReferencePoint( display.CenterReferencePoint )
  395.     gameOverText2.x, gameOverText2.y = _W * 0.5, _H * 0.5 - 50
  396.     gameOverText2.alpha = 0
  397.  
  398.    
  399.     gameOverLayout.touch = onTouchGameOverScreen
  400.     gameOverLayout:addEventListener( "touch", gameOverLayout )
  401.  
  402.  
  403.     groupEndGameLayer:insert ( gameOverLayout )
  404.     groupEndGameLayer:insert ( gameOverText1 )
  405.     groupEndGameLayer:insert ( gameOverText2 )
  406.  
  407.  
  408.     -- insterting display groups to the screen group (storyboard group)
  409.     screenGroup:insert ( groupGameLayer )
  410.     screenGroup:insert ( groupEndGameLayer )
  411. end
  412.  
  413. -- Called BEFORE scene has moved onscreen:
  414. function scene:willEnterScene( event )
  415.         local screenGroup = self.view
  416.        
  417.         -----------------------------------------------------------------------------
  418.                
  419.         --      This event requires build 2012.782 or later.
  420.        
  421.         -----------------------------------------------------------------------------
  422.        
  423. end
  424.  
  425. -- Called immediately after scene has moved onscreen:
  426. function scene:enterScene( event )
  427.         local screenGroup = self.view
  428.        
  429.         -----------------------------------------------------------------------------
  430.                
  431.         --      INSERT code here (e.g. start timers, load audio, start listeners, etc.)
  432.        
  433.         -----------------------------------------------------------------------------
  434.    
  435.     -- remove previous scene's view
  436.        
  437.     storyboard.purgeScene( "menu-scene" )
  438.  
  439.     print( "1: enterScene event" )
  440.    
  441.     -- storyboard.purgeScene( "scene4" )
  442.  
  443.     -- reseting values
  444.     score = 0
  445.    
  446.  
  447.     transition.to( gameTimerBar, { time = gameTimer * 1000, width=0 } )
  448.     timers.gameTimerUpdate = timer.performWithDelay(1000, gameTimerUpdate, 0)
  449.                
  450.  
  451.  
  452. end
  453.  
  454.  
  455. -- Called when scene is about to move offscreen:
  456. function scene:exitScene( event )
  457.         local screenGroup = self.view
  458.        
  459.         -----------------------------------------------------------------------------
  460.        
  461.         --      INSERT code here (e.g. stop timers, remove listeners, unload sounds, etc.)
  462.        
  463.         -----------------------------------------------------------------------------
  464.        
  465.     if timers.gameTimerUpdate then
  466.         timer.cancel(timers.gameTimerUpdate)
  467.         timers.gameTimerUpdate = nil
  468.      end
  469.  
  470. end
  471.  
  472. -- Called AFTER scene has finished moving offscreen:
  473. function scene:didExitScene( event )
  474.         local screenGroup = self.view
  475.        
  476.         -----------------------------------------------------------------------------
  477.                
  478.         --      This event requires build 2012.782 or later.
  479.        
  480.         -----------------------------------------------------------------------------
  481.        
  482. end
  483.  
  484.  
  485. -- Called prior to the removal of scene's "view" (display group)
  486. function scene:destroyScene( event )
  487.         local screenGroup = self.view
  488.        
  489.         -----------------------------------------------------------------------------
  490.        
  491.         --      INSERT code here (e.g. remove listeners, widgets, save state, etc.)
  492.        
  493.         -----------------------------------------------------------------------------
  494.        
  495. end
  496.  
  497. -- Called if/when overlay scene is displayed via storyboard.showOverlay()
  498. function scene:overlayBegan( event )
  499.         local screenGroup = self.view
  500.         local overlay_scene = event.sceneName  -- overlay scene name
  501.        
  502.         -----------------------------------------------------------------------------
  503.                
  504.         --      This event requires build 2012.797 or later.
  505.        
  506.         -----------------------------------------------------------------------------
  507.        
  508. end
  509.  
  510. -- Called if/when overlay scene is hidden/removed via storyboard.hideOverlay()
  511. function scene:overlayEnded( event )
  512.         local screenGroup = self.view
  513.         local overlay_scene = event.sceneName  -- overlay scene name
  514.  
  515.         -----------------------------------------------------------------------------
  516.                
  517.         --      This event requires build 2012.797 or later.
  518.        
  519.         -----------------------------------------------------------------------------
  520.        
  521. end
  522.  
  523.  
  524.  
  525. ---------------------------------------------------------------------------------
  526. -- END OF YOUR IMPLEMENTATION
  527. ---------------------------------------------------------------------------------
  528.  
  529. -- "createScene" event is dispatched if scene's view does not exist
  530. scene:addEventListener( "createScene", scene )
  531.  
  532. -- "willEnterScene" event is dispatched before scene transition begins
  533. scene:addEventListener( "willEnterScene", scene )
  534.  
  535. -- "enterScene" event is dispatched whenever scene transition has finished
  536. scene:addEventListener( "enterScene", scene )
  537.  
  538. -- "exitScene" event is dispatched before next scene's transition begins
  539. scene:addEventListener( "exitScene", scene )
  540.  
  541. -- "didExitScene" event is dispatched after scene has finished transitioning out
  542. scene:addEventListener( "didExitScene", scene )
  543.  
  544. -- "destroyScene" event is dispatched before view is unloaded, which can be
  545. -- automatically unloaded in low memory situations, or explicitly via a call to
  546. -- storyboard.purgeScene() or storyboard.removeScene().
  547. scene:addEventListener( "destroyScene", scene )
  548.  
  549. -- "overlayBegan" event is dispatched when an overlay scene is shown
  550. scene:addEventListener( "overlayBegan", scene )
  551.  
  552. -- "overlayEnded" event is dispatched when an overlay scene is hidden/removed
  553. scene:addEventListener( "overlayEnded", scene )
  554.  
  555. ---------------------------------------------------------------------------------
  556.  
  557. return scene
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement