bonjour a tous !!

Je viens solliciter vos lumières, j'ai récupéré ce carrousel sur un tuto (très bien fait d'ailleurs Smiley biggrin ) et je m'arrache les cheveux pour :

1 - Le faire tourner "par défaut" sans avoir de système type rollover
2 - Supprimer un espace trop grand entre 2 images

Smiley bawling

Voici le fichier AS :

var rotX:Number = 200;
var rotY:Number = 20;
var Centre:Number = Stage.height/2;
var vitesse:Number = 0.01;
var sceneW:Number =Stage.width;
var sceneH:Number = Stage.height;
var nbI:Number=10;
var angle:Number=1;
var i:Number;

var l, id:Number;
var msg, urls:Array;
var txtY=(sceneH-infoTxt.height);

this.createTextField("infoTxt",10,0,sceneH-30,sceneW,25);
infoTxt.multiline = false;
infoTxt.wordWrap = true;
var my_fmt:TextFormat = new TextFormat();
my_fmt.color = 0xFFFFFF;
my_fmt.align = 'center';
my_fmt.size = 20;
infoTxt.setTextFormat(my_fmt);


msg = [
'premier message (ic 1)',
'premier message (ic 2)',
'premier message (ic 3)',
'premier message (ic 4)',
'premier message (ic 5)',
'premier message (ic 6)',
'premier message (ic 7)',
'premier message (ic 8)',
'premier message (ic 9)'
]
urls = [
'http://www.xez.net',
'http://google.fr',
'http://www.xez.net',
'http://www.xez.net',
'http://google.fr',
'http://weecast.fr',
'http://www.xez.net',
'http://google.fr',
'http://www.xez.net'
]
for(i=0;i<nbI;i++)
{

this.attachMovie('Icone'+i,'Ic'+i,i);

this['Ic'+i].onRelease=function()
{
l = Number(String(this).length);
id = Number(String(this).substr(l-1,l-1));
var idURL=id;
id+=2;
_root.gotoAndStop(id);
trace('id : '+id + 'frame : '+ _root._currentframe);
//getURL(idURL,'_blank');
}

this['Ic'+i].onRollOver = function():Void
{
var l2 = Number(String(this).length);
var id2 = Number(String(this).substr(l2-1,l2-1));
if(String(this) === '_level0.Ic'+id2)
{
infoTxt.text = String(msg Smiley id2 );
infoTxt.setTextFormat(my_fmt);
}
}

this['Ic'+i]._y = sceneH /2;
}
onEnterFrame=function(){



if (rotY <= -5) {
rotY = -5
}
else if (rotY >= 50) {
rotY = 50;
}

if (angle > (2*Math.PI))
{
angle = 0;
}else{
for(i=0; i<nbI; i++){

this['Ic'+i]._x = rotX* Math.cos(angle+2* Math.PI*i/nbI)+sceneW/2;

this['Ic'+i]._y = rotY* Math.sin(angle + 2* Math.PI* i/nbI) + sceneH/2;

this['Ic'+i]._xscale=60/2*(Math.sin(angle+2*Math.PI*i/nbI)+ 1)+50;
this['Ic'+i]._yscale=this['Ic'+i]._xscale;

this['Ic'+i].swapDepths(rotX*Math.sin(angle+2*Math.PI*i/nbI));
}
if(this._xmouse < (sceneW/2+rotX+200) && this._xmouse > (sceneW/2-rotX-200))
{
if(this._ymouse < sceneH && this._ymouse > 0)
{
angle=angle+(this._xmouse-sceneW/2)/sceneH* vitesse;
}
}
}
}

D'avance merci !!! Smiley lol
Ca fait un moment que j'ai pas touché à l'AS, mais je vais essayer de te guider :

if(this._xmouse < (sceneW/2+rotX+200) && this._xmouse > (sceneW/2-rotX-200))
{
	if(this._ymouse < sceneH && this._ymouse > 0)
	{
		angle=angle+(this._xmouse-sceneW/2)/sceneH* vitesse;
	}
}
C'est ici qu'est géré la rotation, basée sur la position du curseur.
A toi de modifier ça de manière à ce que ça se fasse automatiquement, et en boucle (c'est un problème d'algo, ça. Smiley cligne ).

Pour ce qui est de l'écart :
this['Ic'+i]._x = rotX* Math.cos(angle+2* Math.PI*i/nbI)+sceneW/2;
this['Ic'+i]._y = rotY* Math.sin(angle + 2* Math.PI* i/nbI) + sceneH/2;
Tu dois modifier ces valeurs. A priori c'est quelque chose du style : rotX/Y * {-1 : 1} + milieuDeLaScene. Ce serait donc rotX et rotY qui définissent la place de chaque élément par rapport à la scène, et donc par conséquent, les espacements.

Bon courage. Smiley lol
Modifié par phpdoesnotcare (26 Apr 2010 - 16:38)
Hello,

Pour la rotation automatique, le code me laisse penser que c'est déjà le cas...
Pour l'espacement tu ne peux pas faire grand chose car défini par le nombre d'éléments cependant tu peux diminuer le rayon du carroussel en jouant avec RotX ce qui pourra peut être te convenir...

Voilou Smiley cligne
Merci pour votre appui,

j'ai résolu une partie du problème pour que le carrousel tourne de façon régulière en modifiant :
angle=angle+(this._xmouse-sceneW/2)/sceneH* vitesse;
par angle += .003;;

mais il faut quand même que la souris passe dessus pour le déclencher.

