Forums Développement Multimédia

Aller au contenu

Code pour plusieurs clips

air android

28 réponses à ce sujet

#1 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 25 January 2018 - 19:26 PM

Bonjour,
Pour mon appli Air j'utilise le script ci-dessous pour balayer les pages d'un clip importé dans ma scène et je souhaiterais trouver une solution afin de le modifier et de l'utiliser pour plusieurs clips, auriez-vous une idée dans ce sens ?
Merci.


page_slider.x = 0;
var currentStep :Number  = page_slider.x;
var step  :Number  = 330;   // Dimension de la page
var max   :Number  = 0;    // Butée Gauche
var min   :Number  = -660;   // Butée Droite
var distMin  :Number  = 15;    // Distance de relachement
var nextX  :Number  = currentStep;
var startX  :Number;
var offsetX  :Number;
var moving  :Boolean  = false;
var smooth  :Number  = 0.30;   // Vitesse
var mouseIsUp :Boolean  = true;

page_slider.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
function onDown(e:MouseEvent):void{

offsetX = page_slider.mouseX;
startX = mouseX;
moving = true;
mouseIsUp = false;

if(!hasEventListener(Event.ENTER_FRAME))addEventListener(Event.ENTER_FRAME,update);
stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.addEventListener(MouseEvent.MOUSE_UP,onUp);

}

function onUp(e:MouseEvent):void{

mouseIsUp = true;
var dx:Number = mouseX - startX;

if( dx < -distMin){
  currentStep -= step;
  if(currentStep < min) currentStep = min;
 
}else if(dx > distMin){
  currentStep += step;
 
  if(currentStep > max) currentStep = max;
}

nextX = currentStep;
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);

}
function onMove(e:MouseEvent):void{

  nextX = mouseX - offsetX;
}

function update(e:Event):void{

if(moving){
  page_slider.x -= (page_slider.x - nextX) * smooth;
 
  if(mouseIsUp && Math.abs(page_slider.x - nextX) < 1){
   page_slider.x = nextX;
   moving = false;
   removeEventListener(Event.ENTER_FRAME,update);
  }
}
}
 


#2 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 26 January 2018 - 21:41 PM

Tu peux étendre flash.display.MovieClip, créer dans cette classe les variables qui sont propres à tes MovieClips (currentStep, nextX, ...)
Tu places tes clips dans un Array.

Tu places une boucle dans tes écouteurs.



#3 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 30 January 2018 - 06:33 AM

Oui je pense que c'est une bonne solution voir la seule, je me lance la dessus.
merci à toi.

#4 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 03 February 2018 - 10:18 AM

Bonjour,
J'ai donc modifié le script avec un "array et une boucle" mais pour le moment ça ne fonctionne pas encore, une fois le clip importé, quand je clique dessus j'ai un message d'erreur "Un terme est indéfini et n'a aucune propriété" je pense qu'il s'agit d'un problème au niveau des autres écouteurs mais je suis un peu dépassé, pourriez-vous m'orienter sur l'origine du problème.

Merci à vous.

Voici mon code modifié:


var clipGliss_1 :ClipGliss_1  = new  ClipGliss_1();
var clipGliss_2 :ClipGliss_2  = new  ClipGliss_2();

var tab_pages:Array = [clipGliss_1, clipGliss_2];
var max_tab_pages:int = tab_pages.length;

var currentStep :Number  = tab_pages[i].x;
var step  :Number  = 300;  
var max   :Number  = 0;  
var min   :Number  = -600;  
var distMin  :Number  = 5;  
var nextX  :Number  = currentStep;
var startX  :Number;
var offsetX  :Number;
var moving  :Boolean  = false;
var smooth  :Number  = 0.30;  
var mouseIsUp :Boolean  = true;

btn_1.addEventListener(MouseEvent.CLICK, page_Gliss_1);

function page_Gliss_1(e:MouseEvent):void {

addChild(clipGliss_1);

}

btn_2.addEventListener(MouseEvent.CLICK, page_Gliss_2);

function page_Gliss_2(e:MouseEvent):void {

addChild(clipGliss_2);

}

