resources/scenebegin.lua

Thu, 22 Aug 2013 19:50:12 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Aug 2013 19:50:12 +0200
changeset 0
bba7a2a225f6
permissions
-rw-r--r--

Flush progress with initial commit, improve application.

     1 -- Initiate scene management
     2 local sceneloc = director:createScene()
     3 sceneloc.name = 'Scene: Begin'
     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
    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
    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')
    26 -- Prepare math runtime
    27 math.randomseed(os.time())
    28 math.random(); math.random(); math.random(); math.random()
    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
    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
    45         spriteIn.x = spriteIn.x + dsh
    46     end
    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)
    56     -- Instantiate star field particles behind hero
    57     local partiStarfar = director:createParticles('particles/stars.plist')
    58     partiStarfar.sourcePos = {dsw, dmh}
    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         })
    68     local animHero = director:createAnimation({
    69         start = 1,
    70         count = 8,
    71         atlas = atlasHero,
    72         delay = 1/8,
    73         })
    75     local spriteHero = director:createSprite({
    76         name='hero', x=dsw/8, y=dmh,
    77         xAnchor=0.5, yAnchor=0.5,
    78         source=animHero,
    79         })
    81     -- Instantiate star field particles in front of hero
    82     local partiStarnear = director:createParticles('particles/stars.plist')
    83     partiStarnear.sourcePos = {dsw, dmh}
    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
   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
   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)
   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})
   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)
   156     -- Start audio streams
   157     audio:loadStream('sounds/dream.mp3')
   158     audio:playStream('sounds/dream.mp3', true)
   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,
   171         modeGravity={
   172             --gravity={-90, 0},
   173             speed=180, speedVar=50,
   174             radialAccel=0, radialAccelVar=0,
   175             --tangentialAccel=0, tangentialAccelVar=40,
   176             },
   178         --angle=90, angleVar=20,
   179         angle=180, angleVar=10,
   180         life=4, lifeVar=2,
   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,
   186         startSize=24.0, startSizeVar=2.0,
   187         endSize=particles.startSizeEqualToEndSize
   188     })
   189     partiSmoke:stop()
   190     spriteHero:addChild(partiSmoke)
   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
   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})
   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
   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})
   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)
   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)
   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         })
   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
   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)
   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})
   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})
   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
   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
   468 sceneloc:addEventListener({'setUp', 'tearDown', 'enterPreTransition',
   469     'enterPostTransition', 'exitPreTransition', 'exitPostTransition'}, sceneloc)
   471 return sceneloc

mercurial