diff -r 000000000000 -r bba7a2a225f6 resources/scenebegin.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resources/scenebegin.lua Thu Aug 22 19:50:12 2013 +0200 @@ -0,0 +1,472 @@ +-- Initiate scene management +local sceneloc = director:createScene() +sceneloc.name = 'Scene: Begin' + +-- Calculate constants +local dsw = director.displayWidth +local dsh = director.displayHeight +local dmw = director.displayCenterX +local dmh = director.displayCenterY +local nFoodpoints = 2 +local nAsterpoints = -2 +local nCometpoints = -1 + +-- Initialize common variables +local spriteNull = director:createSprite(0, 0) +local timerHero = director:createNode() +local labReady = director:createNode() +local nHealth = 0 +local tweenOut = 0 + +-- Instantiate common fonts +local fontSegoe = director:createFont('fonts/SegoeUI-64pt_bold.fnt') +local fontArial = director:createFont('fonts/Arial-96pt_bold.fnt') +--local fontFxsys = director:createFont('fonts/Fixedsys-96pt_norm.fnt') + +-- Prepare math runtime +math.randomseed(os.time()) +math.random(); math.random(); math.random(); math.random() + +function sceneloc:setUp(event) + -- Create sprite, bottom left of image is at bottom left of display + --local spriteGalaxy = director:createSprite(0, 0, 'textures/galaxyback_720.png') + local spriteGalaxy = director:createSprite(0, 0, 'textures/galaxyback_360.png') + spriteGalaxy.xScale = 2 -- Needed due to small maximum sprite size + spriteGalaxy.yScale = 2 -- Needed due to small maximum sprite size + + -- Animate the image to scroll along the X axis over 2 minutes + funcyScroll = function(spriteIn) + if spriteIn.xFlip == false then + spriteIn.xFlip = true + else + spriteIn.xFlip = false + end + + spriteIn.x = spriteIn.x + dsh + end + + funcyGalstart = function(spriteIn) + --tween:cancel(tweenReady) + tweenReadweg = tween:dissolve(labReady, spriteNull, .5, 0) + labReady = '' + end + --tween:to(spriteGalaxy, {delay=5, time=120, x=dsw-spriteGalaxy.w, mode='repeat', onComplete=funcyScroll}) + local tweenBack = tween:to(spriteGalaxy, {delay=5, time=100, mode='repeat', x=dsw-spriteGalaxy.w*2, onStart=funcyGalstart}) -- *2 for xyScale (above) + + -- Instantiate star field particles behind hero + local partiStarfar = director:createParticles('particles/stars.plist') + partiStarfar.sourcePos = {dsw, dmh} + + -- Create hero, middle of left edge of screen + local atlasHero = director:createAtlas({ + width = 300, + height = 200, + numFrames = 8, + textureName = 'textures/heroatlas.png', + }) + + local animHero = director:createAnimation({ + start = 1, + count = 8, + atlas = atlasHero, + delay = 1/8, + }) + + local spriteHero = director:createSprite({ + name='hero', x=dsw/8, y=dmh, + xAnchor=0.5, yAnchor=0.5, + source=animHero, + }) + + -- Instantiate star field particles in front of hero + local partiStarnear = director:createParticles('particles/stars.plist') + partiStarnear.sourcePos = {dsw, dmh} + + -- Instantiate good things, like cheese + funcyFood = function(spriteIn) + --tween:cancel(tweenOut) + --spriteIn.tweens[1].delay = math.random(0, 5) + spriteIn.y = math.random(dsh/16, dsh-dsh/16) + spriteIn.isVisible = true + end + local spriteCattin = director:createSprite(dsw, dmh, 'textures/cattin.png') + local tweenCattin = tween:to(spriteCattin, {delay=math.random(1, 10), time=12, mode='repeat', x=-dsw, onComplete=funcyFood}) + spriteCattin.name = 'food' + spriteCattin.xAnchor = 0 + spriteCattin.yAnchor = 0 + spriteCattin.xScale = .5 + spriteCattin.yScale = .5 + local spriteCheese = director:createSprite(dsw, dmh, 'textures/cheesepiece.png') + local tweenCheese = tween:to(spriteCheese, {delay=math.random(1, 10), time=16, mode='repeat', x=-dsw, onComplete=funcyFood, xAnchor=0, yAnchor=0}) + spriteCheese.name = 'food' + spriteCheese.xAnchor = 0 + spriteCheese.yAnchor = 0 + spriteCheese.xScale = .8 + spriteCheese.yScale = .8 + local spriteFischkopf = director:createSprite(dsw, dmh, 'textures/fischkopfe.png') + local tweenFischkopf = tween:to(spriteFischkopf, {delay=math.random(1, 10), time=8, mode='repeat', x=-dsw, onComplete=funcyFood}) + spriteFischkopf.name = 'food' + spriteFischkopf.xAnchor = 0 + spriteFischkopf.yAnchor = 0 + spriteFischkopf.xScale = .325 + spriteFischkopf.yScale = .325 + + -- Instantiate comets and other dangerous particles + funcyStartdang = function(spriteIn) + -- Adjust delay to spread out danger objects + --spriteIn. + end + funcyComets = function(spriteIn) + local locVert = math.random(dsh/16, dsh-dsh/16) + spriteIn.tweens.delay = math.random(1, 10) + spriteIn.y = locVert + end + funcyGalies = function(spriteIn) + local locVert = math.random(dsh/16, dsh-dsh/16) + spriteIn.tweens.delay = math.random(1, 10) + spriteIn.y = locVert + end + + local posComety = math.random(dsh/16, dsh-dsh/16) + local timComety = math.random(5, 12) + local posGalaxy = math.random(dsh/16, dsh-dsh/16) + local timGalaxy = math.random(5, 12) + + -- Overlays needed for collision detection (particles arent detected) + local spriteCom = director:createSprite({name='comet', x=dsw+dsw/4, y=posComety}) + spriteCom.name = 'comet' + local tweenCom = tween:to(spriteCom, {delay=timComety, time=13, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyComets}) + local spriteGal = director:createSprite(dsw+dsw/4, posGalaxy) + spriteGal.name = 'comet' + local tweenGal = tween:to(spriteGal, {delay=timGalaxy, time=11, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyGalies}) + + local partiComet = director:createParticles('particles/comets.plist') + --partiComet.name = 'comet' + --partiComet.sourcePos = {dsw+dsw/4, posComety} + --partiComet.sourcePos = {0, 60} + --tween:to(partiComet, {delay=timComety, time=11, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyComets}) + local partiGalax = director:createParticles('particles/galaxies.plist') + --partiGalax.name = 'comet' + --partiGalax.sourcePos = {dsw+dsw/4, posGalaxy} + --partiGalax.sourcePos = {0, 40} + --tween:to(partiGalax, {delay=timGalaxy, time=9, x=-dsw-dsw/4, mode='repeat', onStart=funcyStartdang, onComplete=funcyGalies}) + spriteCom:addChild(partiComet) + spriteGal:addChild(partiGalax) + + -- Start audio streams + audio:loadStream('sounds/dream.mp3') + audio:playStream('sounds/dream.mp3', true) + + -- Instantiate motor smoke particles + -- Create from an initialiser list + local partiSmoke = director:createParticles({ + totalParticles=1500, + source='particles/fire.png', + emitterMode=particles.modeGravity, emitterRate=1500/3.5, + --sourcePos={dsw/8, dmh}, + sourcePos={spriteHero.w/6, spriteHero.h/2}, + sourcePosVar={0, 16}, + duration=particles.durationInfinity, + + modeGravity={ + --gravity={-90, 0}, + speed=180, speedVar=50, + radialAccel=0, radialAccelVar=0, + --tangentialAccel=0, tangentialAccelVar=40, + }, + + --angle=90, angleVar=20, + angle=180, angleVar=10, + life=4, lifeVar=2, + + --startColor={0x80, 0x80, 0x80, 0xff}, startColorVar={0x80, 0x80, 0x80, 25}, + --endColor={25, 25, 25, 50}, endColorVar={25, 25, 25, 50}, + startColor=color.white, endColor=color.black, + + startSize=24.0, startSizeVar=2.0, + endSize=particles.startSizeEqualToEndSize + }) + partiSmoke:stop() + spriteHero:addChild(partiSmoke) + + ---- Instantiate asteroids + funcyAster = function(spriteIn) + spriteIn:rotate(30) + spriteIn.y = math.random(dsh/16, dsh-dsh/16) + end + local spriteAster1 = director:createSprite(dsw, dmh, 'textures/asteroid1.png') + local tweenAster1 = tween:to(spriteAster1, {delay=math.random(5, 12), time=8, mode='repeat', x=-dsw, onComplete=funcyAster}) + spriteAster1.name = 'aster' + spriteAster1.xAnchor = 0 + spriteAster1.yAnchor = 0 + spriteAster1.xScale = .25 + spriteAster1.yScale = .25 + local spriteAster2 = director:createSprite(dsw, dmh, 'textures/asteroid2.png') + local tweenAster2 = tween:to(spriteAster2, {delay=math.random(5, 12), time=10, mode='repeat', x=-dsw, onComplete=funcyAster}) + spriteAster2.name = 'aster' + spriteAster2.xAnchor = 0 + spriteAster2.yAnchor = 0 + spriteAster2.xScale = .25 + spriteAster2.yScale = .25 + + -- Instantiate explanation text + labReady = director:createLabel({ + hAlignment='centre', + vAlignment='middle', + --font=fontFxsys, + font=fontArial, + text='Ready!', + color=color.white, + alpha=0}) + local tweenReady = tween:to(labReady, {time=.5, easing=ease.powIn, textXScale=2, textYScale=2, alpha=1}) + + -- Initialize physics simulation + physics:setGravity(0, 0) + local ptRndbox = {100,50, 260,50, 290,80, 290,120, 260,150, 80,150} + physics:addNode(spriteHero, {isSensor = true, shape=ptRndbox}) + physics:addNode(spriteCattin, {isSensor = true}) + physics:addNode(spriteCheese, {isSensor = true}) + physics:addNode(spriteFischkopf, {isSensor = true}) + --physics:addNode(partiComet, {isSensor = true}) + --physics:addNode(partiGalax, {isSensor = true}) + local ptTri = {-45,0, 75,-90, 75,90} + local ptSmal = {-30,0, 100,-20, 100,40} + physics:addNode(spriteCom, {isSensor = true, shape=ptTri}) + physics:addNode(spriteGal, {isSensor = true, shape=ptSmal}) + physics:addNode(spriteAster1, {isSensor = true}) -- Set in tween instead + physics:addNode(spriteAster2, {isSensor = true}) -- Set in tween instead + --spriteCom.physics.radius = 50 + --spriteGal.physics.radius = 50 + -- Marmalade bug if radius is different than actual perfectly round object image + spriteAster1.physics.radius = spriteAster1.w/2 + spriteAster2.physics.radius = spriteAster2.w/2 + --physics.debugDraw = true + + -- Implement collision listener + function hit(event) + if event.phase == 'began' then + --local labHit = director:createLabel({x=event.nodeA.x, y=event.nodeA.y, text=event.nodeB.name, font=fontSegoe, color=color.white}) + if event.nodeA.name == 'food' then + --tween:cancel(event.nodeA.tweens[1]) + --tweenOut = tween:dissolve(event.nodeA, spriteNull, 1, 0) + --table.insert(event.nodeA.tweens, tween:dissolve(event.nodeA, spriteNull, 1, 0)) + --event.nodeA.x = math.random(dsw/16, dsw-dsw/16) + --event.nodeA.y = math.random(dsh/16, dsh-dsh/16) + event.nodeA.isVisible = false + audio:playSound('sounds/belch.pcm') + nHealth = nHealth + nFoodPoints + local labPoints = director:createLabel({ + x=0, y=0, + hAlignment='centre', + vAlignment='middle', + textXScale=.5, + textYScale=.5, + --font=fontFxsys, + font=fontArial, + text='+' .. nFoodpoints, + color=color.white, + alpha=1}) + local tweenPoints = tween:to(labPoints, {time=1, easing=ease.powIn, textXScale=15, textYScale=15, alpha=0}) + elseif event.nodeB.name == 'food' then + event.nodeB.isVisible = false + audio:playSound('sounds/belch.pcm') + nHealth = nHealth + nFoodpoints + local labPoints = director:createLabel({ + x=0, y=0, + hAlignment='centre', + vAlignment='middle', + textXScale=.5, + textYScale=.5, + --font=fontFxsys, + font=fontArial, + text='+' .. nFoodpoints, + color=color.white, + alpha=1}) + + local tweenPoints = tween:to(labPoints, {time=1, easing=ease.powIn, textXScale=15, textYScale=15, alpha=0}) + elseif event.nodeA.name == 'aster' then + local diffiX = event.nodeB.x - event.nodeA.x + local diffiY = event.nodeB.y - event.nodeA.y + tween:cancel(event.nodeB.tweens[1]) + --tween:to(spriteHero, {time=0.5, easing=ease.powOut, easingValue=5, x=event.nodeB.x-diffiX*2, y=event.nodeB.y-diffiY*2}) + tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=5, x=spriteHero.x-dsw/16, y=spriteHero.y}) + --if device:isVibrationAvailable() then + -- device:vibrate(100) + --end + audio:playSound('sounds/ouch.pcm') + nHealth = nHealth + nAsterpoints + elseif event.nodeB.name == 'aster' then + tween:cancel(event.nodeA.tweens[1]) + tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=5, x=spriteHero.x-dsw/16, y=spriteHero.y}) + --if device:isVibrationAvailable() then + -- device:vibrate(100) + --end + audio:playSound('sounds/ouch.pcm') + nHealth = nHealth + nAsterpoints + elseif event.nodeA.name == 'comet' then + --if device:isVibrationAvailable() then + -- device:vibrate(800) + --end + audio:playSound('sounds/torche.pcm') + nHealth = nHealth + nCometpoints + elseif event.nodeB.name == 'comet' then + --if device:isVibrationAvailable() then + -- device:vibrate(800) + --end + audio:playSound('sounds/torche.pcm') + nHealth = nHealth + nCometpoints + end + end + return true + end + spriteHero:addEventListener('collision', hit) + + -- Implement event handlers + -- General screen touch move events + --Marmalade bugs cause audio to fail! + function moveStart(event) + --if not partiSmoke:isActive() then + partiSmoke:reset() + --end + --local audiMotor = audio:playSound('sounds/motor.pcm') -- distracting + end + function moveStop(event) + partiSmoke:stop() + audio:stopSound(audiMotor) + end + function touch(event) + if event.phase=='began' then + --also: powIn, expIn, sineIn, elasticIn, bounceIn, backIn + tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=2, x=event.x, y=event.y, onStart=moveStart, onComplete=moveStop}) + elseif event.phase=='ended' then + -- Noop + --dbg.print('Noop') + --system:sendEvent('stopMotor', {timeIn=2, sizeFart=5}) + elseif event.phase=='moved' then + tween:to(spriteHero, {time=1, easing=ease.powOut, easingValue=2, x=event.x, y=event.y, onStart=moveStart, onComplete=moveStop}) + end + end + system:addEventListener('touch', touch) + + -- Start health timers and label appropriately + nHealth = 90 -- A minute and a half of life + local labHealth = director:createLabel({ + x=-fontArial.height*1.75, y=fontArial.height/4, + hAlignment='right', + vAlignment='bottom', + font=fontArial, + text='Health', + color=color.white, + alpha=.375 + }) + local labDeath = director:createLabel({ + x=-fontArial.height/2, y=fontArial.height/4, + hAlignment='right', + vAlignment='bottom', + font=fontArial, + text=nHealth, + color=color.white, + alpha=.375 + }) + + funcyHealth = function(event) + thisNode = event.target + --timerObject = event.timer + --iterationsLeft = event.doneIterations + --thisNode.health = thisNode.health - 1 + nHealth = nHealth - 1 + labDeath.text = nHealth + + -- Is the game over? + if nHealth <= 0 then + timerHero:cancel() + --audio:stopStream() + --tween:cancel(tweenBack) + tween:cancel(tweenCattin) + tween:cancel(tweenCheese) + tween:cancel(tweenFischkopf) + tween:cancel(tweenCom) + tween:cancel(tweenGal) + tween:cancel(tweenAster1) + tween:cancel(tweenAster2) + system:removeEventListener('touch', touch) + + local rectGover = director:createRectangle({ + x=0, y=0, + w=dsw, h=dsh, + strokeWidth=0, + color=color.black, + alpha=0}) + local labGover = director:createLabel({ + --x=0, y=fontArial.height, + hAlignment='centre', + vAlignment='middle', + --font=fontFxsys, + font=fontArial, + text='GAME OVER', + color=color.white, + alpha=0}) + + --powIn, expIn, sineIn, elasticIn, bounceIn, backIn, easingValue + local tweenGvback = tween:to(rectGover, {time=2, alpha=.6}) + local tweenGvtext = tween:to(labGover, {time=3, easing=ease.expIn, easingValue=3, textXScale=2, textYScale=2, alpha=1}) + local tweenGvlast = tween:to(labGover, {delay=3, time=1.5, mode='mirror', easing=ease.backOut, textXScale=2.125, textYScale=2.125}) + + -- Not ready for prime time (must implement back stack noch) + ---- Instantiate replay and back buttons + --local butPlay = director:createSprite({xAnchor=1, source='images/butplay.png', alpha=0}) + --butPlay.x = dmw - butPlay.w/12 + --butPlay.y = dmh - butPlay.h + --local butBack = director:createSprite({source='images/butback2.png', alpha=0}) + --butBack.x = dmw + butBack.w/12 + --butBack.y = dmh - butBack.h + --tweenButplayin = tween:to(butPlay, {delay=4.0, time=1, alpha=1}) + --tweenButbackin = tween:to(butBack, {delay=4.5, time=1, alpha=1}) + --function butPlay:touch(event) + -- if event.phase == 'began' then + -- director:moveToScene(sceneBegin, transoptr) + -- end + -- return true + --end + --butPlay:addEventListener('touch', butPlay) + --function butBack:touch(event) + -- if event.phase == 'began' then + -- director:moveToScene(sceneIntro, transoptr) + -- end + -- return true + --end + --butBack:addEventListener('touch', butBack) + end + end + --timerHealth = system:addTimer(funcyHealth, 1, 0, 4) + timerHero = spriteHero:addTimer(funcyHealth, 1, 0, 4) +end + +function sceneloc:tearDown(event) + dbg.print('sceneloc:tearDown') + audio:stopStream() + --self.releaseResources() + --self. = self.:removeFromParent() + --self.obj0:removeFromParent() + --self.obj1:removeFromParent() + --self.obj0 = nil + --self.obj1 = nil +end +function sceneloc:enterPreTransition(event) + dbg.print('sceneloc:enterPreTransition') +end +function sceneloc:enterPostTransition(event) + dbg.print('sceneloc:enterPostTransition') +end +function sceneloc:exitPreTransition(event) + dbg.print('sceneloc:exitPreTransition') +end +function sceneloc:exitPostTransition(event) + dbg.print('sceneloc:exitPostTransition') +end + +sceneloc:addEventListener({'setUp', 'tearDown', 'enterPreTransition', + 'enterPostTransition', 'exitPreTransition', 'exitPostTransition'}, sceneloc) + +return sceneloc +