for (var i:int=0 ; i < max_tab_pages ; i++){

tab_pages[i].addEventListener(MouseEvent.MOUSE_DOWN,onDown);
tab_pages[i].x = 0;

}

function onDown(e:MouseEvent):void{

offsetX = tab_pages[i].mouseX;
startX = mouseX;
moving = true;
mouseIsUp = false;

if(!hasEventListener(Event.ENTER_FRAME))addEventListener(Event.ENTER_FRAME,update);
stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.addEventListener(MouseEvent.MOUSE_UP,onUp);

}

function onUp(e:MouseEvent):void{

mouseIsUp = true;
var dx:Number = mouseX - startX;

if( dx < -distMin){
  currentStep -= step;
  if(currentStep < min) currentStep = min;

}else if(dx > distMin){
  currentStep += step;

  if(currentStep > max) currentStep = max;
}

nextX = currentStep;
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);

}

function onMove(e:MouseEvent):void{

  nextX = mouseX - offsetX;

  if(tab_pages[i].x > 20){
 
   moving = false;
   tab_pages[i].x = 0;
 
  }

  else if (tab_pages[i].x < -620){
   moving = false;
   tab_pages[i].x = -600;

  }
}

function update(e:Event):void{

if(moving){
  tab_pages[i].x -= (tab_pages[i].x - nextX) * smooth;

  if(mouseIsUp && Math.abs(tab_pages[i].x - nextX) < 1){
   tab_pages[i].x = nextX;
   moving = false;
   removeEventListener(Event.ENTER_FRAME,update);
  }
}
}
 


#5 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 03 February 2018 - 19:11 PM

Il doit te donner le numéro de la ligne où se trouve l'erreur ?

as-tu créé une classe comme ceci :

package com.display
{
        import flash.display.MovieClip;
 
        public class MyClip extends MovieClip
        {
                public var currentStep :Number  = this.x;
         
                ...
        }
}

et cocher la case "Expoter pour actionscript" dans les propriétés de ton MovieClip, puis modifier la classe de base "flash.display.MovieClip" par "com.display.MyClip"

ça sera plus simple par la suite

#6 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 03 February 2018 - 19:37 PM

Salut,
Désolé mais je n'ais pas appris à coder de cette façon, j'ai toujours codé directement dans les Flas, donc là je suis un peu pommé.

#7 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 00:11 AM

Tu crées dans le dossier où se trouve ton fla un dossier "com", dedans tu crées un dossier "display", dedans tu crées un fichier "MyClip.as".
ensuite tu colles le code que je t'ai donné.
par exemple pour accéder à currentStep pour chaque clip que tu utilises dans ton fla
tab_pages[i].currentStep

si tu places ton code de départ dans cette classe, ça devrait fonctionner sans avoir besoin d'utiliser de boucles, il faudra remplacer "page_slider" par "this"

#8 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 10:23 AM

Bonjour,
J'avance pas à pas mais ce n'est pas encore ça, pour le moment je pense avoir bien suivi tes explications.

J'ai crée un fichier "MyClip.as" avec ce script:

package com.display  {

import com.display.MyClip;

public class MyClip extends MovieClip {

public function MyClip() {

public var currentStep :Number  = this.x;

this.x = 0;

var currentStep :Number  = this.x;
var step  :Number  = 330;  
var max   :Number  = 0;
var min   :Number  = -660;  
var distMin  :Number  = 15;    
var nextX  :Number  = currentStep;
var startX  :Number;
var offsetX  :Number;
var moving  :Boolean  = false;
var smooth  :Number  = 0.30;  
var mouseIsUp :Boolean  = true;

this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
function onDown(e:MouseEvent):void{

offsetX = this.mouseX;
startX = mouseX;
moving = true;
mouseIsUp = false;

if(!hasEventListener(Event.ENTER_FRAME))addEventListener(Event.ENTER_FRAME,update);
stage.addEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.addEventListener(MouseEvent.MOUSE_UP,onUp);

}

function onUp(e:MouseEvent):void{

mouseIsUp = true;
var dx:Number = mouseX - startX;

if( dx < -distMin){
  currentStep -= step;
  if(currentStep < min) currentStep = min;

}else if(dx > distMin){
  currentStep += step;

  if(currentStep > max) currentStep = max;
}

nextX = currentStep;
stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMove);
stage.removeEventListener(MouseEvent.MOUSE_UP,onUp);

}
function onMove(e:MouseEvent):void{

  nextX = mouseX - offsetX;
}

function update(e:Event):void{

if(moving){
  this.x -= (this.x - nextX) * smooth;

  if(mouseIsUp && Math.abs(this.x - nextX) < 1){
   this.x = nextX;
   moving = false;
   removeEventListener(Event.ENTER_FRAME,update);
  }
}
}
}
}

}
  }
}
}
 

