Forums Développement Multimédia

Aller au contenu

une balle qui défie la gravité? O_o

CODE Actionscript

19 réponses à ce sujet

#1 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 30 July 2005 - 17:45 PM

Salut à tous,

Voici mon problème :

J'ai fait une petite balle que j'ai fait rebondire avec quelques lignes codes. Seulement je n'arrive pas à trouver comment l'arrêter! sa hauteur de rebond diminue bien correctement, mais on constate qu'elle tremblote et donc ne s'arrête jamais de sautiller!Je vous fourni le vizu. et voici ci dessous le code.

murB correspond au mur du bas.
obus à la balle.
posYD la position de départ sur l'axe des Y de ma balle.
vitesse la vitesse de la balle.
objetT l'objet que percute la balle.
ActionScript
MovieClip.prototype.vitesse = function(posYD,vitesse,objetT){
this._y = posYD;
this.onEnterFrame = function(){
this._y += vitesse;
vitesse ++;
if(this.hitTest(objetT)){
vitesse = vitesse*-0.5;
}
}
}
obus.vitesse(0,0,murB);

Si vous pouviez me dire comment arrêté ses sautillements je vous en serrai très reconnaissant.

Merci par avance.

Fichier(s) joint(s)



#2 daemon

  • Members
  • PipPipPipPipPipPipPipPip
  • 1764 messages

Posté 30 July 2005 - 18:14 PM

Yop je te repond vite parceque j'ai pas trop de temps :

1) ne travaille pas sur le _y du clip. Flash te fait des arrondis systematiques et du coup ça deconne. Travaille sur une variable (toujours la même) et affecte la position en _y de ton clip d'apres cette variable.

2) tu aura toujours un sautillement equivalant à ta gravité. La solution est de dire que si la vitesse d'inpacte est inferieure à une certaine valeur, alors on ne rebondit pas, mais on se pose sur la surface C ce qui se passe dans la vraie vie puisque un rebond est une absorbsion d'energie qui fait que la balle remonte moins haut que la fois precedente. Le dernier rebond absorbe suffisament d'enerji pour que la balle ne remonte pas du tout est reste au sol...

#3 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 30 July 2005 - 18:35 PM

Pour les rebonds infinis c'est réglé.

ActionScript
MovieClip.prototype.vitesse = function(posYD, vitesse, objetT) {
this._y = posYD;
this.onEnterFrame = function() {
this._y += vitesse;
vitesse++;
if (this.hitTest(objetT)) {
if(vitesse <= 0.1){
vitesse = 0;
delete this.onEnterFrame;
}
vitesse = vitesse*-0.5;
}
};
};
obus.vitesse(0, 0, murB);

Néanmoins je ne vois pas comment travaillé sur la variable et donc positionné mon obus en fonction de celle-ci...

#4 daemon

  • Members
  • PipPipPipPipPipPipPipPip
  • 1764 messages

Posté 30 July 2005 - 19:06 PM

Dans l'ideal, tu peux faire 2 objets :

Code

speed={_x:0,_y:0}
position={_x:0,_y:0}


tu fait ton onEnterFrame en travaillant directement avec ces objets.

ex :
Code

this.onEnterFrame=function(){
      speed._y+=gravite
      position._x+=speed._x
      position._y+=speed._y
     tonclip._x=position._x
     tonclip._y=position._y
}



C'est la definition exacte de la position derivée de la vitesse derivée de l'acceleration.




A la fin du onEnterFrame



#5 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 30 July 2005 - 19:41 PM

Merci beaucoup de ta réponse mais il y a un point que je ne comprends pas :

Il est nécéssaire de faire un hitTest pour savoir à quel moment l'obus touche le sol, et donc changer le sens de progression.
De ce fait, comment changer la vitesse si celle ci vari déjà par rapport à une boucle? O_o.

Merci beaucoup pour ta futur réponse.

#6 daemon

  • Members
  • PipPipPipPipPipPipPipPip
  • 1764 messages

Posté 30 July 2005 - 21:34 PM

yop la gravité est pas definition une acceleration (de pesenteur) ce qui veut dire que la vitesse s'incremente a chaque frame.

Note : ta vitesse sous flash s'exprime en pixel/frame. L'acceleration en pixel/frame/frame ou pixel/frame^-2.

Donc le rebond n'a aucun rapport avec l'acceleration. De ce fait du peux ecrire un truc du genre :

Code

this.onEnterFrame=function(){
     speed._y+=gravite
     position._x+=speed._x
     position._y+=speed._y
    if(position._y>=200){ // donc la balle touche le sol
         position._y=200 // on se met au sol
         speed._y=speed._y*-1 // on rebondit donc la vitesse est inversée
         speed._y=speed._y*0.8 // on simule l'absorbtion d'energie au rebond
    }
    tonclip._x=position._x
    tonclip._y=position._y
}



biensur j'ai tres simplifié, mais ça doit marcher tel quel. Ensuite ça marche pour un sol horizontal... pour reste faut passer par des algo et des normales au contact.



