Redimensionner un movie clip dynamiquement

Résolu
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008 - 23 avril 2008 à 15:57
 Pelmo - 30 oct. 2010 à 15:52
Bonjour à tous,
je suis débutant en flash mais essaye de s'en sortir! Je connais les bases de flash mais j'ai une question qui ne trouve pas (encore) de réponse. Voilà, je voulais savoir s'il était possible de redimensionner dynamiquement un movie clip. En effet, dans mon animation je drag and drop des objets, mais je voudrais que l'utilisateur puisse agrandir ou retrecir comme il le souhaite ce movieclip. Comment dois-je m'y prendre? Où m'informer?

HELP!

Merci d'avance.

25 réponses

dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
23 avril 2008 à 18:10
Salut!

Bien sûr c'est tout à fait possible!
En jouant sur les propriétés _xscale et _yscale de ton movieclip.

ex : monClip._xscale += 50;   (au passage c'est une valeur en pourcentage)

Ensuite il faut combiner cela avec des actions que tu désirerai ( clique sur un bouton, touche + du clavier, ect...)

Ex dans le cas d'un bouton "augmenter la taille" :

btnAugmenterTaille.onPress = function() {
    monClip._xscale += 50;
}

ps : tes clips et boutons placés sur la scène doivent avoir un nom d'occurence

En Espérant t'avoir un peu éclairé
3
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
23 avril 2008 à 19:13
Y'a pas de quoi!

- Oui, tu peux aisément spécifier une limite d'agrandissement des clips à l'aide d'un condition :

if (monClip._width < 400) {
    monClip._xscale += 50;
}
( si la largeur totale de monClip est inférieure est 400 alors augmenter la taille de monClip de 50% ).

Tu peux très aussi faire un test de condition sur la propriété _xscale directement :

if (monClip._xscale < 200) {
    monClip._xscale += 50;
}

- Pour effectuer une rotation : utilise la propriété _rotation   :p  (en %)

- Alors pour redimensionner tes occurences, je dirais qu'il y a 3 solutions rapides :
    - soit comme tu dis, répéter la ligne en changant le nom du clip à chaque clip
    - soit nommer tous tes clips avec un prexife commun et utiliser une boucle :

       for (i=0 ; i<[nombre de clips au total] ; i++) {
            nomClip[i]._xscale += 50;         
        }

      Avec cette méthode, tu peux en 3 lignes appliquer une transformation à autant d'occurences que tu veux!

    - soit encore à l'aide d'unc boucle, énumérer toutes les occurences placées sur la scène:

    for in(clip in this) {
       clip._xscale += 50;
    }
    (à tester, je n'ai pas testé)

Voilà à toi de tester et choisir ce que tu veux :)

Mais globalement, si tu désires appliquer la transformation à tous les clips sans exceptions, il  y a une méthode extrément facile qui consiste à placer tous ces clips dans un clip conteneur principal qui sera placé sur la scène.
Ainsi, tu auras juste à modifier le _xscale de ce conteneur . Mais il y a un seul défault, c'est que les origines (d'un point de vue repère sur la scène) seront tous décalés.

3
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 15:34
Oui tout à fait, tu dois mettre ["bec"+i]  pour que la condition prenne effet sur tous les clips.

btnAugmenterTaille.onPress = function() {
        for (i=0 ; i<3 ; i++) {
            if (this._parent["bec"+i]._xscale < 200) {

                this._parent["bec"+i]._xscale += 50;

            }

        }
}

La condition "if" doit être à l'intérieur de la boucle for pour qu'elle prenne en compte tous les clips. Sinon, si tu l'avais nommé seulement "bec1", le script se serait contenté de tester 3 fois sur ce même clip.
En fait tous le code que tu insères à l'intérieur de la boucle sera executé autant de fois que la boucle s'incrémentera.
3
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 15:56
"Le savoir s'accroit lorsque'on le partage" :)  Hé bien je suis fier de t'avoir été utile !

Pour ta finilisation c'est encore une fois possible (il n'y a presque plus de limite avec l'actionscript).
Je t'ai répondu dans ton autre post :

clip.startDrag( true , left, top , right , bottom);

Les valeurs de



left, top , right , bottom délimentent en fait un rectangle virtuel sur la scène dans lequel tu peux dragger ton clip.  (coin haut-gauche et coin bas-droit)

