Forums Développement Multimédia

Aller au contenu

[AS2] Problème déplacement/distance d'un clip par rapport à un autre...

CODE AS2

15 réponses à ce sujet

#1 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 02 December 2015 - 18:46 PM

Bonsoir à tous :smile:

Je cherche un moyen pour que lorsque je déplace mon personnage (mc perso) à l'aide d'un drag&drop vers la source radioactive (mc trisecteur), la jauge (mc jauge) augmente ou diminue en fonction du déplacement de mon personnage. Plus le personnage se rapproche de la zone radioactive et plus ma jauge augmente. A l'inverse si le personnage s'en éloigne, la jauge diminue.

Pour le moment j'ai joué sur l'axe des abscisse mais je me rend compte que ce n'est pas forcement la bonne solution car il faudrait définir pleins de zones sur l'axe. De plus si je reste appuyé sur le personnage sans le déplacer, la jauge augmente toute seul. Un autre soucis est que si je relâche mon personnage dans ma zone pré-configurée sur l'axe X, la jauge diminue jusqu'au bout sans s'arrêter.
Je ne parviens pas à bien combiner onPress & onRelease pour mes besoins...

Quelqu'un pourrait-il m'aider ?
Je vous joins mon animation.

Merci.

Fichier(s) joint(s)



#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7012 messages

Posté 02 December 2015 - 19:49 PM

Bonsoir,

Citation

Plus le personnage se rapproche de la zone radioactive et plus ma jauge augmente. A l'inverse si le personnage s'en éloigne, la jauge diminue.

Calcul de distance :

// distance entre deux objets  
function distance(a,b ) {
        var dx=a.x-b.x;
        var dy=a.y-b.y;
        return Math.sqrt(dx * dx + dy * dy);
}

Une fois que tu as la distance tu fais une règle de trois pour l'appliquer à la jauge.

Citation

De plus si je reste appuyé sur le personnage sans le déplacer, la jauge augmente toute seul. Un autre soucis est que si je relâche mon personnage dans ma zone pré-configurée sur l'axe X, la jauge diminue jusqu'au bout sans s'arrêter. Je ne parviens pas à bien combiner onPress & onRelease pour mes besoins...

Avec la distance tu n'as pas besoin de jouer sur les événements "onPress" et "onRelease".
Il te suffit de faire une boucle perpétuelle qui, à tout moment, va caler la jauge en fonction de la distance entre tes deux objets.
En AS2 je crois que c'était un truc du genre :


onEnterFrame = function(){
// caler la jauge
}
 

Un conseil au passage, si tu débute avec le code oublie l'AS2 qui est ultra enterré, passe directement à AS3 tu trouvera plus d'aide et ce sera plus simple.


[edit] rapidement voici comment je vois la chose :


var dist = 0; // distance entre les objets
var jauge = 0; // niveau de la jauge
var distmax = 400; // axe de 0 a 400
var jaugemax = 100; // jauge de 0 a 100
var facteur = distmax / jaugemax; // multiplicateur

onEnterFrame = function() {
        dist = distance(perso,trisecteur); // calcule la distance
        jauge = dist / facteur; // position de la jauge
        // à toi de jouer sur la rotation
}

// distance entre deux objets  
function distance(a,b ) {
        var dx=a.x-b.x;
        var dy=a.y-b.y;
        return Math.sqrt(dx * dx + dy * dy);
}
 


#3 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 02 December 2015 - 21:35 PM

Ça fonctionne avec ce principe , merci :smile:
J'ai juste un soucis pour trouver la bonne formule afin que la jauge tourne dans le bon sens de 0 à 180°.


onEnterFrame = function() {
  var x = trisecteur._x - perso._x ;
  var y = trisecteur._y - perso._y ;
  var distance = Math.sqrt((x*x)+(y*y));
  var act = _root.jauge.aiguille._rotation  = (distance); // ICI
 
}

//StartDrag
perso.onPress = function(){
startDrag(this,true,168,384,660,384);
}

//StopDrag
perso.onRelease = function(){
this.stopDrag();
}
 


#4 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 02 December 2015 - 23:30 PM

Hello !


var x = trisecteur._x - perso._x ;
var y = trisecteur._y - perso._y ;
var act = _root.jauge.aiguille._rotation = Math.atan2(y,x);


++

#5 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 02 December 2015 - 23:51 PM

Merci, j'ai testé mais ça ne fonctionne pas, l'aiguille ne bouge plus.

#6 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 03 December 2015 - 00:07 AM

Ah oui pardon

var act = _root.jauge.aiguille._rotation = (Math.atan2(y,x) / (Math.PI/180));

#7 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3486 messages

Posté 03 December 2015 - 00:15 AM

Pardon (bis), j'ai lu trop rapidement ton sujet.
En fait, c'est plus simple que je ne pensais :)

A partir du code de Mr Spi, il suffit de faire ça

_root.jauge.aiguille._rotation = facteur * 180;

#8 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 03 December 2015 - 00:17 AM

Merci, j'ai essayé avec ça mais l'aiguille tourne juste un peu dans le mauvais sens.


onEnterFrame = function() {
  var x = trisecteur._x - perso._x ;
  var y = trisecteur._y - perso._y ;
  var act = _root.jauge.aiguille._rotation = (Math.atan2(y,x) / (Math.PI/180));
}
 

Fichier(s) joint(s)



#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7012 messages

Posté 03 December 2015 - 00:38 AM

Rapidement au passage, formules à connaître :

degres = radians / Math.PI * 180;
radians = degres * Math.PI / 180;

