Forums Développement Multimédia

Aller au contenu

Passage d'un script de rotation3d avec la souris sur un clip de AS2 en AS3

CODE 3D

8 réponses à ce sujet

#1 pbena

    Ceinture Orange

  • Members
  • PipPipPip
  • 40 messages

Posté 21 August 2015 - 15:36 PM

Bonjour,
Tous est dis dans le sujet. J'avais trouvé sur ce forum un script AS2 qui simulait la rotation 3d d'un objet avec la souris en se déplaçant dans les images du clip (images faites au prélable avec 3dsmax, poser, ...etc). Bref, j'utilise et "j'abuse" de ce cet excellent script depuis quelques années et j'aimerais le convertir en AS3 (langage dans lequel je débute ... oui j'ai traîné pour m'y mettre).

Le code an AS2 qui fonctionne : (pour un clip qui se nomme "table", qui a une largeur de 460 et comporte 31 images)

var appuye = false;
var monPoint:MovieClip = this.createEmptyMovieClip("monPoint", this.getNextHighestDepth());
monPoint.startDrag(true,0,10,460,20);
monPoint.onMouseMove = function() {
trace(monPoint._x);
};
table.onPress = function() {
appuye = true;
table.onMouseMove = function() {
  abscisse = Math.abs(Math.ceil(monPoint._x*31/460));
  table.gotoAndStop(abscisse+1);
  if (appuye == false) {
   delete this.onMouseMove;
  }
};
};
table.onRelease = function() {
appuye = false;
};
table.onReleaseOutside = function() {
appuye = false;
};
 

Mon "tout début d'ébauche de tentative" en AS3 :

var appuye = false;
var monPoint:MovieClip = new MovieClip();
addChild(monPoint);
monPoint.addEventListener(MouseEvent.MOUSE_MOVE, sedeplace);
var zoneDeplacement:Rectangle = new Rectangle(0, 10, 460, 20);
function sedeplace(event:MouseEvent):void {
monPoint.startDrag(true,zoneDeplacement);
trace(monPoint.x);
}
 

... voilà...le trace ne fonctionne pas.
De l'aide ?
Merci d'avance.

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6940 messages

Posté 22 August 2015 - 15:44 PM

Bonjour,

Une base de départ, a toi de terminer :


var appuye:Boolean = false;
var monPoint:MovieClip = new MovieClip();
var abscisse:Number = 0;
addChild(monPoint);

monPoint.startDrag(true, 0, 10, 460, 20);
monPoint.addEventListener(MouseEvent.MOUSE_MOVE, moveMouse);
table.addEventListener(MouseEvent.CLICK, tableClick);
table.addEventListener(MouseEvent.MOUSE_MOVE, tableMouse);

function mouseMove() {
    trace(monPoint.x);
}

function tableClick() {
    appuye = true;
};

function tableMouse() {
    abscisse = Math.abs(Math.ceil(monPoint.x * 31 / 460));
    table.gotoAndStop(abscisse+1);
    if (appuye == false) {
        table.removeEventListener(MouseEvent.MOUSE_MOVE, tableMouse);    
    }
};
 

Je te recommande de t'aider de la doc de Flash pour comprendre pourquoi les choses sont écrite de telle ou telle façon.

#3 pbena

    Ceinture Orange

  • Members
  • PipPipPip
  • 40 messages

Posté 23 August 2015 - 08:51 AM

Merci pour ta réponse..
- J'ai corrigé le startDrag(true, 0, 10, 460, 20); en startDrag(true,zoneDeplacement); ...
- j'ai corrigé la petite erreur de frappe "moveMouse" et "mouseMove"


- il reste une erreur qui me donne plein de fois en sortie : ""ArgumentError: Error #1063: Non-correspondance du nombre d'arguments sur test04_fla::MainTimeline/tableMouse(). 0 prévu(s), 1 détecté(s)."

Une idée ? (et merci encore pour ton aide)

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6940 messages

Posté 24 August 2015 - 08:44 AM

Salut,

Effectivement, erreur de ma part, j'ai oublié que les fonctions avaient besoin d'un argument quand elles sont liées à un écouteur :


function mouseMove(event){
// ton code
}
 