Bonne chance dans la suite de ton initiation de l'AS!

Djouf
3

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

Posez votre question
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
23 avril 2008 à 18:41
merci beaucoup dj-ouf! ça fonctionne parfaitement!

Est ce que je peux dire au bouton de s'arréter à une certaine taille d'agrandissement pour que mes formes n'occupent pas tout l'écran?

Est il possible de créer un bouton pour faire une rotation de la forme? Si oui, est-ce avec rotate?


De plus, pour faciliter mon animation j'aimerais bien que l'effet du "bouton redimenssioneur" face effet sur l'ensemble des formes que j'ai. Dois-je répéter la ligne de code pour chacune des formes (environ 50) ou y aurait-il un moyen pour dire au bouton de prendre en compte un ensemble de forme?
(je sais pas si je suis très clair... désolé)

Désolé pour toutes ces questions mais je patauge totalement et sent bien que je touche le resultat que je veux du bout des doigts!

encore merci!
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
23 avril 2008 à 19:28
Un énorme merci pour ta réponse détaillée et si rapide!!!
Les forums manque de gens comme toi!

Par contre je dois vraiment être nul car avec toutes des données précieuses le résultat ne fonctionne pas. (pas encore?)

Je te donne le code que j'ai dans mon image principale peut être que tu sauras me trouver ce qui cloche. Je dois avoir oublier plein de trucs je pense.

for (i=0 ; i<[3] ; i++) {
bec[i]._xscale += 50;
}

btnAugmenterTaille.onPress = function() {
bec1._xscale += 50;
bec1._yscale += 50;
}

if (bec[i]._xscale < 100) {
bec[i]._xscale += 50;
}


PEut etre as tu la solution? Désolé pour toutes ces questions!
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
23 avril 2008 à 19:32
ah oui désolé pour préciser mes movie clip s'appelle bec1 bec2, pour l'instant je n'essaye le code qu'avec 2 mc.
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
23 avril 2008 à 19:35
for (i=0 ; i<[3] ; i++) {
bec[i]._xscale += 50;
}

btnAugmenterTaille.onPress = function() {
bec1._xscale += 50;
bec1._yscale += 50;
}

if (bec[i]._xscale < 100) {
bec[i]._xscale += 50;
}

désolé je n'arrivais pas a entrer mon code avec les saut de ligne.
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 09:49
Re salut ! :p

Tu  y étais presque! Juste une petite erreur de placement. Voilà avec correction, pour le cas de 3 clips nommés bec1, bec2 et bec3 sur la scène :

btnAugmenterTaille.onPress = function() {

        for (i=0 ; i<3 ; i++) {


            if (bec[i]._xscale < 200) {


                bec[i]._xscale += 50;


            }


        }

}

Voilà, en fait il fallait imbriquer les conditions, car nous devons faire le test seulement lorqu'on a cliqué sur le bouton btnAugmenterTaille. Ce n'est pas forcément évident à comprendre au début, mais à force de l'utiliser on en comprend la subtilité, sisi!
Sinon, tu n'avais pas besoin de mettre le 3 entre crochets sur la ligne du for, car en fait le crochet sert à spécifier qu'on veut interpréter le nom du clip avec la valeur d'une variable ;)
Comme ceci :   bec[variable]  --> donne "bec4" si variable = 4.

Ca donne des possibilités énorme n'est ce pas ?

Bon courage pour la suite, n'hésites pas
0
faiblard Messages postés 337 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 4 janvier 2011
24 avril 2008 à 09:54
Bonjour,



for (i=0 ; i<[3] ; i++) {

            bec[i]._xscale += 50;          

        }

btnAugmenterTaille.onPress = function() {

   bec1._xscale += 50;

   bec1._yscale += 50;

}

if (bec[i]._xscale < 100) {

    bec[i]._xscale += 50;

}

A quoi te sert ton if? la a vu de nez dans ton bec[i] doit correspondre a bec[3] comme il n'est pas dans ta boucle for...et il ne marchera pas dans le cas de ton appuie bouton puisqu'il n'est pas dans la fonction... (j'ai lu en diagonal mais bon...)

Je pense plutot que tu voulais mettre dans le style :




for (i=0 ; i<[3] ; i++) {


            bec[i]._xscale += 50;          


        }


btnAugmenterTaille.onPress = function() {


  
if (bec1._xscale < 100)
 {

        bec1._xscale += 50;



       bec1._yscale += 50;

    }


}