A prendre en compte que l'angle zéro sous Flash correspond à l'axe X vers la droite.

Image attachée: schema_1.gif

#10 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 03 December 2015 - 01:13 AM

Merci pour vos réponses.
J'ai ressayé avec le code initial de Spi et l'instruction de la rotation "_root.jauge.aiguille._rotation = facteur * 180; " mais je n'arrive pas à le faire fonctionner, c'est pour cela que je l'avais initialement un peu modifié.


var dist = 0; // distance entre les objets
var jaug = 0; // niveau de la jauge
var distmax = 400; // axe de 0 a 400
var jaugemax = 100; // jauge de 0 a 100
var facteur = distmax / jaugemax; // multiplicateur
onEnterFrame = function() {
            dist = distance(perso,trisecteur); // calcule la distance
            jaug = dist / facteur; // position de la jauge
            _root.jauge.aiguille._rotation = facteur * 180;
}
// distance entre deux objets
function distance(a,b ) {
            var dx=a.x-b.x;
            var dy=a.y-b.y;
            return Math.sqrt(dx * dx + dy * dy);
}

//StartDrag
perso.onPress = function(){
startDrag(this,true,168,384,660,384);
}


//StopDrag
perso.onRelease = function(){
this.stopDrag();
}
 


#11 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7012 messages

Posté 03 December 2015 - 03:59 AM

Re,

Un copier/coller ne sert à rien, tu dois adapter les code qu'on te donne et surtout essayer de les comprendre.


var dist = 0;                                    // distance entre les objets
var jaug = 0;                                    // niveau de la jauge
var maxX = 660;                         // arrivée sur X
var minX = 168;                         // départ sur X
var total = maxX-minX;                   // distance totale
var niveau = 200;                                // niveau max de la jauge
var facteur = total / niveau;    // multiplicateur

// distance entre deux objets
function distance(a,b ) {
        var dx = a._x-b._x;
        var dy = a._y-b._y;
        return Math.sqrt(dx*dx+dy*dy);
}

perso.onPress = function(){startDrag(this,true,minX,384,maxX,384)}//StartDrag
perso.onRelease = function(){this.stopDrag()}//StopDrag

onEnterFrame = function() {
        jaug = distance(perso,rayons)/facteur;   // position de la jauge
        aiguille._rotation = 360-jaug-100;              // 360 pour inverser et -100 pour compenser
}
 

Pour que ce code marche j'ai du sortir l'aiguille de la jauge et changer son point de pivot.
Le problème pour ta jauge c'est qu'elle est graduée sur des pas de 25 degrés avec un décalage pour le niveau zéro.
Donc un angle de zéro degrés ne correspond pas au zéro de ta jauge, il faut compenser.

Ta jauge fait 200 degrés d'arc, avec des pas de 25 degrés.
La distance totale que peut parcourir le perso avant de toucher la cible est : arrivée(660) - départ(168).
Avec ça on trouve le multiplicateur et on s'en sert pour trouver la rotation de la jauge (avec la distance actuelle).

Avec ce calcul la rotation est inversée pour la jauge, on corrige en retirant l'angle actuel à 360 degrés.
Et enfin comme la jauge ne commence pas vraiment à zéro il faut compenser un peu, on retire 100.

Fichier(s) joint(s)



#12 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 03 December 2015 - 10:06 AM

Bonjour & merci.

Je comprend les déclarations de variables et le principe de la distance entres mes deux objets pour ressortir un multiplicateur par la suite mais je suis incapable d'imaginer la formalisation de Pythagore dans la fonction distance ni même le calcul de la progression de la jauge. Du coup avec mes connaissances en mathématique, je me retrouve vite bloqué. J'aimerai pourtant comprendre le fonctionnement et l'appliquer.

Pour l'AS2, je suis obligé d'utiliser ce langage obsolète car la plateforme de conception de modules e-Learning, E-Doceo, n'accepte que l'import de swf compilé en AS2... Je pense que le moteur de la plateforme est en AS2. Je trouve l'AS3 beaucoup plus clair dans sa construction - ce qui ne change rien sur mon la question des calculs.

En tout cas merci, je vais pouvoir continuer. La prochaine étape est de jouer sur un masque de remplissage de la jauge.

Bonne journée !

#13 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 03 December 2015 - 14:47 PM

Alors, j'arrive trop tard et je ne connais même pas AS2.

Par contre, se passer des Maths, c'est un peu ma spécialité. Dans ton cas : créer un clip de l'aiguille avec une interpollation de mouvement de 100 images par exemple, ou l'aiguille tourne, te permet de ne pas calculer la rotation… mais d'exécuter un gotoAndStop() proportionnel à la distance du personnage… Soit, en travaillant bien la géométrie de ta scène :

aiguille.gotoAndStop(personnage.x);

#14 fti-ko

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 98 messages

Posté 04 December 2015 - 22:27 PM

Merci à tous ! dIdIer c'est ce que j'avais commencé à faire de jouer avec les coordonnées de la scène par rapport à mon personnage mais c'était pas le top...

J'ai rebossé un peu dessus pour la jauge.

Sujet résolu en tout cas !

Fichier(s) joint(s)



#15 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1797 messages

Posté 06 December 2015 - 02:04 AM

@dldler
l'as2 ça ressemble à du JavaScript, ça ressemble à ce qu'à fait Microsoft avec TypeScript.

#16 dayrepz

    Ceinture Blanche

  • Members
  • Pip
  • 1 messages

Posté 07 December 2015 - 08:10 AM

Merci.



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

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