resources/scenebegin.lua

changeset 0
bba7a2a225f6
equal deleted inserted replaced
-1:000000000000 0:a8c93e613041
1 -- Initiate scene management
2 local sceneloc = director:createScene()
3 sceneloc.name = 'Scene: Begin'
4
5 -- Calculate constants
6 local dsw = director.displayWidth
7 local dsh = director.displayHeight
8 local dmw = director.displayCenterX
9 local dmh = director.displayCenterY
10 local nFoodpoints = 2
11 local nAsterpoints = -2
12 local nCometpoints = -1
13
14 -- Initialize common variables
15 local spriteNull = director:createSprite(0, 0)
16 local timerHero = director:createNode()
17 local labReady = director:createNode()
18 local nHealth = 0
19 local tweenOut = 0
20
21 -- Instantiate common fonts
22 local fontSegoe = director:createFont('fonts/SegoeUI-64pt_bold.fnt')
23 local fontArial = director:createFont('fonts/Arial-96pt_bold.fnt')
24 --local fontFxsys = director:createFont('fonts/Fixedsys-96pt_norm.fnt')
25
26 -- Prepare math runtime
27 math.randomseed(os.time())
28 math.random(); math.random(); math.random(); math.random()
29
30 function sceneloc:setUp(event)
31 -- Create sprite, bottom left of image is at bottom left of display
32 --local spriteGalaxy = director:createSprite(0, 0, 'textures/galaxyback_720.png')
33 local spriteGalaxy = director:createSprite(0, 0, 'textures/galaxyback_360.png')
34 spriteGalaxy.xScale = 2 -- Needed due to small maximum sprite size
35 spriteGalaxy.yScale = 2 -- Needed due to small maximum sprite size
36
37 -- Animate the image to scroll along the X axis over 2 minutes
38 funcyScroll = function(spriteIn)
39 if spriteIn.xFlip == false then
40 spriteIn.xFlip = true
41 else
42 spriteIn.xFlip = false
43 end
44
45 spriteIn.x = spriteIn.x + dsh
46 end
47
48 funcyGalstart = function(spriteIn)
49 --tween:cancel(tweenReady)
50 tweenReadweg = tween:dissolve(labReady, spriteNull, .5, 0)
51 labReady = ''
52 end
53 --tween:to(spriteGalaxy, {delay=5, time=120, x=dsw-spriteGalaxy.w, mode='repeat', onComplete=funcyScroll})
54 local tweenBack = tween:to(spriteGalaxy, {delay=5, time=100, mode='repeat', x=dsw-spriteGalaxy.w*2, onStart=funcyGalstart}) -- *2 for xyScale (above)
55
56 -- Instantiate star field particles behind hero
57 local partiStarfar = director:createParticles('particles/stars.plist')
58 partiStarfar.sourcePos = {dsw, dmh}
59
60 -- Create hero, middle of left edge of screen
61 local atlasHero = director:createAtlas({
62 width = 300,
63 height = 200,
64 numFrames = 8,
65 textureName = 'textures/heroatlas.png',
66 })
67
68 local animHero = director:createAnimation({
69 start = 1,
70 count = 8,
71 atlas = atlasHero,
72 delay = 1/8,
73 })
74
75 local spriteHero = director:createSprite({
76 name='hero', x=dsw/8, y=dmh,
77 xAnchor=0.5, yAnchor=0.5,
78 source=animHero,
79 })
80
81 -- Instantiate star field particles in front of hero
82 local partiStarnear = director:createParticles('particles/stars.plist')
83 partiStarnear.sourcePos = {dsw, dmh}
84
85 -- Instantiate good things, like cheese
86 funcyFood = function(spriteIn)
87 --tween:cancel(tweenOut)
88 --spriteIn.tweens[1].delay = math.random(0, 5)
89 spriteIn.y = math.random(dsh/16, dsh-dsh/16)
90 spriteIn.isVisible = true
91 end
92 local spriteCattin = director:createSprite(dsw, dmh, 'textures/cattin.png')
93 local tweenCattin = tween:to(spriteCattin, {delay=math.random(1, 10), time=12, mode='repeat', x=-dsw, onComplete=funcyFood})
94 spriteCattin.name = 'food'
95 spriteCattin.xAnchor = 0
96 spriteCattin.yAnchor = 0
97 spriteCattin.xScale = .5
98 spriteCattin.yScale = .5
99 local spriteCheese = director:createSprite(dsw, dmh, 'textures/cheesepiece.png')
100 local tweenCheese = tween:to(spriteCheese, {delay=math.random(1, 10), time=16, mode='repeat', x=-dsw, onComplete=funcyFood, xAnchor=0, yAnchor=0})
101 spriteCheese.name = 'food'
102 spriteCheese.xAnchor = 0
103 spriteCheese.yAnchor = 0
104 spriteCheese.xScale = .8
105 spriteCheese.yScale = .8
106 local spriteFischkopf = director:createSprite(dsw, dmh, 'textures/fischkopfe.png')
107 local tweenFischkopf = tween:to(spriteFischkopf, {delay=math.random(1, 10), time=8, mode='repeat', x=-dsw, onComplete=funcyFood})
108 spriteFischkopf.name = 'food'
109 spriteFischkopf.xAnchor = 0
110 spriteFischkopf.yAnchor = 0
111 spriteFischkopf.xScale = .325
112 spriteFischkopf.yScale = .325
113
114 -- Instantiate comets and other dangerous particles
115 funcyStartdang = function(spriteIn)
116 -- Adjust delay to spread out danger objects
117 --spriteIn.
118 end
119 funcyComets = function(spriteIn)
120 local locVert = math.random(dsh/16, dsh-dsh/16)
121 spriteIn.tweens.delay = math.random(1, 10)
122 spriteIn.y = locVert
123 end
124 funcyGalies = function(spriteIn)
125 local locVert = math.random(dsh/16, dsh-dsh/16)
126 spriteIn.tweens.delay = math.random(1, 10)
127 spriteIn.y = locVert
128 end
129
130 local posComety = math.random(dsh/16, dsh-dsh/16)
131 local timComety = math.random(5, 12)
132 local posGalaxy = math.random(dsh/16, dsh-dsh/16)
133 local timGalaxy = math.random(5, 12)
134
135 -- Overlays needed for collision detection (particles arent detected)
136 local spriteCom = director:createSprite({name='comet', x=dsw+dsw/4, y=posComety})
137 spriteCom.name = 'comet'
138 local tweenCom = tween:to(spriteCom, {delay=timComety, time=13, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyComets})
139 local spriteGal = director:createSprite(dsw+dsw/4, posGalaxy)
140 spriteGal.name = 'comet'
141 local tweenGal = tween:to(spriteGal, {delay=timGalaxy, time=11, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyGalies})
142
143 local partiComet = director:createParticles('particles/comets.plist')
144 --partiComet.name = 'comet'
145 --partiComet.sourcePos = {dsw+dsw/4, posComety}
146 --partiComet.sourcePos = {0, 60}
147 --tween:to(partiComet, {delay=timComety, time=11, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyComets})
148 local partiGalax = director:createParticles('particles/galaxies.plist')
149 --partiGalax.name = 'comet'
150 --partiGalax.sourcePos = {dsw+dsw/4, posGalaxy}
151 --partiGalax.sourcePos = {0, 40}
152 --tween:to(partiGalax, {delay=timGalaxy, time=9, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyGalies})
153 spriteCom:addChild(partiComet)
154 spriteGal:addChild(partiGalax)
155
156 -- Start audio streams
157 audio:loadStream('sounds/dream.mp3')
158 audio:playStream('sounds/dream.mp3', true)
159
160 -- Instantiate motor smoke particles
161 -- Create from an initialiser list
162 local partiSmoke = director:createParticles({
163 totalParticles=1500,
164 source='particles/fire.png',
165 emitterMode=particles.modeGravity, emitterRate=1500/3.5,
166 --sourcePos={dsw/8, dmh},
167 sourcePos={spriteHero.w/6, spriteHero.h/2},
168 sourcePosVar={0, 16},
169 duration=particles.durationInfinity,
170
171 modeGravity={
172 --gravity={-90, 0},
173 speed=180, speedVar=50,
174 radialAccel=0, radialAccelVar=0,
175 --tangentialAccel=0, tangentialAccelVar=40,
176 },
177
178 --angle=90, angleVar=20,
179 angle=180, angleVar=10,
180 life=4, lifeVar=2,
181
182 --startColor={0x80, 0x80, 0x80, 0xff}, startColorVar={0x80, 0x80, 0x80, 25},
183 --endColor={25, 25, 25, 50}, endColorVar={25, 25, 25, 50},
184 startColor=color.white, endColor=color.black,
185
186 startSize=24.0, startSizeVar=2.0,
187 endSize=particles.startSizeEqualToEndSize
188 })
189 partiSmoke:stop()
190 spriteHero:addChild(partiSmoke)
191
192 ---- Instantiate asteroids
193 funcyAster = function(spriteIn)
194 spriteIn:rotate(30)
195 spriteIn.y = math.random(dsh/16, dsh-dsh/16)
196 end
197 local spriteAster1 = director:createSprite(dsw, dmh, 'textures/asteroid1.png')
198 local tweenAster1 = tween:to(spriteAster1, {delay=math.random(5, 12), time=8, mode='repeat', x=-dsw, onComplete=funcyAster})
199 spriteAster1.name = 'aster'
200 spriteAster1.xAnchor = 0
201 spriteAster1.yAnchor = 0
202 spriteAster1.xScale = .25
203 spriteAster1.yScale = .25
204 local spriteAster2 = director:createSprite(dsw, dmh, 'textures/asteroid2.png')
205 local tweenAster2 = tween:to(spriteAster2, {delay=math.random(5, 12), time=10, mode='repeat', x=-dsw, onComplete=funcyAster})
206 spriteAster2.name = 'aster'
207 spriteAster2.xAnchor = 0
208 spriteAster2.yAnchor = 0
209 spriteAster2.xScale = .25
210 spriteAster2.yScale = .25
211
212 -- Instantiate explanation text
213 labReady = director:createLabel({
214 hAlignment='centre',
215 vAlignment='middle',
216 --font=fontFxsys,
217 font=fontArial,
218 text='Ready!',
219 color=color.white,
220 alpha=0})
221 local tweenReady = tween:to(labReady, {time=.5, easing=ease.powIn, textXScale=2, textYScale=2, alpha=1})
222
223 -- Initialize physics simulation
224 physics:setGravity(0, 0)
225 local ptRndbox = {100,50, 260,50, 290,80, 290,120, 260,150, 80,150}
226 physics:addNode(spriteHero, {isSensor = true, shape=ptRndbox})
227 physics:addNode(spriteCattin, {isSensor = true})
228 physics:addNode(spriteCheese, {isSensor = true})
229 physics:addNode(spriteFischkopf, {isSensor = true})
230 --physics:addNode(partiComet, {isSensor = true})
231 --physics:addNode(partiGalax, {isSensor = true})
232 local ptTri = {-45,0, 75,-90, 75,90}
233 local ptSmal = {-30,0, 100,-20, 100,40}
234 physics:addNode(spriteCom, {isSensor = true, shape=ptTri})
235 physics:addNode(spriteGal, {isSensor = true, shape=ptSmal})
236 physics:addNode(spriteAster1, {isSensor = true}) -- Set in tween instead
237 physics:addNode(spriteAster2, {isSensor = true}) -- Set in tween instead
238 --spriteCom.physics.radius = 50
239 --spriteGal.physics.radius = 50
240 -- Marmalade bug if radius is different than actual perfectly round object image
241 spriteAster1.physics.radius = spriteAster1.w/2
242 spriteAster2.physics.radius = spriteAster2.w/2
243 --physics.debugDraw = true
244
245 -- Implement collision listener
246 function hit(event)
247 if event.phase == 'began' then
248 --local labHit = director:createLabel({x=event.nodeA.x, y=event.nodeA.y, text=event.nodeB.name, font=fontSegoe, color=color.white})
249 if event.nodeA.name == 'food' then
250 --tween:cancel(event.nodeA.tweens[1])
251 --tweenOut = tween:dissolve(event.nodeA, spriteNull, 1, 0)
252 --table.insert(event.nodeA.tweens, tween:dissolve(event.nodeA, spriteNull, 1, 0))
253 --event.nodeA.x = math.random(dsw/16, dsw-dsw/16)
254 --event.nodeA.y = math.random(dsh/16, dsh-dsh/16)
255 event.nodeA.isVisible = false
256 audio:playSound('sounds/belch.pcm')
257 nHealth = nHealth + nFoodPoints
258 local labPoints = director:createLabel({
259 x=0, y=0,
260 hAlignment='centre',
261 vAlignment='middle',
262 textXScale=.5,
263 textYScale=.5,
264 --font=fontFxsys,
265 font=fontArial,
266 text='+' .. nFoodpoints,
267 color=color.white,
268 alpha=1})
269 local tweenPoints = tween:to(labPoints, {time=1, easing=ease.powIn, textXScale=15, textYScale=15, alpha=0})
270 elseif event.nodeB.name == 'food' then
271 event.nodeB.isVisible = false
272 audio:playSound('sounds/belch.pcm')
273 nHealth = nHealth + nFoodpoints
274 local labPoints = director:createLabel({
275 x=0, y=0,
276 hAlignment='centre',
277 vAlignment='middle',
278 textXScale=.5,
279 textYScale=.5,
280 --font=fontFxsys,
281 font=fontArial,
282 text='+' .. nFoodpoints,
283 color=color.white,
284 alpha=1})
285
286 local tweenPoints = tween:to(labPoints, {time=1, easing=ease.powIn, textXScale=15, textYScale=15, alpha=0})
287 elseif event.nodeA.name == 'aster' then
288 local diffiX = event.nodeB.x - event.nodeA.x
289 local diffiY = event.nodeB.y - event.nodeA.y
290 tween:cancel(event.nodeB.tweens[1])
291 --tween:to(spriteHero, {time=0.5, easing=ease.powOut, easingValue=5, x=event.nodeB.x-diffiX*2, y=event.nodeB.y-diffiY*2})
292 tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=5, x=spriteHero.x-dsw/16, y=spriteHero.y})
293 --if device:isVibrationAvailable() then
294 -- device:vibrate(100)
295 --end
296 audio:playSound('sounds/ouch.pcm')
297 nHealth = nHealth + nAsterpoints
298 elseif event.nodeB.name == 'aster' then
299 tween:cancel(event.nodeA.tweens[1])
300 tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=5, x=spriteHero.x-dsw/16, y=spriteHero.y})
301 --if device:isVibrationAvailable() then
302 -- device:vibrate(100)
303 --end
304 audio:playSound('sounds/ouch.pcm')
305 nHealth = nHealth + nAsterpoints
306 elseif event.nodeA.name == 'comet' then
307 --if device:isVibrationAvailable() then
308 -- device:vibrate(800)
309 --end
310 audio:playSound('sounds/torche.pcm')
311 nHealth = nHealth + nCometpoints
312 elseif event.nodeB.name == 'comet' then
313 --if device:isVibrationAvailable() then
314 -- device:vibrate(800)
315 --end
316 audio:playSound('sounds/torche.pcm')
317 nHealth = nHealth + nCometpoints
318 end
319 end
320 return true
321 end
322 spriteHero:addEventListener('collision', hit)
323
324 -- Implement event handlers
325 -- General screen touch move events
326 --Marmalade bugs cause audio to fail!
327 function moveStart(event)
328 --if not partiSmoke:isActive() then
329 partiSmoke:reset()
330 --end
331 --local audiMotor = audio:playSound('sounds/motor.pcm') -- distracting
332 end
333 function moveStop(event)
334 partiSmoke:stop()
335 audio:stopSound(audiMotor)
336 end
337 function touch(event)
338 if event.phase=='began' then
339 --also: powIn, expIn, sineIn, elasticIn, bounceIn, backIn
340 tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=2, x=event.x, y=event.y, onStart=moveStart, onComplete=moveStop})
341 elseif event.phase=='ended' then
342 -- Noop
343 --dbg.print('Noop')
344 --system:sendEvent('stopMotor', {timeIn=2, sizeFart=5})
345 elseif event.phase=='moved' then
346 tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=2, x=event.x, y=event.y, onStart=moveStart, onComplete=moveStop})
347 end
348 end
349 system:addEventListener('touch', touch)
350
351 -- Start health timers and label appropriately
352 nHealth = 90 -- A minute and a half of life
353 local labHealth = director:createLabel({
354 x=-fontArial.height*1.75, y=fontArial.height/4,
355 hAlignment='right',
356 vAlignment='bottom',
357 font=fontArial,
358 text='Health',
359 color=color.white,
360 alpha=.375
361 })
362 local labDeath = director:createLabel({
363 x=-fontArial.height/2, y=fontArial.height/4,
364 hAlignment='right',
365 vAlignment='bottom',
366 font=fontArial,
367 text=nHealth,
368 color=color.white,
369 alpha=.375
370 })
371
372 funcyHealth = function(event)
373 thisNode = event.target
374 --timerObject = event.timer
375 --iterationsLeft = event.doneIterations
376 --thisNode.health = thisNode.health - 1
377 nHealth = nHealth - 1
378 labDeath.text = nHealth
379
380 -- Is the game over?
381 if nHealth <= 0 then
382 timerHero:cancel()
383 --audio:stopStream()
384 --tween:cancel(tweenBack)
385 tween:cancel(tweenCattin)
386 tween:cancel(tweenCheese)
387 tween:cancel(tweenFischkopf)
388 tween:cancel(tweenCom)
389 tween:cancel(tweenGal)
390 tween:cancel(tweenAster1)
391 tween:cancel(tweenAster2)
392 system:removeEventListener('touch', touch)
393
394 local rectGover = director:createRectangle({
395 x=0, y=0,
396 w=dsw, h=dsh,
397 strokeWidth=0,
398 color=color.black,
399 alpha=0})
400 local labGover = director:createLabel({
401 --x=0, y=fontArial.height,
402 hAlignment='centre',
403 vAlignment='middle',
404 --font=fontFxsys,
405 font=fontArial,
406 text='GAME OVER',
407 color=color.white,
408 alpha=0})
409
410 --powIn, expIn, sineIn, elasticIn, bounceIn, backIn, easingValue
411 local tweenGvback = tween:to(rectGover, {time=2, alpha=.6})
412 local tweenGvtext = tween:to(labGover, {time=3, easing=ease.expIn, easingValue=3, textXScale=2, textYScale=2, alpha=1})
413 local tweenGvlast = tween:to(labGover, {delay=3, time=1.5, mode='mirror', easing=ease.backOut, textXScale=2.125, textYScale=2.125})
414
415 -- Not ready for prime time (must implement back stack noch)
416 ---- Instantiate replay and back buttons
417 --local butPlay = director:createSprite({xAnchor=1, source='images/butplay.png', alpha=0})
418 --butPlay.x = dmw - butPlay.w/12
419 --butPlay.y = dmh - butPlay.h
420 --local butBack = director:createSprite({source='images/butback2.png', alpha=0})
421 --butBack.x = dmw + butBack.w/12
422 --butBack.y = dmh - butBack.h
423 --tweenButplayin = tween:to(butPlay, {delay=4.0, time=1, alpha=1})
424 --tweenButbackin = tween:to(butBack, {delay=4.5, time=1, alpha=1})
425 --function butPlay:touch(event)
426 -- if event.phase == 'began' then
427 -- director:moveToScene(sceneBegin, transoptr)
428 -- end
429 -- return true
430 --end
431 --butPlay:addEventListener('touch', butPlay)
432 --function butBack:touch(event)
433 -- if event.phase == 'began' then
434 -- director:moveToScene(sceneIntro, transoptr)
435 -- end
436 -- return true
437 --end
438 --butBack:addEventListener('touch', butBack)
439 end
440 end
441 --timerHealth = system:addTimer(funcyHealth, 1, 0, 4)
442 timerHero = spriteHero:addTimer(funcyHealth, 1, 0, 4)
443 end
444
445 function sceneloc:tearDown(event)
446 dbg.print('sceneloc:tearDown')
447 audio:stopStream()
448 --self.releaseResources()
449 --self.<obj-here> = self.<obj-here>:removeFromParent()
450 --self.obj0:removeFromParent()
451 --self.obj1:removeFromParent()
452 --self.obj0 = nil
453 --self.obj1 = nil
454 end
455 function sceneloc:enterPreTransition(event)
456 dbg.print('sceneloc:enterPreTransition')
457 end
458 function sceneloc:enterPostTransition(event)
459 dbg.print('sceneloc:enterPostTransition')
460 end
461 function sceneloc:exitPreTransition(event)
462 dbg.print('sceneloc:exitPreTransition')
463 end
464 function sceneloc:exitPostTransition(event)
465 dbg.print('sceneloc:exitPostTransition')
466 end
467
468 sceneloc:addEventListener({'setUp', 'tearDown', 'enterPreTransition',
469 'enterPostTransition', 'exitPreTransition', 'exitPostTransition'}, sceneloc)
470
471 return sceneloc
472

mercurial