Probleme avec hitTest en ActionScript 2

Probleme avec hitTest en ActionScript 2 - Flash/ActionScript - Programmation

Marsh Posté le 11-10-2007 à 01:26:03    

:whistle: Salut,
voila j'ai un petit problème, je dois réaliser un casse brique, pour l'instant juste une balle qui rebondit contre des parois.
http://the-wallofame.com/david-cedric-portefolio/img.jpg
On m'oblige à utiliser un hitTest   :pt1cable: pour détecter la collision de la balle avec les parois, le problème c'est que par moments la balle se retrouve coincée contre une des parois au lieu de rebondir normalement, c'est à dire qu'elle zigzague contre celle-ci avant de ressortir (du jeu ou retourne dans le rectangle). :cry:  
Voila:
http://the-wallofame.com/david-cedric-portefolio/prob.jpg
J'ai fait un trace() pour relever les angles lors du probleme et ils sont identiques, en gros ça veux dire que la balle se trouve emprisonnée dans le mur (ou la raquette quand on en met une).
 
Voila mon code:
 
   //----------------------------------champs-------------------------
    //initialisation des variables
    var hauteur:Number = Stage.height;
    var largeur:Number = Stage.width;
 
    //on positionne le cercle au centre de la scene
    cercle._x = largeur/2;
    cercle._y = hauteur/2;
 
    //varibales globales qui modélisent la vitesse et l'orientation de la balle
    _global.vitesse = 24;
    _global.angle = Math.PI/4;
 
    //--------------------------------fonction pour déplacer la bille------------------------------------------
    function deplacerCercle() {
       
        //collision avec barre de gauche  
        if (_root["murGauche"].hitTest(_root["cercle"])) {
            _global.angle=Math.PI-angle;
        }
        //collision avec barre du haut
        if (_root["murHaut"].hitTest(_root["cercle"])) {
            _global.angle=2*Math.PI-angle;
        }
        //collision avec barre de droite  
        if (_root["murDroite"].hitTest(_root["cercle"])) {
            _global.angle=Math.PI-angle;
        }
        //collision avec barre du bas  
        if (_root["murBas"].hitTest(_root["cercle"])) {
            _global.angle=2*Math.PI-angle;
        }
 
        //calcul de la destination de la bille
        var deltaX:Number = Math.cos(angle)*vitesse;
        var deltaY:Number = Math.sin(angle)*vitesse;
       
        //déplacement de la bille
        cercle._x += deltaX;
        cercle._y -= deltaY;
    }
 
 
    //-----------------------fonction principale, lancement de la fonction init()-------------------------
    onEnterFrame = function () {
        deplacerCercle();
    };

 
 
Si quelqu'un peux m'aider ça serais super sympa...  :D

Reply

Marsh Posté le 11-10-2007 à 01:26:03   

Reply

Marsh Posté le 11-10-2007 à 03:17:50    

C'est pas mal ton truc des angles mais peut être un peu compliqué.
Moi je fais comme ça :
Je donne 2 propriétés de sens a mon objet
cercle.sensX = 1;
cercle.sensY = -1;
 
que je multiplie à la vitesse
        cercle._x += vitesse*sensX;
        cercle._y += vitesse*sensY;
 
Et ensuite je met dans chaque hitTest()  
  //collision avec barre de gauche  
        if (_root["murGauche"].hitTest(_root["cercle"])) {
            cercle.sensX = 1;
        }  
        //collision avec barre du haut
        if (_root["murHaut"].hitTest(_root["cercle"])) {
             cercle.sensY = 1;
        }
 
etc ...


---------------
Jeu de simulation Boursière - Version BETA - https://www.facebook.com/wildstocks
Reply

Marsh Posté le 11-10-2007 à 10:01:07    

C'est dû au hitTest. Il ne faut pas utiliser de hitTest. Tu dois faire ton test sur les coordonnées que tu calcules à la ligne <//déplacement de la bille>, et ne PAS les appliquer si le test est positif.
 
Sinon, tu lances ton test trop tard : la bille a déjà dépassé le bord, elle est coincée, puisque le test donnera toujours un résultat positif/négatif/positif/négatif/etc. D'où l'effet d'oscillation.
 
Ta méthode peut sembler astucieuse mais normalement ça ne se fait pas comme ça (angles), mais plutôt avec des vecteurs, beaucoup plus rapides au runtime que Math.sin() et Math.cos(). Les opérations mathématiques induites lorsque tu travailles avec des vecteurs sont beaucoup plus rapides (tu multiplies juste le vecteur par -1 et x ou en y quand il rencontre une paroi).
 
(simple remarque : ce n'est pas de l'as2, édite ton titre, en as2 on fait des classes)


Message édité par antika le 11-10-2007 à 10:02:51
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed