Moteur shoot'em up simple et parametrable

Soyez le premier à donner votre avis sur cette source.

Vue 11 286 fois - Téléchargée 1 485 fois

Description

Bon dernière source de la journée ^^ j'ai développé çà cet aprem.

Alors qu'est-ce que c'est ? Un Shoot'em up en 2d simple, avec une partie jeu et une partie admin...

"Admin" ? Oui ! Ouvrez le fla, passez en mode admin, et vous pouvez définir où vos monstre apparaitront. Vous pouvez alors générer le code à copier/coller dans le code. Ce petit bout de code correspond au tableau qui contient les coordonnées. Repassez en mode joueur, après avoir fait cela, et vos monstres apparaitront où vous le souhaitiez !

Pour passer d'un mode à l'autre, modifier la variable "version" au début du code.

En Admin :
Drag sur le monstre => duplique un nouveau monstre.
Générer => céer le code, en fonction des monstres placés
Barre d'espace => cache le monstre modèle, le bouton, et le champ
Flèche haut/bas, pendant que vous draggez un monstre => agrandit/rapeticie le clip du monstre
Flèche gauche/droite, pendant que vous draggez un monstre => tourne le clip à gauche/droite

Vous pouvez modifier les quelques clips comme vous le souhaitez, et crée ainsi de nombreux shoot'em up aux univers différents ^^

Le code est comme d'habitude bien commenté :)

Source / Exemple :


//Les positions possibles des monstres : x,y,%taille,rotation
var tabPositions=[[65,69,60,10],[127.95,72,50,105],[40.95,82,70,-175],[91.95,241.95,40,25],[57.95,242.95,50,-5],[125.95,261.95,40,30],[385.95,88,75,-45],[423.95,71,75,0],[465.95,69,60,45],[16,499.95,165,30],[65,532.95,145,35],[214.95,415.95,60,-75],[230.95,414.95,55,20],[340.95,314.95,125,-40],[329.95,367.95,140,85],[357.95,257.95,40,-5],[379.95,284.95,50,55],[605.95,266.95,35,-45],[633.95,262.95,30,25],[631.95,402.95,110,-60],[639.95,391.95,100,60]];

var nbMonstresTotal=100;//Le nombre de monstre à faire apparaitre
var nbMonstres=0;//Le nombre de monstres générés
var vitesseRetraitMonstresMax=2000;//Le temps de retrait d'un monstre max
var vitesseRetraitMonstresMin=300;//Le temps de retrait d'un monstre min
var ecartApparitionMax=2000;//Le temps d'apparition entre chaque monstre max
var ecartApparitionMin=100;//Le temps d'apparition entre chaque monstre min
var score=0;//Le score du joueur
var version="joueur";//"admin" ou "joueur"
var spaceDown=false;//Utile pour gérer la barre d'espace en mode admin

