Scrolling multidirectionnel

Résolu
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013 - 10 avril 2007 à 16:26
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 - 11 avril 2007 à 19:41
Bonjour à tous,

Je voudrais créer un lecteur vidéo avec un scrolling multidirectionnel. En gros, j'ai un grand clip en fond et une petite fenêtre, et j'interprète la position de la souris pour scroller d'un côté, ou de l'autre. J'arrive à le faire sur l'axe des X ou celui des Y mais pas sur les deux en même temps.

Voilà le code:

this.onMouseMove = function() {

constrainedMove(bg_mc, 4, 1);
};

function constrainedMove(target:MovieClip, speed:Number, dir:Number) {

var mousePercent:Number = _xmouse/Stage.width;
var mSpeed:Number;
if (dir == 1) {
    mSpeed = 1-mousePercent;
} else {
    mSpeed = mousePercent;
}
target.destX = Math.round(-((target._width-Stage.width)*mSpeed));
target.onEnterFrame = function() {

if (target._x == target.destX) {
    delete target.onEnterFrame;
} else {
    target._x += Math.ceil((target.destX-target._x)*(speed/100));
}
};
}

J'ai déjà posté sur cette question mais sans aucune réponse, donc je me permets de remettre ça. Je précise que je suis débutant en flash. Quelqu'un peut-il me dire comment m'y prendre. En refaisant la même fonction pour les Y ça ne marche pas, vu que les deux partagent des variables. Comment les faire cohabiter, alors?

Merci!

6 réponses

Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 1
11 avril 2007 à 14:12
No panic no panic !!!

J'ai réessayé et j'ai trouvé l'erreur dans mon code :
        target.destX = Math.round(-((target._width-Stage.width)*mSpeed));
        target.destY = Math.round(-((target._height-Stage.height)*mSpeed));
J'ai oublié de remettre à jour la variable.

