Probleme avec hitTest en ActionScript 2 - Flash/ActionScript - Programmation
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 ...
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)
Marsh Posté le 11-10-2007 à 01:26:03
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.
On m'oblige à utiliser un hitTest 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).
Voila:
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...