#7 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 30 July 2005 - 22:26 PM

Merci énormément !

Ta réponse est vraiment clair ce qui permet d'affiner dans le sens où je souhaites mener cette animation.

Merci vraiment beaucoup. gourou.gif

#8 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 31 July 2005 - 14:38 PM

Salut à tous,

Suite aux précédentes réponses, je souhaite maintenant donner de la vitesse à ma balle par rapport à la rapidité plus ou moins de grande du déplacement de mon curseur.

J'ai pensé à un setInterval :

voici le code :

ActionScript
speed={_x:0,_y:0}
var gravite = 1;
obus.onPress = function(){
delete _root.onEnterFrame;
this.startDrag();
}
obus.onMouseUp = function(){
speed._y = diff/5; // vitesse de démarrage de la balle quand on relache
position={_x:obus._x,_y:obus._y}
_root.onEnterFrame=function(){
speed._y+=gravite
position._y+=speed._y
if(position._y&gt;=380){ // donc la balle touche le sol
position._y=380 // on se met au sol
speed._y=speed._y*-1 // on rebondit donc la vitesse est inversée
speed._y=speed._y*0.8 // on simule l'absorbtion d'energie au rebond
}
obus._x=position._x
obus._y=position._y
}
}
var varM = 0;
function déplacement(){
varM = _ymouse;
}
function déplacement2(){
varM2 = _ymouse;
}
function différence(){
diff = Math.abs(varM-varM2);
}
compteur = setInterval(déplacement,100);
compteur2 = setInterval(déplacement2,150);
différence = setInterval(différence,150);


Le visu est dispo.

Pourriez vous m'indiquez si vous pensez que j'utilise une méthode convenable ou bien si c'est vraiment pas bon ce que j'ai fait.
Merci beaucoup par avance.

Fichier(s) joint(s)



#9 retro1327250230

  • Members
  • PipPipPipPipPipPipPipPip
  • 846 messages

Posté 31 July 2005 - 20:17 PM

héhéh ben non c'est pas bon puisque ça marche pas smile.gif


je déconseille l'emploi du setInterval pour l'avoir essayé, je prefere utiliser une simple boucle sur l'evenement onEnterFrame. (plus un code est simple plus il est facile à débuger).



moi je procéderais comme suit:


1/je prépare deux fonctions boucle genre boucle_curseur() et boucle_balle()

-dans la première tu utilises une variable qui retient l'ancienne position du curseur et qui calcule la différence pour en déduire le vecteur vitesse.

-dans la seconde tu mets ton moteur physique


ensuite sur ton bouton:

onPress==> onenterframe=boucle_curseur
onRelease==> onEnterframe=boucle_balle

#10 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 31 July 2005 - 20:23 PM

bon après nombreux test je me suis vite rendu compte que le setInterval sa me complique la vie plus qu'autres choses...

J'aurais plutôt souhaité créé une nouvelle variable à chaque appel de la fonction, et soustraire celle ci à la précédente...

Voici ce que j'ai fait :
ActionScript
var i = 0;
function déplacement(){
i++;
this["varY"+i] = _ymouse;
trace(this["varY"+i])
}
compteur = setInterval(déplacement,1000);


Seulement il me renvoi undefined...

Auriez vous une idée pour remedier à cela?

Merci beaucoup de votre futur aide!!!

#11 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 31 July 2005 - 20:26 PM

En faite je me suis mal exprimé, c'est pas setinterval qui me pose problème c'est les deux set interval....

En effet la duré est sois trop longue soit trop courte.

Dsl retro j'avais pas vu ton post avant de posté.

Pourrais tu appronfdir ton idée?

merci pour ta réponse.

#12 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 31 July 2005 - 20:52 PM

Chapeau bas, retro !!!! gourou.gif

Après un peu de réflexion sur ce que tu m'a écris, voici le code et le résultat visuel :

ActionScript
speed={_x:0,_y:0};
var gravite = 1;
var Y1 = 0;
var Y2 = 0;
obus.onPress = function(){
this.onEnterFrame = function(){
Y1 = _ymouse;
}
delete _root.onEnterFrame;
this.startDrag();
}
obus.onRelease = function(){
Y2 = _ymouse;
diffY = Y2-Y1;
delete obus.onEnterFrame;
speed._y = diffY;
this.stopDrag();
position={_x:obus._x,_y:obus._y}
_root.onEnterFrame=function(){
speed._y += gravite;
position._y+= speed._y;
if(position._y&gt;=380){
position._y=380;
speed._y=speed._y*-1;
speed._y=speed._y*0.8;
}
if(position._y<=20){
position._y=20;
speed._y = speed._y*-1;
}
obus._y=position._y;
}
}

Merci mille fois encore et encore smile.gif

Fichier(s) joint(s)



#13 Ged

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 127 messages

Posté 31 July 2005 - 21:40 PM

