SHOW:
|
|
- or go back to the newest paste.
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 | - | local R = mRandom(1,4) |
50 | + | |
51 | local R = kinds[mRandom(1,4)] | |
52 | - | if (R == 1 ) then |
52 | + | |
53 | - | img = "fish.png" |
53 | + | newGem = display.newImageRect(R..".png", 40, 40) |
54 | - | newGem.gemType = "fish" |
54 | + | |
55 | - | elseif (R == 2 ) then |
55 | + | |
56 | - | img = "star.png" |
56 | + | |
57 | - | newGem.gemType = "star" |
57 | + | |
58 | newGem.isMarkedToDestroy = false | |
59 | - | elseif (R == 3 ) then |
59 | + | newGem.gemType = R |
60 | - | img = "turtle.png" |
60 | + | |
61 | - | newGem.gemType = "turtle" |
61 | + | |
62 | ||
63 | - | elseif (R == 4 ) then |
63 | + | |
64 | - | img = "shell.png" |
64 | + | |
65 | - | newGem.gemType = "shell" |
65 | + | |
66 | ||
67 | groupGameLayer:insert( newGem ) | |
68 | ||
69 | - | newGem = display.newImageRect(img, 40, 40) |
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 |