(function() { "use strict"; var LevelScene = function() { this.initialize(); } var p = LevelScene.prototype = new creatine.Scene(); p.Scene_initialize = p.initialize; p._lastCreepTime = null; p.layerCreeps = null; p.layerShip = null; p.layerBullets = null; p.layerBackground = null; p.layerInterface = null; p.layerOverlay = null; p.initialize = function() { this.Scene_initialize(); this.layerCreeps = new createjs.Container(); this.layerShip = new createjs.Container(); this.layerBullets = new createjs.Container(); this.layerBackground = new createjs.Container(); this.layerInterface = new createjs.Container(); this.layerOverlay = new createjs.Container(); this._lastCreepTime = -CREEP_SPAWN_RATIO; this._lastWeaponTime = -WEAPON_SPAWN_RATIO; // CREATE REGISTRY OBJECTS registry.levelScore = 0; registry.levelCreepSpawnRatio = CREEP_SPAWN_RATIO; registry.levelWeaponSpawnRatio = WEAPON_SPAWN_RATIO; registry.levelShipSpeed = SHIP_BASE_SPEED; registry.levelWeapons = []; registry.levelShipWeapons = []; registry.levelShip = null; registry.levelCreeps = []; registry.levelBullets = []; registry.levelTime = 0; registry.outCreeps = []; // INITIALIZE THINGS registry.levelShip = new createjs.Bitmap(loader.getResult('ship')); registry.levelShip.regX = registry.levelShip.image.width/2; registry.levelShip.regY = registry.levelShip.image.height/2; registry.levelShip.x = canvas.width/2; registry.levelShip.y = 135; registry.levelShipWeapons.push(new Weapon(DEFAULT_WEAPON)); this.shadow = new createjs.Bitmap(loader.getResult('shadow')); this.shadow.y = 150; // INITIALIZE UI this._uiBar = new createjs.Shape(); this._uiBar.graphics.beginFill('#000'); this._uiBar.graphics.drawRect(0, 0, canvas.width, SCREEN_UIBAR_HEIGHT); this._uiBar.alpha = SCREEN_UIBAR_OPACITY; this.weaponBar = new WeaponBar(); this.cooldownBar = new CooldownBar(); this.buttonBack = new creatine.FlexBitmap(loader.getResult('button_back'), false); var area = {x:0, y:0, width:canvas.width, height:SCREEN_UIBAR_HEIGHT}; var hbox = new creatine.BoxSizer(creatine.HORIZONTAL, area); hbox.add(this.buttonBack, 1, 5); hbox.add(this.weaponBar, 6, 5); hbox.add(this.cooldownBar, 1, 5); hbox.layout(); this.layerInterface.addChild(this._uiBar); this.layerInterface.addChild(this.buttonBack); this.layerInterface.addChild(this.weaponBar); this.layerInterface.addChild(this.cooldownBar); this.running = true; // EVENTS // stage.on('stagemousedown', this.onClick, this); // this.on('sceneresume', this.onClick, this); // ADD THINGS TO STAGE this.layerShip.addChild(registry.levelShip); this.layerInterface.addChild(this.shadow); this.addChild(this.layerCreeps); this.addChild(this.layerShip); this.addChild(this.layerBullets); this.addChild(this.layerBackground); this.addChild(this.layerInterface); this.addChild(this.layerOverlay); this.on('scenepause', this.onScenePause, this); this.on('sceneresume', this.onSceneResume, this); this.on('sceneenter', this.onSceneEnter, this); this.on('sceneexit', this.onSceneExit, this); } p.onClick = function(event) { if (!this.running) return; if (event.stageY <= SCREEN_UIBAR_HEIGHT) return; var weapon = registry.levelShipWeapons[registry.levelShipWeapons.length-1]; if (!weapon.overheat) { var s = Math.floor(Math.random()*weapon.sounds.length); createjs.Sound.play(weapon.sounds[s], 'none', 0, 0, 0, VOLUME_SFX); var bullet = FactorySystem.createBullet(); registry.levelBullets.push(bullet); this.layerBullets.addChild(bullet); if (weapon.heat >= WEAPONS_MAX_HEAT) { weapon.overheat = true; createjs.Sound.play('sound_overheat', createjs.Sound.INTERRUPT_ANY, 0, 0, 0, VOLUME_SFX); } } else { createjs.Tween.get(this.cooldownBar) .to({'alpha':0}, 200) .to({'alpha':1}, 200) .to({'alpha':0}, 200) .to({'alpha':1}, 200) .to({'alpha':0}, 200) .to({'alpha':1}, 200) } } p.onUpdate = function(event) { if (!this.running) return; registry.levelTime += event.delta; var t = (registry.levelTime/GAME_CLIMAX); registry.levelCreepSpawnRatio = ilinear( CREEP_SPAWN_RATIO, CREEP_SPAWN_MIN_RATIO, t ) registry.levelWeaponSpawnRatio = ilinear( WEAPON_SPAWN_RATIO, WEAPON_SPAWN_MIN_RATIO, t ) registry.levelShipSpeed = linear( SHIP_BASE_SPEED, SHIP_MAX_SPEED, t ) // MOVE SHIP var direction = creatine.clip((stage.mouseX-registry.levelShip.x)/SHIP_BASE_TORQUE, -1, 1); registry.levelShip.x += direction*registry.levelShipSpeed*event.fdelta; registry.levelShip.x = creatine.clip(registry.levelShip.x, 0, canvas.width); // MOVE CREEPS for (var i=0; i 0) { this.layerBullets.removeChild(weapon.marker); } } // CONTROLA HEAT DAS ARMAS for (var i=0; i=0; i--) { var bullet = registry.levelBullets[i]; var removeBullet = false; if (bullet.mindepth && bullet.y < bullet.mindepth) continue; for (var j=registry.levelCreeps.length-1; j>=0; j--) { var creep = registry.levelCreeps[j]; var dist = euclid2d(bullet.x, bullet.y, creep.x, creep.y); if (dist < bullet.area) { creep.life -= bullet.damage; removeBullet = true; if (creep.life <= 0) { registry.levelScore += creep.xp; this.layerCreeps.removeChild(creep); registry.levelCreeps.splice(j, 1); } else { createjs.Tween.get(creep) .to({'alpha':0}, 200) .to({'alpha':1}, 200) .to({'alpha':0}, 200) .to({'alpha':1}, 200) .to({'alpha':0}, 200) .to({'alpha':1}, 200) } } } if (removeBullet) { createjs.Sound.play('sound_explosion1', 'none', 0, 0, 0, VOLUME_SFX); // var s =Math.random(); // if (s < 0.7) // createjs.Sound.play('sound_explosion1'); // else // createjs.Sound.play('sound_explosion2'); this.layerBullets.removeChild(bullet); registry.levelBullets.splice(i, 1); } } // VERIFY COLLISIONS SHIPxCREEPS var ship = registry.levelShip; var min_x = ship.x - ship.image.width/2 + SHIP_COLLISION_WOFFSET; var max_x = ship.x + ship.image.width/2 - SHIP_COLLISION_WOFFSET; var min_y = ship.y - ship.image.height/2 + SHIP_COLLISION_HOFFSET; var max_y = ship.y + ship.image.height/2 - SHIP_COLLISION_HOFFSET; for (var i=registry.levelCreeps.length-1; i>=0; i--) { var creep = registry.levelCreeps[i]; if (min_x < creep.x+creep.hw && max_x > creep.x-creep.hw && max_y > creep.y-creep.hh) { createjs.Sound.play('sound_explosion2', 'none', 0, 0, 0, VOLUME_SFX); createjs.Sound.play('sound_dead', 'none', 0, 0, 0, VOLUME_MUSIC); if (registry.gameMusic) { registry.gameMusic.stop(); } this.layerCreeps.removeChild(creep); registry.levelCreeps.splice(i, 1); director.push( new EndScene(), new creatine.transitions.MoveIn( creatine.TOP, createjs.Ease.bounceOut, 800 ) ) } } // VERIFY COLLISIONS SHIPxWEAPON BOXES for (var i=0; i weapon.x-weapon.hw && min_y < weapon.y+weapon.hh && max_y > weapon.y-weapon.hh) { registry.levelWeapons.splice(i, 1); this.layerBullets.removeChild(weapon); var currentWeapon = registry.levelShipWeapons[registry.levelShipWeapons.length-1]; if (currentWeapon.id === weapon.data.id) { currentWeapon.ammunition = weapon.data.ammunition; } else { registry.levelShipWeapons.push( new Weapon(weapon.data) ) } } } // CREATE CREEP if (registry.levelTime - this._lastCreepTime > registry.levelCreepSpawnRatio) { this._lastCreepTime = registry.levelTime; var creep = FactorySystem.createCreep(); registry.levelCreeps.push(creep); this.layerCreeps.addChild(creep); } // CREATE WEAPON if (registry.levelTime - this._lastWeaponTime > registry.levelWeaponSpawnRatio) { this._lastWeaponTime = registry.levelTime; var weapon = FactorySystem.createWeaponBox(); if (weapon) { registry.levelWeapons.push(weapon); this.layerBullets.addChild(weapon); var marker = new createjs.Bitmap(loader.getResult('weapon_indicator')); marker.regX = marker.image.width/2; marker.x = weapon.x; marker.y = SCREEN_UIBAR_HEIGHT + 5; weapon.marker = marker; this.layerBullets.addChild(marker); } } // REMOVE CREEPS for (var i=registry.levelCreeps.length-1; i>=0; i--) { var creep = registry.levelCreeps[i]; if (creep.y-creep.hh < SCREEN_WATER_SURFACE) { var _this = this; registry.levelScore = Math.max(registry.levelScore-Math.floor(creep.xp/2), 0); registry.outCreeps.push(creep); createjs.Tween.get(creep) .to({alpha:0}, 100) .call(function() { _this.layerCreeps.removeChild(creep); registry.outCreeps.splice(0, 1); }); registry.levelCreeps.splice(i, 1); } } // REMOVE BULLETS for (var i=registry.levelBullets.length-1; i>=0; i--) { var bullet = registry.levelBullets[i]; if (bullet.y+bullet.image.height > canvas.height) { this.layerBullets.removeChild(bullet); registry.levelBullets.splice(i, 1); } } // REMOVE WEAPON var weapon = registry.levelShipWeapons[registry.levelShipWeapons.length-1]; if (weapon.ammunition <= 0) { registry.levelShipWeapons.pop(); } // REMOVE WEAPON BOXES for (var i=registry.levelWeapons.length-1; i>=0; i--) { var weapon = registry.levelWeapons[i]; if (weapon.y+weapon.image.height > canvas.height) { registry.levelWeapons.splice(i, 1); this.layerBullets.removeChild(weapon); } } // UPDATE UI this.weaponBar.update(); this.cooldownBar.update(); } p.onSceneEnter = function(event) { this.onSceneResume(); // if (!registry.gameMusic || registry.gameMusic.name !== 'music_level') { // if (registry.gameMusic) { // registry.gameMusic.stop(); // } // registry.gameMusic = createjs.Sound.play('music_level', 'none', 0, 0, -1); // registry.gameMusic.name = 'music_level'; // } } p.onSceneResume = function(event) { this.running=true; this.weaponBar.on('click', this.onWeaponBarClick, this); this.buttonBack.on('click', this.onButtonBack, this); stage.on('stagemousedown', this.onClick, this); if (!registry.gameMusic || registry.gameMusic.name !== 'music_level') { if (registry.gameMusic) { registry.gameMusic.stop(); } registry.gameMusic = createjs.Sound.play('music_level', 'none', 0, 0, -1, VOLUME_MUSIC); registry.gameMusic.name = 'music_level'; } } p.onScenePause = function(event) { this.running=false; this.buttonBack.removeAllEventListeners('click'); this.weaponBar.removeAllEventListeners('click'); stage.removeAllEventListeners('stagemousedown'); } p.onSceneExit = function(event) { this.running=false; if (registry.gameMusic) { registry.gameMusic.stop(); } registry.gameMusic = null; } p.onButtonBack = function(event) { this.buttonBack.removeAllEventListeners('click'); director.replace( new MenuScene(), new creatine.transitions.Scroll( creatine.RIGHT, createjs.Ease.cubicInOut, 800 ) ) } p.onWeaponBarClick = function(event) { var weapon = registry.levelShipWeapons[0]; registry.levelShipWeapons.splice(0, 1); registry.levelShipWeapons.push(weapon); } window.LevelScene = LevelScene; }());