Jeu du vih en as 3

Description

C'est un petit jeu qui est inspiré du vieu jeu de commète. Sauf que j'ai un peu remplacé tout les élements et rajouté une touche pour le bouclier. normalement dans le vrai jeu ya aussi une touche pour un déplacement aléatiore mais j'ai pas trouvé la solution donc voila.

Source / Exemple :


package {
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
	import flash.utils.getTimer;
	import flash.utils.Timer;
	import flash.geom.Point;
	
	public class SpaceRocks extends MovieClip {
		static const shipRotationSpeed:Number = .1;
		static const rockSpeedStart:Number = .03;
		static const rockSpeedIncrease:Number = .02;
		static const missileSpeed:Number = .2;
		static const thrustPower:Number = .15;
		static const shipRadius:Number = 20;
		static const startingShips:uint = 3;
	
		// game objects
		private var ship:Ship;
		private var rocks:Array;
		private var missiles:Array;
		
		// animation timer
		private var lastTime:uint;
		
		// touches
		private var rightArrow:Boolean = false;
		private var leftArrow:Boolean = false;
		private var upArrow:Boolean = false;
		
		
		private var shipMoveX:Number;
		private var shipMoveY:Number;
		
		// timers
		private var delayTimer:Timer;
		private var shieldTimer:Timer;
		
		// game mode
		private var gameMode:String;
		private var shieldOn:Boolean;
		
		// vaisseua et armes 
		private var shipsLeft:uint;
		private var shieldsLeft:uint;
		private var shipIcons:Array;
		private var shieldIcons:Array;
		private var scoreDisplay:TextField;

		// score & niveau
		private var gameScore:Number;
		private var gameLevel:uint;

		// sprites
		private var gameObjects:Sprite;
		private var scoreObjects:Sprite;
		
		
		// commencer
		public function startSpaceRocks() {
			// set up sprites
			gameObjects = new Sprite();
			addChild(gameObjects);
			scoreObjects = new Sprite();
			addChild(scoreObjects);
			
			// score a zero
			gameLevel = 1;
			shipsLeft = startingShips;
			gameScore = 0;
			createShipIcons();
			createScoreDisplay();
						
			// listenerss
			addEventListener(Event.ENTER_FRAME,moveGameObjects);
			stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);
			stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);
			
			// start 
			gameMode = "delay";
			shieldOn = false;
			missiles = new Array();
			nextRockWave(null);
			newShip(null);
		}
		
		
		// SCORE OBJECTS
		
		// nombre restant afficheur
		public function createShipIcons() {
			shipIcons = new Array();
			for(var i:uint=0;i<shipsLeft;i++) {
				var newShip:ShipIcon = new ShipIcon();
				newShip.x = 20+i*15;
				newShip.y = 375;
				scoreObjects.addChild(newShip);
				shipIcons.push(newShip);
			}
		}
		
		// nb restant
		public function createShieldIcons() {
			shieldIcons = new Array();
			for(var i:uint=0;i<shieldsLeft;i++) {
				var newShield:ShieldIcon = new ShieldIcon();
				newShield.x = 530-i*15;
				newShield.y = 375;
				scoreObjects.addChild(newShield);
				shieldIcons.push(newShield);
			}
		}
		
		// affichage du score
		public function createScoreDisplay() {
			scoreDisplay = new TextField();
			scoreDisplay.x = 500;
			scoreDisplay.y = 10;
			scoreDisplay.width = 40;
			scoreDisplay.selectable = false;
			var scoreDisplayFormat = new TextFormat();
			scoreDisplayFormat.color = 0xFFFFFF;
			scoreDisplayFormat.font = "Arial";
			scoreDisplayFormat.align = "right";
			scoreDisplay.defaultTextFormat = scoreDisplayFormat;
			scoreObjects.addChild(scoreDisplay);
			updateScore();
		}
		
		// nouveau score a montrer
		public function updateScore() {
			scoreDisplay.text = String(gameScore);
		}
		
		// enlever un icone
		public function removeShipIcon() {
			scoreObjects.removeChild(shipIcons.pop());
		}
		
		// ""
		public function removeShieldIcon() {
			scoreObjects.removeChild(shieldIcons.pop());
		}
		
		// ""
		public function removeAllShipIcons() {
			while (shipIcons.length > 0) {
				removeShipIcon();
			}
		}
		
		// remove the rest of the shield icons
		public function removeAllShieldIcons() {
			while (shieldIcons.length > 0) {
				removeShieldIcon();
			}
		}
		
		
		// Creation du héros et du mouvement
		
		// nouveau vaiiseue
		public function newShip(event:TimerEvent) {
			// if ship exists, remove it
			if (ship != null) {
				gameObjects.removeChild(ship);
				ship = null;
			}
			
			// 
			if (shipsLeft < 1) {
				endGame();
				return;
			}
			
			// position
			ship = new Ship();
			ship.gotoAndStop(1);
			ship.x = 275;
			ship.y = 200;
			ship.rotation = -90;
			ship.shield.visible = false;
			gameObjects.addChild(ship);
			
			// propriétés
			shipMoveX = 0.0;
			shipMoveY = 0.0;
			gameMode = "play";
			
			// armes
			shieldsLeft = 3;
			createShieldIcons();
			
			// 
			if (shipsLeft != startingShips) {
				startShield(true);
			}
		}
		
		// touches
		public function keyDownFunction(event:KeyboardEvent) {
			if (event.keyCode == 37) {
					leftArrow = true;
			} else if (event.keyCode == 39) {
					rightArrow = true;
			} else if (event.keyCode == 38) {
					upArrow = true;
					// show thruster
					if (gameMode == "play") ship.gotoAndStop(2);
			} else if (event.keyCode == 32) { // space
					newMissile();
			} else if (event.keyCode == 90) { // z
					startShield(false);
			}
		}
			
		// 
		public function keyUpFunction(event:KeyboardEvent) {
			if (event.keyCode == 37) {
				leftArrow = false;
			} else if (event.keyCode == 39) {
				rightArrow = false;
			} else if (event.keyCode == 38) {
				upArrow = false;
				// remove thruster
				if (gameMode == "play") ship.gotoAndStop(1);
			}
		}
		
		
		public function moveShip(timeDiff:uint) {
			
			// rotation
			if (leftArrow) {
				ship.rotation -= shipRotationSpeed*timeDiff;
			} else if (rightArrow) {
				ship.rotation += shipRotationSpeed*timeDiff;
			} else if (upArrow) {
				shipMoveX += Math.cos(Math.PI*ship.rotation/180)*thrustPower;
				shipMoveY += Math.sin(Math.PI*ship.rotation/180)*thrustPower;
			}
			
			// move
			ship.x += shipMoveX;
			ship.y += shipMoveY;
			
			// retour au bord
			if ((shipMoveX > 0) && (ship.x > 570)) {
				ship.x -= 590;
			}
			if ((shipMoveX < 0) && (ship.x < -20)) {
				ship.x += 590;
			}
			if ((shipMoveY > 0) && (ship.y > 420)) {
				ship.y -= 440;
			}
			if ((shipMoveY < 0) && (ship.y < -20)) {
				ship.y += 440;
			}
		}
		
		// supp vaisseua
		public function shipHit() {
			gameMode = "delay";
			ship.gotoAndPlay("explode");
			removeAllShieldIcons();
			delayTimer = new Timer(2000,1);
			delayTimer.addEventListener(TimerEvent.TIMER_COMPLETE,newShip);
			delayTimer.start();
			removeShipIcon();
			shipsLeft--;
		}
		
		// 
		public function startShield(freeShield:Boolean) {
			if (shieldsLeft < 1) return; // no shields left
			if (shieldOn) return; // shield already on
			
			// 
			ship.shield.visible = true;
			shieldTimer = new Timer(3000,1);
			shieldTimer.addEventListener(TimerEvent.TIMER_COMPLETE,endShield);
			shieldTimer.start();
			
			// 
			if (!freeShield) {
				removeShieldIcon();
				shieldsLeft--;
			}
			shieldOn = true;
		}
		
		// finir les missiles
		public function endShield(event:TimerEvent) {
			ship.shield.visible = false;
			shieldOn = false;
		}
		
		// VihROCKS		
		
		//Nouvel cellule
		public function newRock(x,y:int, rockType:String) {
			
			// classe apropriée
			var newRock:MovieClip;
			var rockRadius:Number;
			if (rockType == "Big") {
				newRock = new Rock_Big();
				rockRadius = 35;
			} else if (rockType == "Medium") {
				newRock = new Rock_Medium();
				rockRadius = 20;
			} else if (rockType == "Small") {
				newRock = new Rock_Small();
				rockRadius = 10;
			}
			
						/*
			var rockClass:Object = getDefinitionByName("Rock_"+rockType);
			var newRock:MovieClip = new rockClass();

  • /
// newRock.gotoAndStop(Math.ceil(Math.random()*3)); // set start position newRock.x = x; newRock.y = y; // mouvement rotation random var dx:Number = Math.random()*2.0-1.0; var dy:Number = Math.random()*2.0-1.0; var dr:Number = Math.random(); // gameObjects.addChild(newRock); rocks.push({rock:newRock, dx:dx, dy:dy, dr:dr, rockType:rockType, rockRadius: rockRadius}); } // crer les cellules public function nextRockWave(event:TimerEvent) { rocks = new Array(); newRock(100,100,"Big"); newRock(100,300,"Big"); newRock(450,100,"Big"); newRock(450,300,"Big"); gameMode = "play"; } // anime les cellules public function moveRocks(timeDiff:uint) { for(var i:int=rocks.length-1;i>=0;i--) { // bouge les cellules var rockSpeed:Number = rockSpeedStart + rockSpeedIncrease*gameLevel; rocks[i].rock.x += rocks[i].dx*timeDiff*rockSpeed; rocks[i].rock.y += rocks[i].dy*timeDiff*rockSpeed; // rotate cellules rocks[i].rock.rotation += rocks[i].dr*timeDiff*rockSpeed; // if ((rocks[i].dx > 0) && (rocks[i].rock.x > 570)) { rocks[i].rock.x -= 590; } if ((rocks[i].dx < 0) && (rocks[i].rock.x < -20)) { rocks[i].rock.x += 590; } if ((rocks[i].dy > 0) && (rocks[i].rock.y > 420)) { rocks[i].rock.y -= 440; } if ((rocks[i].dy < 0) && (rocks[i].rock.y < -20)) { rocks[i].rock.y += 440; } } } public function rockHit(rockNum:uint) { if (rocks[rockNum].rockType == "Big") { newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Medium"); newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Medium"); } else if (rocks[rockNum].rockType == "Medium") { newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Small"); newRock(rocks[rockNum].rock.x,rocks[rockNum].rock.y,"Small"); } gameObjects.removeChild(rocks[rockNum].rock); rocks.splice(rockNum,1); } // MISSILES // crer un missile public function newMissile() { // create var newMissile:Missile = new Missile(); // set direction newMissile.dx = Math.cos(Math.PI*ship.rotation/180); newMissile.dy = Math.sin(Math.PI*ship.rotation/180); // placement newMissile.x = ship.x + newMissile.dx*shipRadius; newMissile.y = ship.y + newMissile.dy*shipRadius; // ajouter gameObjects.addChild(newMissile); missiles.push(newMissile); } // animer public function moveMissiles(timeDiff:uint) { for(var i:int=missiles.length-1;i>=0;i--) { // move missiles[i].x += missiles[i].dx*missileSpeed*timeDiff; missiles[i].y += missiles[i].dy*missileSpeed*timeDiff; // hors de l'écran if ((missiles[i].x < 0) || (missiles[i].x > 550) || (missiles[i].y < 0) || (missiles[i].y > 400)) { gameObjects.removeChild(missiles[i]); delete missiles[i]; missiles.splice(i,1); } } } // supp misile public function missileHit(missileNum:uint) { gameObjects.removeChild(missiles[missileNum]); missiles.splice(missileNum,1); } // interaction et controle public function moveGameObjects(event:Event) { // timer var timePassed:uint = getTimer() - lastTime; lastTime += timePassed; moveRocks(timePassed); if (gameMode != "delay") { moveShip(timePassed); } moveMissiles(timePassed); checkCollisions(); } // tester la collisiion public function checkCollisions() { // loop through rocks rockloop: for(var j:int=rocks.length-1;j>=0;j--) { // loop through missiles missileloop: for(var i:int=missiles.length-1;i>=0;i--) { // collision detection if (Point.distance(new Point(rocks[j].rock.x,rocks[j].rock.y), new Point(missiles[i].x,missiles[i].y)) < rocks[j].rockRadius) { // remove cellules and missile rockHit(j); missileHit(i); // add score gameScore += 10; updateScore(); // pete la boucle continue rockloop; } } // ^^ if (gameMode == "play") { if (shieldOn == false) { // only if shield is off if (Point.distance(new Point(rocks[j].rock.x,rocks[j].rock.y), new Point(ship.x,ship.y)) < rocks[j].rockRadius+shipRadius) { // supp missile cellule shipHit(); rockHit(j); } } } } // if ((rocks.length == 0) && (gameMode == "play")) { gameMode = "betweenlevels"; gameLevel++; // + un niveau delayTimer = new Timer(2000,1); delayTimer.addEventListener(TimerEvent.TIMER_COMPLETE,nextRockWave); delayTimer.start(); } } public function endGame() { // supprime les éléments removeChild(gameObjects); removeChild(scoreObjects); gameObjects = null; scoreObjects = null; removeEventListener(Event.ENTER_FRAME,moveGameObjects); stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction); stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction); gotoAndStop("gameover"); } } } // c'est long hein ?

Conclusion :


la conclusion c'est que je viens de comprendre la puissance de l'as 3. c'est génial. Voila^

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.