Moteur de simulation de lance d'objet

Soyez le premier à donner votre avis sur cette source.

Vue 7 821 fois - Téléchargée 593 fois

Description

Ce code sans prétention permet de réaliser le tracer d'un ou plusieurs points sur un même objet parmi ceux disponibles. Il ne prend pas en compte la résistance de l'air et ne présente pas de bugs connu.

Source / Exemple :


frame 1 :

//On stoppe la tête de lecture de la scène principale (root)
stop();

// On crée tout d'abord les variables qui nous seront nécessaires
// Les valeurs non définis ici le sont dans les zones de textes

// Variable pour l'intervale
var duration;
// Variable d'angle
var angle;
// Variable pour la vitesse initial de lancement
var VitesseIni;
// Variable de pesanteur
var pesanteurG;
// Variable pour le nombre de tour
var nbtour;
// Variable si servira à définir l'angle de rotation pour chaque image
var rota = 0;
// Variable pour le pas (1 image tout les x pixels)
var intervalex;
// Variables pour définir le point de lancement
var x0 = 0;
var y0 = 650;
// variable pour définir les limites de la simulation
var xmax = 1100;
var ymax = 1100;
// Variable pour définir l'opacité de chaque images
var opa;
// Variable pour définir quel objet est à lancer
var obje;
// Variable tableau qui contientra la liste des image créer
var iter = [];

// On indique les action a effectuer lors du clik sur le boutons go
go.onRelease = function() {
	// Cette boucle permet de définir quels point seront à afficher et où lors de la simulation
	for (var i = 1; i<=8; i++) {
		// Ici, on dit que la valeur de la variable est inverse a l'hittest avec la zone
		_root["point"+i+"visible"] = !_root.objet["point"+i].hitTest(_root.objet.zone);
		// On memorise pour chaque point ses coordoner par raport a l'objet
		_root["point"+i+"x"] = _root.objet["point"+i]._x;
		_root["point"+i+"y"] = _root.objet["point"+i]._y;
	}
	// Et au final on passe a la frame suivante
	play();
};
// On dit que lors du click sur la flèche dirigé vers la droite, on va a l'objet précédent
_root.btn_prev.onRelease = function() {
	_root.objet.objet.prevFrame();
};
// On dit que lors du click sur la flèche dirigé vers la gauche, on va a l'objet suivant
_root.btn_suiv.onRelease = function() {
	_root.objet.objet.nextFrame();
};
// On autorise tout les points à être déplacable
	for (i=1; i<=8; i++) {
		_root.objet["point"+i].onPress = function() {startDrag(this);};
		_root.objet["point"+i].onRelease = function() {stopDrag();};
	}
// Ici on remet l'objet précédament séléctionner dans le cas d'un retour après une première simulation
_root.objet.objet.gotoAndPlay(_root.obje);
// Idem pour les points
for (i=1; i<=8; i++) {
	_root.objet["point"+i]._x = _root["point"+i+"x"];
	_root.objet["point"+i]._y = _root["point"+i+"y"];
}

-----------------------------

Frame 2:

//On stoppe la tête de lecture de la scène principale (root)
stop();
// On définit les action correspondant à un clik sur le bouton retour
_root.retour.onRelease = function() {
	// On commence par arrèter l'intervale si la simulation est encore en cours
	clearInterval(IntervalID);
	// Puis on supprime tout les images grace au tableau "iter" contenant la lister des immages déja créée
	for (var i in iter) {
		removeMovieClip(iter[i]);
	}
	// Et pour finir, on revien à la frame 1
	gotoAndPlay(1);
};
// On crée la fonction qui servira a calculer l'ordonner (y) en fonction de l'absyse (x)
parabole = function (pesanteurG, VitesseIni, angle, X0, Y0, X) {
	// On converti les degrés en radians car la classe Math utillise des radians
	radian = Math.PI/180*angle;
	// On applique la formule
	Y = 0.5*pesanteurG*Math.pow(((X-X0)/(VitesseIni*Math.cos(radian))), 2)-(X-X0)*Math.tan(radian)+Y0;
	// Et on renvoi la valleur obtenu
	return Y;
};

// Pour le début de la simulation, x = x0
x = x0;
y = 1;
// On déclare la fonction qui sera par la suite appeler à intervals régulier par setinterval
function intervale() {
	// on commence par incrémenter à la variable x la valleur du pas
	x += parseInt(intervalex);
	// On test savoi si les valeurs de x OU de Y sont hors immage
	if (x<=xmax && y<=ymax) {
		// Si oui:
		// On calcul y en fonctin de x
		y = parabole(pesanteurG, VitesseIni, angle, x0, y0, x);
		// On crée une image sur la scène et on lui affecte les coordonés calcuées
		reference = _root.attachMovie("object", "object"+x, x, {_x:x, _y:y});
		// On fait en sorte que l'objet affiché soit celui choisi
		_root.reference.objet.gotoAndPlay(obje);
		// On crée une boucle pour placer les points et pour les rendre visible/invisible selon leur variables respectifs
		for (i=1; i<=8; i++) {
			// On place les poit selon les coordoner interne au clip sauvegader précédament dans des variables
			reference["point"+i]._x = _root["point"+i+"x"];
			reference["point"+i]._y = _root["point"+i+"y"];
			// On rend les points visible ou invisible
			reference["point"+i]._visible = _root["point"+i+"visible"]
		}
		// On masque la zone de détection des points
		reference.zone._visible = false;
		// On règle la transparance de l'objet
		reference.objet._alpha = opa;
		// On incrémente la variable de rotation avec un calcul déterminant l'angle de rotation entre chaque image à partir du nombre total de point
		rota += (360*nbtour)/(xmax/intervalex);
		// On affecte cette variable à la roation de l'image (objet et points)
		reference._rotation = rota;
		// Et on inclu cette image dans la liste complère affin de pouvoir l'effacer facilement plus tard
		iter.push(reference);
	} else {
		// si non: on efface l'intervalle et donc on stoppe la simulation
		clearInterval(IntervalID);
	}
}
// On crée l'intervale affin de répéter la fonction a interval régulié
IntervalID = setInterval(this, "intervale", duration);

Conclusion :


Ce code peut trouver une application dans la démonstration de la parabole formé par le centre de gravité par rapport au référentiel terrestre lors du lancement d'un objet en 1ere S (c'est d'ailleurs le cour sur le sujet dans ma classe qui m'a inspiré ce code)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

pegase31
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
Je n'ai jamais dit que ça passait en as3 ... ;)

Peg'
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010

slt,

ce qui donne en as3:
var visibility:Boolean = false;
visibility = 1;
myMc.visible visibility;
> Warning: 3590: int used where a Boolean value was expected. The expression will be type coerced to Boolean.

ce qui n'est pas faux, mais moi perso je l' ferai pas!

++
Mansuz
Messages postés
177
Date d'inscription
lundi 11 décembre 2006
Statut
Membre
Dernière intervention
25 janvier 2014
1
salut,

this["point"+i]._x+=2;
remy2501
Messages postés
17
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
28 août 2009

merci peg, on en apprend tous les jours :)
je ne savait pas qu'on pouvait directement mettre une valeur 0 ou 1 en booleen sans procéder à un changement de variable

sinon, pense tu que l'on puisse concaténer des variable (par exemple point + i) pour former un nom d'occurrence, ça me permettais de réduite a une simple boucle for tout mes variable et ainsi gagner en lisibilité !!

sinon, le code est mis a jour avec ta proposition et bientôt, il sera commenté ;)
pegase31
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
salut,

Je vais te donner un petit truc de code :

visible = 1;
monClip._visible = visible;

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.