//ajoute un monstre au jeu
function nouveauMonstre(){
	
	clearInterval(IntervalMonstres);//On supprime l'interval qui a fait apparaitre ce monstre
	
	var positionMonstre=Math.floor(Math.random()*tabPositions.length);//on définit la position de ce nouveau monstre parmi toutes celles enregistrées	
		
	attachMovie("monstre","monstre"+nbMonstres,100+nbMonstres);//on place le clip sur la scène	
	this["monstre"+nbMonstres].tabPositionOccupee=tabPositions[positionMonstre];//on garde en mémoire la position occupée par e monstre
	this["monstre"+nbMonstres]._x=tabPositions[positionMonstre][0];//on le place sur l'axe des abscissses
	this["monstre"+nbMonstres]._y=tabPositions[positionMonstre][1];//on le place sur l'axe des ordonnées
	this["monstre"+nbMonstres]._xscale=tabPositions[positionMonstre][2];//On modifie sa taille
	this["monstre"+nbMonstres]._yscale=tabPositions[positionMonstre][2];//On modifie sa taille
	this["monstre"+nbMonstres]._rotation=tabPositions[positionMonstre][3];//On effectue la rotation	
	tabPositions.splice(positionMonstre,1);//On enlève la position du monstre dans le tableau qui contient toutes les positions
	
	//fonction retour du monstre, appelée au bout de x secondes
	this["monstre"+nbMonstres].retour = function(){
		tabPositions.push(this.tabPositionOccupee);//On replace dans le tableau contenant toutes les positions, celle que le monstre occupait
		this.play();//Anim de retour		
	}
	//Fonction de clic sur le monstre
	this["monstre"+nbMonstres].onPress = function(){
		this.enabled=false;
		tabPositions.push(this.tabPositionOccupee);//On replace dans le tableau contenant toutes les positions, celle que le monstre occupait
		this.gotoAndPlay("disparition");//Anim de disparition/explosion
		score++;//+1 au score
	}
	//on définit la vitesse de retrait de ce monstre, on appelle la méthode "retour" au bout de ce temps
	vitesseRetraitMonstres=vitesseRetraitMonstresMax-(vitesseRetraitMonstresMax-vitesseRetraitMonstresMin)*(nbMonstres/nbMonstresTotal);
	setInterval(this["monstre"+nbMonstres],"retour",vitesseRetraitMonstres);
		
	//On détermine le temps avant l'apparition du nouveau monstre
	ecartApparition=ecartApparitionMax-(ecartApparitionMax-ecartApparitionMin)*(nbMonstres/nbMonstresTotal);
	if(nbMonstres<nbMonstresTotal)//S'il reste des monstres à afficher
		IntervalMonstres=setInterval(this,"nouveauMonstre",ecartApparition);//On appelle la fonction
	else
		nbMonstres="fin";//C'est fini
	
	nbMonstres++;//On indique que l'on a ajouté un nouveau monstre
}

//Fonction appelée en mode admin. Permet de générer un tableau de position
function admin(){
	
	//On vérifie si la touche espace a été appuyée. Si oui on affiche/cache, les outils.
	this.onEnterFrame=function(){
		if(Key.isDown(Key.SPACE)){
			if(spaceDown){
				spaceDown=false;
				generer._visible=false;
				graphMonstre._visible=false;
				positionsTexte._visible=false;
			}else{
				spaceDown=true;
				generer._visible=true;
				graphMonstre._visible=true;
				positionsTexte._visible=true;
			}
		}		
	}
	
	premierPlan._alpha=50;//POur voir les monstres derrière le premier plan, on réduit l'opacité
	
	//On place sur la scène le bouton de génération des coordonnées
	attachMovie("generer","generer",99);	
	generer._x = -75;
	generer._y = 100;
	
	//Si l'on clique sur ce bouton
	generer.onPress = function(){
		
		//On crée un champ texte
		this._parent.createTextField("positionsTexte",5000,25,25,150,10);
		this._parent.positionsTexte.background=true;
		this._parent.positionsTexte.autoSize=true;
		this._parent.positionsTexte.multiline=true;
		this._parent.positionsTexte.wordWrap=true;
		this._parent.positionsTexte.text="";
		
		//on affiche dedans les données à copier/coller dans le code. ATTENTION à la virgule de trop à la fin
		for(var i=0;i<this._parent.nbMonstres;i++){			
			this._parent.positionsTexte.text+="["+this._parent["graphMonstre"+i]._x+","+this._parent["graphMonstre"+i]._y+","+this._parent["graphMonstre"+i]._xscale+","+this._parent["graphMonstre"+i]._rotation+"],"
		}
	}
	
	//On place sur la scène un modèle de monstre
	attachMovie("graphMonstre","graphMonstre",100);	
	graphMonstre._x = -75;
	graphMonstre._y = -50;
	
	//Quand on clique dessus
	graphMonstre.onPress = function(){
		
		//On duplique le clip et on commence le drag 
		this.duplicateMovieClip("graphMonstre"+nbMonstres,101+nbMonstres);		
		this._parent["graphMonstre"+nbMonstres].deplacement=true;
		this._parent["graphMonstre"+nbMonstres].startDrag();
		
		//Permet de gérer le drag and drop après avoir posé le monstre la première fois
		this._parent["graphMonstre"+nbMonstres].onPress = function(){
			this.deplacement=true;
			this.startDrag();
		}
		this._parent["graphMonstre"+nbMonstres].onRelease = function(){
			this.deplacement=false;
			this.stopDrag();
		}
		
		//Pour chaque frame du clip dupliqué du monstre
		this._parent["graphMonstre"+nbMonstres].onEnterFrame = function(){
			
			//On vérifie si l'one est en drag et si une touche directionnelle est activée
			if(this.deplacement==true && Key.isDown(Key.LEFT))//Si la fléche gauche : on rotationne à gauche
				this._rotation-=5;
			if(this.deplacement==true && Key.isDown(Key.RIGHT))//Si la fléche droite : on rotationne à droite
				this._rotation+=5;
			if(this.deplacement==true && Key.isDown(Key.UP)){//Si la flèche haut, on agrandit le clip
				this._xscale+=5;
				this._yscale+=5;
				this._x=_xmouse;
				this._y=_ymouse;
				
			}
			if(this.deplacement==true && Key.isDown(Key.DOWN)){//Si la flèche bas, on rapeticie le clip
				this._xscale-=5;
				this._yscale-=5;
				this._x=_xmouse;
				this._y=_ymouse;
			}
		}		
		
		nbMonstres++;//on indique que l'on a rajouté un monstre
	}
	
}

//fonction d'initialisation
function init(){
	
	//on initialise les premières durée
	var vitesseRetraitMonstres=vitesseRetraitMonstresMax;
	var ecartApparition=ecartApparitionMax;
	
	//On place sur la scène le clip de fond
	attachMovie("fond","fond",1);	
	fond._x = 0;
	fond._y = 0;	
	
	//On place sur la scène le clip de premier plan
	attachMovie("premierPlan","premierPlan",5000);	
	premierPlan._x = 0;
	premierPlan._y = 0;
	premierPlan.onPress = function(){}//on empeche de cliquer à traver les nuages
	
	//on place sur la scène un chmap pour afficher le score
	this.createTextField("scoreTexte",5003,20,20,20,20);
	scoreTexte.text="123";
	scoreTexte.variable="score";
	scoreTexte.textColor = 0x000000;
	scoreTexte.background=true;
	
	//Selon la version on appelle l'une ou l'autre méthode
	if(version=="joueur")
		nouveauMonstre();
	else
		admin();
}
init();
stop();

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_stella
Messages postés
12
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
14 novembre 2011
-
Bonjour libertyblood, je suis surprise de lire autant de critiques sur tes codes car comme tu dis tu mets le code à dispo pour ceux que ça intéresse et ce code devient une base de travail. Moi j'aimerais savoir si ceux qui sont aussi locaces en critiques le sont aussi en ajout de sources. Grâce à tes codes j'ai pu faire et comprendre de nombreuses choses. Merci à toi.
orios
Messages postés
1
Date d'inscription
lundi 26 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009
-
SVP avec quelle logiciel ouvre t-on les fichier
libertyblood
Messages postés
25
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
8 août 2006
-
autant pour moi ^^
cs_bali_balo
Messages postés
1381
Date d'inscription
samedi 9 octobre 2004
Statut
Membre
Dernière intervention
1 novembre 2010
-
...mmm R-Type...que des bons souvenirs :D
(allez, hooppp, lancement de R-Type sur mon emulateur SuperNes :D :D :D )
C'est vrai, je l'avais remarqué aussi, mais je ne l'ai pas dis...:p


bali_balo....=]
pegase31
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6 -
Je vais jouer les pinailleurs, mais ce n'est absolument pas un "shoot'hem up", mais un simple jeu de tir ...
Un "shoot'hem up" c'est un jeu de vaisseau tel que "R-Type" ou l'excélent "Parodius", mais absolument pas ça.

Je m'attriste de voir qu'encore maintenant, les gens ne savent pas ça ...:(

Peg'

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.