Quant au espaces il sont réguliers enter chaque image hormis avant la première (ou après la dernière)... Smiley bawling
Bah c'est ce que je t'ai dit. La rotation se base sur la position du curseur. A toi de faire en sorte qu'elle ne se base plus sur ça, mais sur une variable à toi, qui sera modifiée au fur et à mesure de la rotation, et qui reviendra à sa valeur initiale pour commencer un "nouveau tour" (avec un modulo, par exemple).

Pour les espacements... un petit screenshot peut-être ?
au temps pour moi ^^

voici les screenshots
le 1er avec l'espacement "normal" upload/29169-espace-ok.jpg
et le 2nd correspondant à une image supp" upload/29169-espace-x10.jpg
tu sais si je post ici c'est que je demande de l'aide et que si je demande de l'aide c'est que je ne sais pas...

Mais merci pour ces pistes
Modifié par Everyways (27 Apr 2010 - 14:03)
J'essaie simplement de te guider, parce que d'une : j'ai d'autres choses à faire à côté, et de deux : là c'est plus un problème de maths qu'autre chose, et sans pouvoir tester ton code n'ayant pas Flash sous la main, c'est difficile de te dire comment régler ton problème.

Tout ce que je peux faire, c'est de te proposer de faire des tests. Essaie de faire varier un peu les valeurs que je t'ai pointées dans mon premier post, càd rotX et rotY, à priori. Essaie de voir ce que ça donne si tu les remplaces par rotX/2 et rotY/2, etc.

--- édit -----
phpdoesnotcare a écrit :
j'ai d'autres choses à faire à côté
Juste pour être bien clair : j'ai dit ça parce que je ne peux pas me permettre de passer 100% de mon temps sur des problèmes tels que le tien, et non parce que je juge que j'ai mieux à faire (sinon je ne serais pas sur ce forum). Smiley cligne
Modifié par phpdoesnotcare (27 Apr 2010 - 14:14)
pas de soucis ^^
Bon, j'ai dû ruser en décalant un peux mes images et du coup l'espace n'est plus visible. Smiley lol
@Everyways : Tu devrais aller sur un forum spécialisé comme mediabox, tu trouveras une meilleure aide car alsacréations n'est pas spécialisé dans l'AS mais à froid le code ci-dessous devrait t'aider Smiley smile

@phpdoesnotcare : je te trouve bien désagréable sur l'ensemble de ce post.

a écrit :
Comment ça pourrait être une rotation automatique alors qu'elle se base clairement sur la position du curseur ?


A l'exécution du swf, la propriété _xmouse retourne une valeur qui sera rafraichit au moment du survol du curseur sur le player flash, aussi _xmouse est donc défini dans la ligne qui gère la rotation et associé au gestionnaire onEnterFrame nous avons donc bien une rotation dès le lancement du script ...
angle=angle+(this._xmouse-sceneW/2)/sceneH* vitesse;


Cependant et autant pour moi, je n'avais pas vu la condition qui bloquait l'exécution de cette rotation, alors on peut faire ça par exemple...


if(!autorun){
        angle+=0.5; // tu mets ta valeur car celle-ci va être un peu rapide
        autorun=1;
}
else{
if(this._xmouse < (sceneW/2+rotX+200) && this._xmouse > (sceneW/2-rotX-200))
{
if(this._ymouse < sceneH && this._ymouse > 0)
{
angle=angle+(this._xmouse-sceneW/2)/sceneH* vitesse;
}
}
}


Voilou Smiley cligne

Edit: N'hésite à modifier les variables en début de script avec rotx tu diminueras le rayon, mais pense également à modifier le nombre d'images avec nbI, c'est important, les autres variables sont suffisamment parlantes Smiley cligne
Modifié par AspiGeek (27 Apr 2010 - 19:58)
Je ne cherchais pas à être désagréable. C'est juste que ça m'a vraiment étonné que tu dises ça alors que pour moi ça sautait aux yeux que la rotation était due à la position du curseur.
Bref, désolé si ça t'a paru déplaisant.
En fait c'était plutôt le "j'ai autre chose à faire" adressé à notre ami Everyways qui m'a fait réagir...mais passons Smiley cligne

Concernant mon premier post je maintiens ce que j'ai dit, l'animation devrait tourner dès le début, la rotation automatique n'est pas lié au curseur (sinon ce n'est plus automatique hein).

Comme expliqué précédemment _xmouse est défini lors du lancement du swf même si on a pas encore survolé le carroussel, la valeur sera fausse mais elle permet de passer la condition

if(this._xmouse < (sceneW/2+rotX+200) && this._xmouse > (sceneW/2-rotX-200)) 


et de faire tourner
angle=angle+(this._xmouse-sceneW/2)/sceneH* vitesse;


La position du curseur est juste là pour faire varier le sens et le pas de rotation, en aucun cas c'est lui qui gère la rotation automatique.

Si maintenant _xmouse ne retourne pas de valeur à l'appel du player (pour une raison qui m'échappe complètement) ma petite variable drapeau défini dans mon dernier post devrait résoudre le problème mais pas besoin de math Smiley cligne

Voilou

Edit: @phpdoestnotcare => le problème c'est que tu te focalises sur la rotation dynamique qui elle s'appuie sur les valeurs du curseurs évidemment, mais pour faire tourner un carroussel en autonome on n'en a pas besoin Smiley smile
Modifié par AspiGeek (28 Apr 2010 - 12:25)
phpdoesnotcare a écrit :
Juste pour être bien clair : j'ai dit ça parce que je ne peux pas me permettre de passer 100% de mon temps sur des problèmes tels que le tien, et non parce que je juge que j'ai mieux à faire (sinon je ne serais pas sur ce forum). Smiley cligne
Je m'étais expliqué pour éviter ce genre de malentendu, quand même. Smiley ohwell