arf mais comment vous codé ca ? icon_eek.gif icon_eek.gif

je comprends rien icon_redface.gif
quelqu'un a un tuto sur la gravity svp ? icon_smile.gif

#14 daemon

  • Members
  • PipPipPipPipPipPipPipPip
  • 1764 messages

Posté 31 July 2005 - 22:20 PM

Yop.

C simple : la vitesse c'est le nombre pixel dont on deplace un clip a chaque frame.
L'acceleration c'est l'ogmentation de cette vitesse a chaque frame.
Le rebond c'est l'inversion de la direction de la vitesse (pour simplifier).


Une fois que l'on sait ça... on peux coder facilement.



#15 retro1327250230

  • Members
  • PipPipPipPipPipPipPipPip
  • 846 messages

Posté 01 August 2005 - 00:18 AM

de rien wink.gif

sinon pour que ça marche vraiment bien il faut aussi le foutre sur l'evenement onReleaseOutside, t'as juste ça à ajouter:

ActionScript
obus.onReleaseOutside=obus.onRelease=function(){//laaalalala...} 
 

Modifié par retro, 01 August 2005 - 00:21 AM.


#16 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 01 August 2005 - 08:37 AM

Bon voilà, je vous donne le code casi fini,

Sa marche sur l'axe des x et y,
Le seul hic c'est le frotement sur l'axe des X... enfin vous aller voir sa puisque je donne le code et le vizu.

ActionScript
obus.swapDepths(10);
speed={_x:0,_y:0};
var gravite = 1;
var Y1 = 0;
var Y2 = 0;
var X1 = 0;
var X2 = 0;
obus.onMouseDown = function(){
this.onEnterFrame = function(){
Y1 = _ymouse;
X1 = _xmouse;
}
delete _root.onEnterFrame;
this.startDrag();
}
obus.onMouseUp = function(){
Y2 = _ymouse;
diffY = Y2-Y1;
X2 = _xmouse;
diffX = X2-X1;
delete obus.onEnterFrame;
speed._y = diffY;
speed._x = diffX;
this.stopDrag();
position={_x:obus._x,_y:obus._y}
_root.onEnterFrame=function(){
speed._y += gravite;
position._y+= speed._y;
position._x+= speed._x;
if(position._x &gt;= 376){
position._x = 376;
speed._x = speed._x*-0.5;
}
if(position._x <= 24){
position._x = 24;
speed._x = speed._x*-0.5;
}
if(position._y&gt;=376){
position._y=376;
speed._y=speed._y*-1;
speed._y=speed._y*0.8;
}
if(position._y<=24){
position._y=24;
speed._y = speed._y*-1;
}

obus._y=position._y;
obus._x=position._x;
}
}


J'ai remplacer OnPress et onRelease par onMouseDown et onMouseUp car parfois la balle ne partait pas si le mouvement était trop rapide...

De plus la balle glisse, sa vitesse diminu en tapant les murs mais c'est tout... pas de frotement quoi.

Si quelqu'un pouvais m'expliquer comment la faire ralentir... sa serais cool wink.gif.

Merci beaucoup par avance.

Fichier(s) joint(s)



#17 fran6jam

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 130 messages

Posté 01 August 2005 - 08:41 AM

un tuto sur le sujet

#18 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 01 August 2005 - 08:41 AM

Je viens juste de voir ce que m'a écris retro => par conséquent j'ai remplacer mes onMouse par on Press et ce onReleaseOutSide et en effet maintenant sa marche nikel =).

(ya toujours le probleme de frotement mais c'est déjà mieu merci beaucoup)

#19 Mr.Doom

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 220 messages

Posté 01 August 2005 - 12:09 PM

Ne voyant pas d'autre solution que d'utiliser un hitTest pour le frottement, voici ce que j'ai fais :

ActionScript
if(obus.hitTest(murB)){
speed._x -= speed._x/10
}


et le vozu pour le résultat...

PS: si vous avez une autre solution pour le frottement entre la balle et le sol, faites moi signe wink.gif

Je voulais remercier aussi toutes les personnes qui m'ont aidé, sans elles je n'y serais jamais arrivé.
Merci encore.

Fichier(s) joint(s)



#20 shmu

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 190 messages

Posté 01 August 2005 - 14:55 PM

Salut, voulant tester ton code pour en comprendre le méchanisme, voila ce que j'ai obtenue dans la fenêtre de sortie icon_neutral.gif

Code

**Erreur** Séquence = Séquence 1, calque = Calque 2, image = 1 :Ligne 30 : gt' inattendu
      if (position._x &gt; = 376) {

**Erreur** Séquence = Séquence 1, calque = Calque 2, image = 1 :Ligne 38 : gt' inattendu
      if (position._y &gt;  = 376) {

Total des erreurs ActionScript : 2   Erreurs signalées : 2


Il vaut mieux mettre ">" je crois ... sinon c'est rigolo comme truc icon_biggrin.gif



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP