Advertisement
alestane

Generalization

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