#5 pbena

    Ceinture Orange

  • Members
  • PipPipPip
  • 40 messages

Posté 24 August 2015 - 14:41 PM

J'ai corrigé ... voilà mon code complet actuel :

var appuye:Boolean = false;
var monPoint:MovieClip = new MovieClip();
var abscisse:Number = 0;
var zoneDeplacement:Rectangle = new Rectangle(0, 10, 460, 20);
addChild(monPoint);

monPoint.addEventListener(MouseEvent.MOUSE_DOWN, sedeplace);
monPoint.addEventListener(MouseEvent.MOUSE_MOVE, moveMouse);
table.addEventListener(MouseEvent.CLICK, tableClick);
table.addEventListener(MouseEvent.MOUSE_MOVE, tableMouse);
function sedeplace(event:MouseEvent):void {
monPoint.startDrag(true,zoneDeplacement);
}
function moveMouse(event:MouseEvent):void {
        trace(monPoint.x);
}
function tableClick(event:MouseEvent):void {
        appuye = true;
};
function tableMouse(event:MouseEvent):void {
        abscisse = Math.abs(Math.ceil(monPoint.x * 31 / 460));
        table.gotoAndStop(abscisse+1);
        if (appuye == false) {
                table.removeEventListener(MouseEvent.MOUSE_MOVE, tableMouse);  
        }
}
 

Rien ne se passe .... le trace(monPoint.x); ne donne toujours rien et le clip ne bouge pas. Par contre plus de messages d'erreur. Je progresse ?

Je joint mon .fla au cas où ...

Fichier(s) joint(s)

  • Fichier joint  test04.fla   240.36 Ko   1 téléchargement(s)


#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6940 messages

Posté 24 August 2015 - 21:31 PM

Re,

Ton programme ne marche pas car ton point "monPoint" est un clip vide, placé en (0,0) et que tu place tes écouteurs dessus.
Du coup on ne peut pas "survoler" le point qui a une taille de 0,0 a une position de 0,0 ...
Remplace la création du clip vide par un clip que tu pose sur ta scène (comme la table) et donne lui le nom d'occurence "monPoint".
Par la suite regarde du côté de la création de clips dynamique (avec le code).

#7 pbena

    Ceinture Orange

  • Members
  • PipPipPip
  • 40 messages

Posté 25 August 2015 - 07:46 AM

Bon ... je suis reparti de zéro et j'ai quasiment trouvé et c'est beaucoup plus simple :

var totalImage:uint = anim.totalFrames;
anim.buttonMode=true;
anim.addEventListener(MouseEvent.MOUSE_DOWN, click);
function click (evenement:Event):void{
anim.addEventListener(MouseEvent.MOUSE_MOVE,animation);
function animation (evenement:Event):void{
var NumeroImageActive:uint = Math.ceil((mouseX-anim.x)*totalImage/anim.width)-3;
anim.gotoAndStop(NumeroImageActive);
trace (NumeroImageActive);
}
}

anim.addEventListener(MouseEvent.MOUSE_UP, relache);
function relache (evenement:Event):void{
anim.removeEventListener(MouseEvent.MOUSE_DOWN, click);
}
 

Le code fonctionne, l'anim se fait en cliquant avec la souris ... sauf qu'en relachant le clic, le Mouse_move est toujours actif.

Une idée ?

Fichier(s) joint(s)

  • Fichier joint  test05.fla   239.67 Ko   6 téléchargement(s)


#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 August 2015 - 10:28 AM

Accroche ton écouteur de mouseUp sur le stage. C'est une pratique plus sûre car en fonction de tes actions et de la position du pointeur l'événement MouseUp n'est pas obligatoirement distribué par l'objet qui a distribué le mouseDown…
En plus, je pense que l'écouteur que tu veux ôter n'est pas le mouseDown mais le mouseMove…

stage(MouseEvent.MOUSE_UP, relache);
function relache (evenement:Event):void{
   anim.removeEventListener(MouseEvent.MOUSE_MOVE, click);
}


#9 pbena

    Ceinture Orange

  • Members
  • PipPipPip
  • 40 messages

Posté 25 August 2015 - 12:49 PM

Super .. ça fonctionne... merci beaucoup !!!



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