Dans les propriétés de mes 2 clips à importés j'ai modifié la classe de base "flash.display.MovieClip" par "com.display.MyClip", la case "Expoter pour actionscript" est déjà cochée puisque c'était la métode utilisé à l'origine avec les noms de classe: "ClipGliss_1" et "ClipGliss_2".

Pour le moment j'ai ces messages d'erreur:
1017 : La définition de la classe de base MovieClip est introuvable.
5000 : La classe 'com.display.MyClip' doit être une sous-classe de 'flash.display.MovieClip', puisqu'elle est liée à un symbole de bibliothèque du type correspondant

#9 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 11:01 AM

tu as bien créé les 2 dossiers "com" et "display" dans "com" ?

il faudrait voir l'arborescence de ton projet (dossiers et fichiers), il y a un pb, il ne trouve pas la classe

#10 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 11:57 AM

pas sur d'avoir compris, j'ai un dossier "com" dans lequel j'ai mis un dossier "display" dans lequel j'ai mon fichier "MyClip.as".comme tu me la expliqué plus haut.

#11 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 12:06 PM

Dans la propriété de ma scène j'ai un emplacement Classe, j'ai collé: "com.display.MyClip" et je n'ai plus que le message d'erreur: 1114 : L'attribut public ne peut être utilisé que dans un package.

#12 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 12:44 PM

Ce n'est pas bon, fais une copie écran de ton explorateur de fichiers au niveau de ton projet.

#13 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 13:19 PM

voilà

Fichier(s) joint(s)



#14 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 13:29 PM

Le fla, il est où ?

#15 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 13:32 PM

Dans le dossier "Slider Test"

#16 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 14:27 PM

J'ai tout refait depuis le debut mais je ne vois pas, je joint éventuellement le Fla si ça peut aider à trouver ou j'ai fait une erreur.

Fichier(s) joint(s)



#17 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 14:31 PM

Joint une version allégée de ton dossier dans un zip pour tester

#18 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 16:11 PM

Regarde dans les propriétés actionscript, il doit falloir renter un chemin de type "."

#19 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 17:19 PM

Désolé je ne vois pas du tout où ça ce situe, et peut tu me dire si l'ensemble de mon dossier "Fla" que j'ai joint en zip plus haut est correct.

#20 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 18:35 PM

Regarde si dans Fichier > Paramètres avancés d'ActionScript 3.0 > onglet chemin source > il y a un dossier nommé "."

au début de ta classe il y a une erreur, c'est "import flash.display.MovieClip;" et non "import com.display.MyClip;", on va étendre

flash.display.MovieClip



#21 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 04 February 2018 - 19:51 PM

Alors j'ai vérifié il y a bien un onglet dans chemin source avec un dossier nommé "." il faut que je rentre "com.display.MyClip" ? sinon j'ai corrigé "import flash.display.MovieClip;"

#22 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 04 February 2018 - 20:42 PM

Non, le point c'est bon, il ne faut rien toucher.

il faut juste remplacer dans ta classe "import com.display.MyClip;" par "import flash.display.MovieClip;"


ça drevrait corriger cette erreur

Citation

1017 : La définition de la classe de base MovieClip est introuvable.

5000 : La classe 'com.display.MyClip' doit être une sous-classe de 'flash.display.MovieClip', puisqu'elle est liée à un symbole de bibliothèque du type correspondant


j'ai remis en forme ton code