Ce code là, par contre, fonctionne sans problème (je l'ai testé et ça marche) :
Code :
    this.onMouseMove = function() {
        constrainedMove(bg_mc, 4, 1);
    };
    function constrainedMove(target:MovieClip, speed:Number, dir:Number) {
        var nMousePercent_x        :Number     = this._xmouse/Stage.width;
        var nMousePercent_y        :Number     = this._ymouse/Stage.height;
        var nSpeed_x            :Number     = 1-nMousePercent_x;
        var nSpeed_y            :Number     = 1-nMousePercent_y;
        target.destX                         = Math.round(-((target._width-Stage.width)*nSpeed_x));
        target.destY                         = Math.round(-((target._height-Stage.height)*nSpeed_y));
        target.onEnterFrame = function() {
            if (target._x == target.destX) {
                delete target.onEnterFrame;
            } else if (target._x>target.destX) {
                target._x -= Math.ceil((target._x-target.destX)*(speed/100));
            } else if (target._x<target.destX) {
                target._x += Math.ceil((target.destX-target._x)*(speed/100));
            }
            if (target._y == target.destY) {
                delete target.onEnterFrame;
            } else if (target._y>target.destY) {
                target._y -= Math.ceil((target._y-target.destY)*(speed/100));
            } else if (target._y<target.destY) {
                target._y += Math.ceil((target.destY-target._y)*(speed/100));
            }
        };
    }
Fin code

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
3
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 1
10 avril 2007 à 16:47
Salut,

"J'arrive à le faire sur l'axe des X ou celui des Y mais pas sur les deux en même temps
En refaisant la même fonction pour les Y ça ne marche pas, vu que les
deux partagent des variables. Comment les faire cohabiter, alors?"
Bhein en doublant les variables, en en refaisant de nouvelles.

Code :
    this.onMouseMove = function() {
        constrainedMove(bg_mc, 4, 1);
    };
    function constrainedMove(target:MovieClip, speed:Number, dir:Number) {

        var nSpeed_x                :Number     = 0;


        var nSpeed_y                :Number     = 0;

        var nMousePercent_x    :Number     = this._xmouse/Stage.width;



        var nMousePercent_y    :Number     = this._ymouse/Stage.height;
        if (dir == 1) {
            nSpeed_x = 1-nMousePercent_x;

            nSpeed_y = 1-nMousePercent_y;
        } else {
            nSpeed_x = nMousePercent_x;

            nSpeed_y = nMousePercent_y;
        }
        target.destX = Math.round(-((target._width-Stage.width)*mSpeed));

        target.destY = Math.round(-((target._height-Stage.height)*mSpeed));
        target.onEnterFrame = function() {
            if (target._x == target.destX) {
                delete target.onEnterFrame;
            } else {
                target._x += Math.ceil((target.destX-target._x)*(speed/100));
            }

            if (target._y == target.destY) {

                delete target.onEnterFrame;

            } else {

                target._y += Math.ceil((target.destY-target._y)*(speed/100));

            }
         }
    }
Fin code

Ou tout du moins quelque chose dans ce style.
Ne sachant pas trop à quoi servent chaque variable, j'ai fait au mieux.

J'espère que ça convient

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
0
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013
10 avril 2007 à 17:25
Bonjour Darkrats et merci à toi pour ta réponse. En fait, j'ai commencé par doubler les variables mais aussi les fonctions et ça n'avait rien donné. J'ai quand même testé ta méthode mais sans succès. Pour info, voici à quoi correspondent les variables (dans la version à un seul axe, X):

-La variable Mousepercent donne la position de la souris en x par rapport à la largeur de la scène (entre 0 et 1)
-La variable mSpeed est soit Mousepercent, soit 1-Mousepercent, ce qui détermine le mouvement (et sa vitesse) de la scène (vers la droite ou la gauche selon la position de la souris)
- La variable DestX stocke la position en x de la souris.

Cette ligne: "target.destX=Math.round(-((target._width-Stage.width)*mSpeed))" permet au scrolling de ne pas aller plus loin que les limites du clip

En principe, avec ta méthode (et même peut-être avec la mienne), ça doit marcher. Pourtant, pas moyen d'y arriver dès qu'on rajoute un axe.

A titre indicatif, ce code n'est pas de moi donc voici la source originaleet voici la page de l'auteur, qui a fait du très bon boulot!

Merci encore Darkrats de m'avoir répondu, c'est plus simple à plusieurs, paraît-il.

Affaire à suivre...
0
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013
11 avril 2007 à 16:28
Merci Drakrats!

Ca fonctionne! Et je t'en dois une!

Drakrats +1

Le scrolling fonctionne à merveille, et j'ai déjà en tête une possibilité d'amélioration. La première version de lecteur que j'avais fait utilisait un code flash très connu (lien ici) qui permet de passer d'un bord à l'autre des 360° en dupliquant le clip qu'on utilise (ils expliquent ça mieux que moi). Le problème du truc, c'est que:
1.Le scrolling est saccadé et instable, encore pire en vidéo
2. Effet de désorientation dû au fait qu'il n'y a plus ni milieu, ni côté.

Or, ce scrolling, ci, que je te dois, Darkrats, a un ralentissement lorsqu'on arrive sur les bords. En le modifiant un peu, il doit être possible de ralentir, et, passé le bord du film en arrivant sur sa copie, de réaccélérer lorsqu'on continue jusqu'au milieu et ainsi de suite. Je vais me pencher sur la question, et refiler le code si j'y arrive le premier. L'étape suivante sera de troquer mon objet vidéo contre une vidéo flv choisie sur le disque d'un serveur. Une fois passé les soucis de taux de tranfert (360° de vidéo, c'est à peu près 3fois plus de contenu), ça devrait fonctionner.

Merci encore, c'était une étape problématique pour moi et tu m'a retiré un fière chandelle du pied! ()
A bientôt!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Billybobbonnet Messages postés 148 Date d'inscription lundi 12 février 2007 Statut Membre Dernière intervention 9 novembre 2013
11 avril 2007 à 16:34
Je reviens sur ma montée d'enthousiasme pour quelques modifications: Darkrats+1 et désolé pour les fautes d'orthographe et la taille de police,j'avais pas vu!(pour la suite, par contre j'assume le +1 ;)
0
Darkrats Messages postés 212 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 12 mai 2008 1
11 avril 2007 à 19:41
Salut

Vu ton enthousiasme, ça devait être un problème bien épineux ... ton sésame pour toute une floppée de délire flashouillant ha ha ha

Je suis très content d'avoir pu t'aider.
Si maintenant que tu as ta réponse, tu pouvais cocher "réponse acceptée" ça plairait énormément aux modérateurs du forum
Et un bon codeur est un codeur qui flash ... heu ... fache pas les modérateurs (hu hu j'ai pas pu m'empêcher la finte )

Pour ta vidéo, un ptit flv, y a rien de mieux.
En plus il paraît ( mais je n'ai pas encore tester donc c'est à prendre avec des pincettes ) que sur Flash 8, il y a un player déjà fait et tout prêt à être utilisé ... c'est tit pas beau la vie ?

Bon codage et que l'action script soit avec toi ... à jamais

--------- Darkrats ---------
la loi est dure mais c'est la loi
 -------- Infograpix --------
0
Rejoignez-nous