-------------------------------------------------------------------
La recherche est ton amie ! Promis elle ne te mordra pas...
Enjoy
N'oubliez pas d'accepter pour aidez les autres quand ils cherchent !
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
24 avril 2008 à 11:26
bonjour,

merci de suivre mes essais!

j'ai bien utiliser le nouveau code que tu m'as laissé dj_ouf. et ça ne marche toujours pas...
Je ne sais pas ce qu'il manque. Il ne fallait pas déclarer une variable ou quelquechose comme ça avant de mettre cette nouvelle ligne de code?

je ne comprend vraiment pas ce qui cloche.
:(
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
24 avril 2008 à 11:30
Statement must appear within on/onClipEvent handler
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 11:34
Pardon,

je crois que j'ai fait une grosse erreur!!

Cette syntaxe est reservée aux tableaux :   bec[i]   -> i correspond à un indice de tableau

Donc cela serait "normal" que ça ne marche pas car flash cherche un élément contenu dans un tableau appelé "bec"!

La bonne syntaxe devrait être celle ci :

this["bec"+i]   ( this correspondant en fait à la scène (_root) ) -> flash interprètera comme ceci this.bec1 , this.bec2, ect... :D

au final :


btnAugmenterTaille.onPress = function() {
        for (i=0 ; i<3 ; i++) {
             this["bec"+i]._xscale += 50;
        }
}

Essayes et tiens moi au courant !

0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 11:36
"

Statement must appear within on/onClipEvent handler"

--> hmm, je crois que cette erreur apparait lorsque tu essayes de placer du code "sur" un clip.

Tu dois placer le code sur la scène, donc dans une image-clé du scénario principal.
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
24 avril 2008 à 12:06
ça ne fonctionne toujours pas.

aïe aïe aïe!
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
24 avril 2008 à 12:10
en fait je n'ai mis que ces quelques lignes de codes dans ma scene principal il manque peut etre des autres lignes de codes avant de mettre cette fonction? (je n'ai pas de _root par exemple....)
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 12:11
Je suis distrait... ici, 'this' désigne le bouton( car on est à l'intérieur de la fonction onPress du bouton ). Il faut donc remonter d'un niveau, et pour cela le mot-clé "_parent" est approprié.

Essayes ceci :

btnAugmenterTaille.onPress = function() {

        for (i=0 ; i<3 ; i++) {

             _parent["bec"+i]._xscale += 50;

        }

}

Sinon, un petit test simple et efficace pour s'assurer qu'on pointe correctement les bonnes instances :

trace(_parent["bec"+i]._xscale);   à mettre à l'intérieur de la boucle for, et cela devrait te retourner une valeur cohérente, preuve que les instances sont bien présentes.
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 12:15
"
en fait je n'ai mis que ces quelques lignes de codes dans ma scene
principal il manque peut etre des autres lignes de codes avant de
mettre cette fonction? (je n'ai pas de _root par exemple....)"

-->non normalement tu n'as pas besoin de mettre lignes avant la fonction, sauf p-e des quelquonques initialisations mais pas indispensables.

Pour le _root, noramlement c'est à prohiber (car en cas de chargement de l'anim dans un autre swf, le _root devient totalement autre chose puisque il représente le niveau le plus bas).

Il faut utiliser les mots-clés "this" et "_parent" à la place.
this pour désigner "ce niveau çi"
_parent pour remonter d'un niveau
0
cece2000 Messages postés 24 Date d'inscription vendredi 11 janvier 2008 Statut Membre Dernière intervention 21 mai 2008
24 avril 2008 à 14:09
je crois que je vais laisser tomber et faire ligne par ligne parceque ça ne fonctionne pas non plus...
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
24 avril 2008 à 14:33
Noon ne déséspères pas ^^

J'ai fait le test sous flash, car ça m'étonnais franchement....

Désolé, je n'avais pas le temps de faire ça avant
Alors j'ai testé et effectivement il manquait quelques chose, de très peu, en fait la combinaison des 2.
Voilà le code, testé et fonctionnel :p

btnAugmenterTaille.onPress = function() {
        for (i=0 ; i<3 ; i++) {
             this._parent["bec"+i]._xscale += 50;
        }
}

il manquait juste le "this" devant "_parent" !
0
Rejoignez-nous