package com.display
{
  import flash.display.MovieClip;
 
  public class MyClip extends MovieClip
  {
    public var currentStep: Number;
    public var step: Number = 330;
    public var max: Number = 0;
    public var min: Number = -660;
    public var distMin: Number = 15;
    public var nextX: Number;
    public var startX: Number;
    public var offsetX: Number;
    public var moving: Boolean = false;
    public var smooth: Number = 0.30;
    public var mouseIsUp: Boolean = true;
   
    public function MyClip()
    {
          this.x = 0;
          currentStep = this.x;
          nextX = currentStep;
          this.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
    }
   
    public function onDown(e: MouseEvent): void
    {
          offsetX = this.mouseX;
          startX = mouseX;
          moving = true;
          mouseIsUp = false;
          if (!hasEventListener(Event.ENTER_FRAME)) addEventListener(Event.ENTER_FRAME, update);
          stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
          stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
    }
   
    public function onUp(e: MouseEvent): void
    {
          mouseIsUp = true;
          var dx: Number = mouseX - startX;
          if (dx < -distMin)
          {
            currentStep -= step;
            if (currentStep < min) currentStep = min;
          }
          else if (dx > distMin)
          {
            currentStep += step;
            if (currentStep > max) currentStep = max;
          }
          nextX = currentStep;
          stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
          stage.removeEventListener(MouseEvent.MOUSE_UP, onUp);
    }
   
    public function onMove(e: MouseEvent): void
    {
          nextX = mouseX - offsetX;
    }
   
    public function update(e: Event): void
    {
          if (moving)
          {
            this.x -= (this.x - nextX) * smooth;
            if (mouseIsUp && Math.abs(this.x - nextX) < 1)
            {
                  this.x = nextX;
                  moving = false;
                  removeEventListener(Event.ENTER_FRAME, update);
            }
          }
    }
  }
}


#23 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 05 February 2018 - 22:40 PM

Salut pol2095,
Merci dêtre encore sur mon post, j'ai remplacé le code que tu as corrigé, cette fois je n'ais plus d'erreurs de compilation, mais une fenêtre d'erreur au lancement (voir capture) et au final ça me fait planter Flash.

Fichier(s) joint(s)



#24 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 05 February 2018 - 23:11 PM

c'est bizarre, une erreur à la ligne 97, mais la classe ne fait pas 97 lignes ?

#25 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 06 February 2018 - 07:17 AM

Même réflexion , je vais refaire une nouvelle maquette en repartant de zéro.

#26 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 06 February 2018 - 09:37 AM

Tu dois avoir du code qui traine sur la frame1 dans ton MovieCip peut-être ?

#27 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 06 February 2018 - 19:32 PM

Ok, C'est effectivement le code en frame 1 pour importer les clips qui est la cause du problème et que j'avais pour le coup ignoré étant canalisé sur la création du package.
Pour l'import des clips 1 et 2 qui à mon avis est pour moi pertinent puisqu'ils sont reliés à une même classe et devrais alors être tel quel mais j'imagine que ce serait trop facile, tu peux m'expliquer la marche à suivre pour importer et utiliser les clips ? merci.

var clipGliss_1 :ClipGliss_1  = new  ClipGliss_1();
var clipGliss_2 :ClipGliss_2  = new  ClipGliss_2();

btn_1.addEventListener(MouseEvent.CLICK, page_Gliss_1);
function page_Gliss_1(e:MouseEvent):void {
addChild(clipGliss_1);

}
btn_2.addEventListener(MouseEvent.CLICK, page_Gliss_2);
function page_Gliss_2(e:MouseEvent):void {
addChild(clipGliss_2);

}
 


#28 pol2095

  • Members
  • PipPipPipPipPipPipPipPip
  • 1736 messages

Posté 06 February 2018 - 20:28 PM

ça doit fonctionner avec ton code tel quel

peut-être des soucis avec mouseX qui sera relatif à ton clip et non au stage, à vérifier

#29 cortoh

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 399 messages

Posté 13 February 2018 - 19:10 PM

Bonjour,
Pas réussi à faire fonctionner le fla, je n'ai toujours pas trouvé d'où venait le problème, du coup je me suis retranché sur un simple Drag and Drop, merci tout de même pour le temps passé à m'aider et si un membre du forum trouve une solution je reste preneur. ;-)



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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP