Forums Développement Multimédia

Aller au contenu

- - - - -

Comment faire rebondir la balle?

CODE TUTO DETENTE

5 réponses à ce sujet

#1 JNG

    Ceinture Blanche

  • Members
  • Pip
  • 3 messages

Posté 08 July 2015 - 09:22 AM

Bonjour

Je commence tout juste dans le domaine. Mon premier objectif est de faire rebondir une balle avec cette commade: if (ball.y > 350). J'ai remarqué que si j'entre une valeur inférieure à 350 la balle rebondit et si je tape une valeur supérieur à 349 la balle ne rebondit pas. Pouvez-vous m'expliquer le "truk" afin que je puisse mieux comprendre le programme. Merci de votre aide.

Voici mon prgm:

package {
                import flash.display.Sprite;
                import flash.events.Event;

                public class BouncingBall extends Sprite {

                           //définition des variables
                           private var g:Number=0.1; // acceleration due to gravity
                           private var vx:Number=2;  // initial horizontal speed
                           private var vy:Number=0;  // initial vertical speed
                           private var ball:Ball;

                          //[SWF(width="440",height="400",backgroundColor="#000000",frameRate="30")]

                         public function BouncingBall() {

                                        init();

                          }
                          private function init():void {

                                        ball = new Ball(30,0xFF0000); //ball (variable définie plus haut) de rayon 30 pixel et de couleur rouge

                                        //posi° initiale de la ball
                                        ball.x = 50;
                                        ball.y = 50;


                                        addChild(ball);//affiche l'objet sur la scène

                                        addEventListener(Event.ENTER_FRAME,NG); //écoute les évènements: ici j'ai remplacé "onEachTimestep" par NG
                                         }

                                         private function NG(evt:Event):void{

                                                   vy += g;       // gravity increases the vertical speed   //vy += g (ou vy = vy + g)
                                                                                         //g représente l'augmentation de vitesse suivant y pendant l'intervalle de temps correspondant à la durée d'une image dc par unité d'image ou de temps , on incrémente la vitesse suivant y, c'est une chute libre!

                                                  ball.x += vx; // horizontal speed increases horizontal position
                                                  ball.y += vy; // vertical speed increases vertical position

                                                  if (ball.y > 350) { // if ball hits the ground         //si la balle à une ordonnée (hauteur de l'animation) supérieur à 350 alors la balle va rebondir

                                                          vy *= -0.8;   // its vertical velocity reverses and reduces
                                                                                                  // -0,8 est inférieur à -1 c'est dc un amortissement
                                                                                                  //le signe négatif signifie que l'on change de sens
                                                                                                  //vy *= -0,8 (ou vy = vy * (-0,8))
                                                   }

                                           }
                 }
}


#2 JNG

    Ceinture Blanche

  • Members
  • Pip
  • 3 messages

Posté 08 July 2015 - 09:52 AM

j'ai remarqué qu'on modifiant le paramètre position (une valeur de 70 par exemple) sur y la balle rebondit:

//posi° initiale de la ball
ball.x = 50;
ball.y = 70;

???

#3 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 08 July 2015 - 11:31 AM

Bonjour JNG

Ta description du problème est fausse ;-)

En fait, sur certaines valeurs de départ, la balle veut bien rebondir.
Pour d'autres valeurs, elle ne rebondit pas.

Quand elle rebondit, tout fonctionne comme prévu, donc pas de commentaire.

Quand ça ne rebondit pas, que se passe-t-il ?
En fait, la balle continue d'avancer (vitesse en X) mais on dirait qu'elle "clignotte" en vitesse y.
Ta balle est coincée "sous" le sol…
Pourquoi ?
Prenons un cas concret :
- la balle est en position y = 349
- sa vitesse en y est de 10

Ton code s'exécute :
- la balle passe en 349+10 = 359
- la position est > à 350, la vitesse de la balle devient : 10 * -0,8 = -8

Boucle suivante :
- la balle passe en position 359 + (-8) = 351 !
- la position est > à 350, la vitesse de la balle devient : -8 * -0,8 = + 6,4

En résumé : comme la vitesse de la balle est réduite lors de l'impact, elle n'a (parfois) pas assez de vitesse pour remonter plus haut que le sol. Elle reste enterrée.


2 pistes de solutions :

1 - quand il y a impact, tu positionnes la balle exactement à 350, comme ça tu es sûr qu'elle pourra remonter au dessus. C'est le plus simple, mais pas très juste.

2 - quand il y a impact, tu calcules de combien la balle s'est enterrée et tu le reportes comme si elle avait déjà rebondi. là, c'est déjà plus réaliste (et si tu multiplies la valeur d'enterrement par 0.8 avant de la reportée, c'est encore mieux)

function NG (evt:Event):void {
vy += g;// gravity increases the vertical speed   //vy += g (ou vy = vy + g)
ball.x+=vx;// horizontal speed increases horizontal position
ball.y+=vy;// vertical speed increases vertical position
if (ball.y>350) {//si la balle à une ordonnée (hauteur de l'animation) supérieur à 350 alors la balle va rebondir
  // la balle a dépassé le sol, il faut reporter ce dépassement dans le rebond
  // (ceci est d'une part plus réaliste, et de 2, évite que la balle ne reste toujours sous le sol
  // quand sa distance au sol est entre 0.8 et 1 fois sa vitesse !!)
  var dépassement:Number=ball.y-350;// Ceci est le dépassement sous le sol
  ball.y = 350 - dépassement *.8;// Je le reporte au dessu sdu sol
  vy*=-0.8;// its vertical velocity reverses and reduces
}
}


#4 JNG

    Ceinture Blanche

  • Members
  • Pip
  • 3 messages

Posté 11 July 2015 - 10:25 AM

Merci bcp dldler, je comprend mieux le prgm. Merci pour ton aide. :)

#5 brizzly

    Ceinture Blanche

  • Members
  • Pip
  • 1 messages

Posté 20 July 2015 - 08:26 AM

Salut, j'utilise simplement un vecteur (1,1) pour spécifier les 4 directions de la balle. des Boolean font aussi l'affaire.
En gros quand ton vecteur vaut (1,1) ta balle va vers la droite et le bas, en (1,0) elle va juste vers la droite. En cas de débordement d'écran tu multiplie la composante en X de ton vecteur pour la faire changer de direction : (-1,1) par exemple.
Ton déplacement c'est alors : balle_X = balle_X + n * vector_X;

#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 20 July 2015 - 13:42 PM

Hello; brizzly.
En fait, tu te compliques, car non, tu n'utilises pas qu'un vecteur de booléens.
Tu utilises un vecteur de booléens + un nombre réel qui est de toute façon signé.
Autant se servir de ce signe : il simplifie les mathématiques et évite les ifs et si on le réfléchit avec une bonne abstraction, tout est transparent.
De plus, ceci ne résout en rien le problème de la balle "enterrée". Tu as exactement le même problème à régler avec ta technique.


HS : de toute façon, s'il fallait vraiment simplifier, il y toujours la possibilité de le faire sans ligne de code :).




Répondre à ce sujet



  

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