begin process at 2012 02 04 12:29:54
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

ActionScripts

 > 3 ZOOMS DIFFERENTS D'UN SPRITE AVEC LA MOLETTE [AS3]

3 ZOOMS DIFFERENTS D'UN SPRITE AVEC LA MOLETTE [AS3]


 Information sur la source

Note :
Aucune note
Catégorie :ActionScripts Classé sous :zoom, molette, déplacement, as3 Niveau :Débutant Date de création :14/05/2009 Date de mise à jour :17/05/2009 15:18:00 Vu / téléchargé :4 773 / 599

Auteur : nextdrOp

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

MAJ :
Vu les premiers commentaires, j'ai hésité à retirer mon message... qui n'avait pas vraiment été lu.
Bref, afin de proposer un truc plus complet, voici une petite mise à jour qui ne correspond plus à ma problématique, mais qui donne une petite présentation de 3 fonctions de zoom à la molette sur un sprite
- zoom classique avec la propriété scaleX et scaleY
- zoom à partir du centre du sprite
- zoom par rapport à la position du curseur par rapport au sprite, point intéressant puisque il faut bien faire attention à être dans le même système de coordonnées !

Ne faisant pas de flash, il doit certainement me manquer des éléments faisant partie de la "philosophie Flash" (utilisation de stage à la place ? pas trop regarder à quoi cela servait, par exemple).

ps: j'étais parti sur l'utilisation de addChildAt afin de pouvoir importer un SWF contenant des boutons et de le mettre sous le SWF principal, tout en accordant la propagation des événements souris à ce SWF avec "conteneur.mouseChildren = true;"

edit: le but étant d'obtenir un zoom sur le curseur comme la plupart des outils de CAO

MESSAGE DE DEPART :
Ma problématique de départ :
Avoir un plan sous Illustrator où certaines formes devaient pouvoir être cliquable, et accessoirement, pouvoir se déplacer de manière intuitive dans le plan.

C'est ce second point que je présente ici.
La solution mise en place consiste à utiliser 3 fichiers SWF, de dimensions identiques :
- un conteneur
- le fichier SWF de l'exportation pour le web à partir d'Illustrator, moins les formes devant être cliquables
- le fichier SWF sous Flash réalisé avec un copier/coller (sur place, pour conserver le positionnement) des zones devant être cliquables. Ces formes ont été converties en bouton, avec un Listener à base de switch sur le nom des instances de boutons.

Bref, je ne présente que la source du conteneur pour le moment (par manque de temps).

Source

  • import flash.display.Sprite;
  • import flash.events.MouseEvent;
  • stop();
  • //
  • // Création d'un Sprite conteneur
  • // Création d'un Sprite rectangle afin de pouvoir tout le temps déplacé le sprite conteneur
  • //
  • var conteneur:Sprite = new Sprite();
  • conteneur.name = "conteneur";
  • this.addChild(conteneur);
  • var rect:Sprite = new Sprite();
  • rect.graphics.beginFill(0xF0F0F0);
  • rect.graphics.drawRect(0,0,842,595);
  • rect.buttonMode = false; // afin de garder le curseur de la souris et non la main
  • //
  • // Chargement des logos
  • //
  • var request_FK:URLRequest = new URLRequest("logoflash.png");
  • var logoFK:Loader = new Loader();
  • logoFK.load(request_FK);
  • var request_CS:URLRequest = new URLRequest("logocs.png");
  • var logoCS:Loader = new Loader();
  • logoCS.load(request_CS);
  • var request_VB:URLRequest = new URLRequest("logovb.png");
  • var logoVB:Loader = new Loader();
  • logoVB.load(request_VB);
  • var request_ASP:URLRequest = new URLRequest("logoasp.png");
  • var logoASP:Loader = new Loader();
  • logoASP.load(request_ASP);
  • var request_CPP:URLRequest = new URLRequest("logocpp.png");
  • var logoCPP:Loader = new Loader();
  • logoCPP.load(request_CPP);
  • var request_CFM:URLRequest = new URLRequest("logoCFM.png");
  • var logoCFM:Loader = new Loader();
  • logoCFM.load(request_CFM);
  • //
  • // Ajout des éléments au Sprite conteneur
  • //
  • conteneur.addChildAt(rect,0);
  • conteneur.addChildAt(logoFK,1);
  • conteneur.addChildAt(logoCS,2);
  • conteneur.addChildAt(logoVB,3);
  • conteneur.addChildAt(logoASP,4);
  • conteneur.addChildAt(logoCPP,5);
  • conteneur.addChildAt(logoCFM,6);
  • //
  • // Positionnement des logos
  • //
  • logoCS.x = 240; logoCS.y = 0;
  • logoVB.x = 480; logoVB.y = 0;
  • logoASP.x = 0; logoASP.y = 90;
  • logoCPP.x = 240; logoCPP.y = 90;
  • logoCFM.x = 480; logoCFM.y = 90;
  • //
  • // Cacher le menu de base afin de ne pas avoir la possibilité de zoomer sur le flash lui-même !
  • //
  • var menu:ContextMenu = new ContextMenu();
  • menu.hideBuiltInItems();
  • conteneur.contextMenu = menu;
  • //
  • // Définition des variables, temporaires ou non
  • //
  • var tempX = conteneur.x; // position du point de transformation avant redimensionnement
  • var tempY = conteneur.y; // position du point de transformation avant redimensionnement
  • var tempW = conteneur.width; // largeur du conteneur avant redimensionnement
  • var tempH = conteneur.height; // hauteur du conteneur avant redimensionnement
  • var resultW = conteneur.width; // largeur obtenue par le redimensionnement
  • var resultH = conteneur.height; // hauteur obtenue par le redimensionnement
  • var ratio = 1.1; // définition du ratio fixe pour le zoom
  • // Attention : il est valable sur les dimensions d'origine du sprite conteneur
  • //
  • // Gestion des événements souris afin de déplacer/zoomer le conteneur
  • //
  • conteneur.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
  • function mouseDown(event:MouseEvent):void {
  • conteneur.startDrag();
  • }
  • conteneur.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
  • function mouseReleased(event:MouseEvent):void {
  • conteneur.stopDrag();
  • // Puisque l'utilisateur a déplacé le conteneur, il faut redéfinir la position du point de transformation (l'angle supérieur gauche)
  • tempX = conteneur.x;
  • tempY = conteneur.y;
  • }
  • conteneur.addEventListener(MouseEvent.MOUSE_WHEEL, zoomCentre);
  • function zoom(e:MouseEvent):void
  • {
  • if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
  • {
  • conteneur.scaleX *= 1.1;
  • conteneur.scaleY *= 1.1;
  • }
  • else //delta < 0 lorsque la molette va vers l'arrière : agrandissement
  • {
  • conteneur.scaleX /= 1.1;
  • conteneur.scaleY /= 1.1;
  • }
  • }
  • function zoomCentre(e:MouseEvent):void // Zoom sur le centre du conteneur, quelque soit sa position
  • {
  • if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
  • {
  • conteneur.width /= ratio;
  • conteneur.height /= ratio;
  • }
  • else //delta < 0 lorsque la molette va vers l'arrière : agrandissement
  • {
  • conteneur.width *= ratio;
  • conteneur.height *= ratio;
  • }
  • conteneur.x += (tempW-conteneur.width)/2;
  • conteneur.y += (tempH-conteneur.height)/2;
  • tempX = conteneur.x;
  • tempY = conteneur.y;
  • tempW = conteneur.width;
  • tempH = conteneur.height;
  • }
  • function zoomCurseur(e:MouseEvent):void // Zoom sur la position du curseur, quelque soit la position du conteneur
  • {
  • if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
  • {
  • conteneur.width /= ratio;
  • conteneur.height /= ratio;
  • }
  • else //delta < 0 lorsque la molette va vers l'arriere : agrandissement
  • {
  • conteneur.width *= ratio;
  • conteneur.height *= ratio;
  • }
  • conteneur.x += (tempW-conteneur.width)/(tempW/(conteneur.parent.mouseX-tempX));
  • conteneur.y += (tempH-conteneur.height)/(tempH/(conteneur.parent.mouseY-tempY));
  • tempX = conteneur.x;
  • tempY = conteneur.y;
  • tempW = conteneur.width;
  • tempH = conteneur.height;
  • }
import flash.display.Sprite;
import flash.events.MouseEvent;

stop();

//
//	Création d'un Sprite conteneur
//	Création d'un Sprite rectangle afin de pouvoir tout le temps déplacé le sprite conteneur
//
var conteneur:Sprite = new Sprite();
conteneur.name = "conteneur";
this.addChild(conteneur);

var rect:Sprite = new Sprite();
rect.graphics.beginFill(0xF0F0F0);
rect.graphics.drawRect(0,0,842,595);
rect.buttonMode = false;	// afin de garder le curseur de la souris et non la main

//
//	Chargement des logos
//
var request_FK:URLRequest = new URLRequest("logoflash.png");
var logoFK:Loader = new Loader();
logoFK.load(request_FK);

var request_CS:URLRequest = new URLRequest("logocs.png");
var logoCS:Loader = new Loader();
logoCS.load(request_CS);

var request_VB:URLRequest = new URLRequest("logovb.png");
var logoVB:Loader = new Loader();
logoVB.load(request_VB);

var request_ASP:URLRequest = new URLRequest("logoasp.png");
var logoASP:Loader = new Loader();
logoASP.load(request_ASP);

var request_CPP:URLRequest = new URLRequest("logocpp.png");
var logoCPP:Loader = new Loader();
logoCPP.load(request_CPP);

var request_CFM:URLRequest = new URLRequest("logoCFM.png");
var logoCFM:Loader = new Loader();
logoCFM.load(request_CFM);

//
//	Ajout des éléments au Sprite conteneur
//
conteneur.addChildAt(rect,0);
conteneur.addChildAt(logoFK,1);
conteneur.addChildAt(logoCS,2);
conteneur.addChildAt(logoVB,3);
conteneur.addChildAt(logoASP,4);
conteneur.addChildAt(logoCPP,5);
conteneur.addChildAt(logoCFM,6);

//
//	Positionnement des logos
//
logoCS.x = 240; logoCS.y = 0;
logoVB.x = 480; logoVB.y = 0;
logoASP.x = 0; logoASP.y = 90;
logoCPP.x = 240; logoCPP.y = 90;
logoCFM.x = 480; logoCFM.y = 90;

//
//	Cacher le menu de base afin de ne pas avoir la possibilité de zoomer sur le flash lui-même !
//
var menu:ContextMenu = new ContextMenu();
menu.hideBuiltInItems();
conteneur.contextMenu = menu;

//
//	Définition des variables, temporaires ou non
//
var tempX = conteneur.x;		// position du point de transformation avant redimensionnement
var tempY = conteneur.y;		// position du point de transformation avant redimensionnement
var tempW = conteneur.width;	// largeur du conteneur avant redimensionnement
var tempH = conteneur.height;	// hauteur du conteneur avant redimensionnement
var resultW = conteneur.width;	// largeur obtenue par le redimensionnement
var resultH = conteneur.height;	// hauteur obtenue par le redimensionnement
var ratio = 1.1;				// définition du ratio fixe pour le zoom
								// Attention : il est valable sur les dimensions d'origine du sprite conteneur


//
//	Gestion des événements souris afin de déplacer/zoomer le conteneur
//
conteneur.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
function mouseDown(event:MouseEvent):void {
	conteneur.startDrag();
}

conteneur.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
function mouseReleased(event:MouseEvent):void {
    conteneur.stopDrag();
	// Puisque l'utilisateur a déplacé le conteneur, il faut redéfinir la position du point de transformation (l'angle supérieur gauche)
	tempX = conteneur.x;
	tempY = conteneur.y;
}

conteneur.addEventListener(MouseEvent.MOUSE_WHEEL, zoomCentre);
function zoom(e:MouseEvent):void
{
	if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
	{
		conteneur.scaleX *= 1.1;
		conteneur.scaleY *= 1.1;
	}
	else //delta < 0 lorsque la molette va vers l'arrière : agrandissement
	{
		conteneur.scaleX /= 1.1;
		conteneur.scaleY /= 1.1;
	}
}
function zoomCentre(e:MouseEvent):void // Zoom sur le centre du conteneur, quelque soit sa position
{
	if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
	{
		conteneur.width /= ratio;
		conteneur.height /= ratio;
	}
	else //delta < 0 lorsque la molette va vers l'arrière : agrandissement
	{
		conteneur.width *= ratio;
		conteneur.height *= ratio;
	}
	conteneur.x += (tempW-conteneur.width)/2;
	conteneur.y += (tempH-conteneur.height)/2;
	tempX = conteneur.x;
	tempY = conteneur.y;
	tempW = conteneur.width;
	tempH = conteneur.height;
}

function zoomCurseur(e:MouseEvent):void // Zoom sur la position du curseur, quelque soit la position du conteneur
{
	if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
	{
		conteneur.width /= ratio;
		conteneur.height /= ratio;
	}
	else //delta < 0 lorsque la molette va vers l'arriere : agrandissement
	{
		conteneur.width *= ratio;
		conteneur.height *= ratio;
	}
	conteneur.x += (tempW-conteneur.width)/(tempW/(conteneur.parent.mouseX-tempX));
	conteneur.y += (tempH-conteneur.height)/(tempH/(conteneur.parent.mouseY-tempY));
	tempX = conteneur.x;
	tempY = conteneur.y;
	tempW = conteneur.width;
	tempH = conteneur.height;
}

 Conclusion

A faire :
- définir des limites
- définir des niveaux de zoom (si besoin)
- réaliser une autre fonction zoomExtraSoft qui aura des transitions fluides sur les étapes de MouseEvent.MOUSE_WHEEL

A comprendre :
- pourquoi sous MacOS X.5 avec Safari ou Firefox et une mighty mouse, cela ne fonctionne pas de tout...

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

17 mai 2009 15:07:54 :
Source complète et modifiée pour correspondre à une explication des zooms et non à la réponse à ma problématique.
17 mai 2009 15:18:04 :
- changement du titre - explication du zoom sur le curseur, cela permet d'obtenir un zoom comme dans la plupart des outils de CAO

 Sources de la même categorie

Source avec Zip ZOOM SUR UNE IMAGE par yasdar
Source avec Zip Source avec une capture UN PEU DE MATH par yasdar
Source avec Zip Source avec une capture PARTICULE SYSTEM par yasdar
Source avec Zip Source avec une capture GALLERIE PHOTO AVEC XML par yasdar
Source avec Zip Source avec une capture MP3 LAYER NICE &SMALL par yasdar

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture AS3 - PRINCIPE ET APPLICATION DE FONCTION RÉCURSIVE par pegase31
Source avec Zip ZOOM SUR UNE IMAGE par yasdar
Source avec Zip Source avec une capture UN PEU DE MATH par yasdar
Source avec Zip Source avec une capture AS3 - JEU DU TAQUIN par pegase31
Source avec Zip Source avec une capture AS3 - SIMULATION DE GRILLE D'ÉDITION par pegase31

Commentaires et avis

Commentaire de pegase31 le 14/05/2009 21:10:33 administrateur CS

Questions : c'est quoi cette source, à quoi sert-elle et pourquoi ne pas l'avoir mise complète directement ?

Peg'

Commentaire de civodul70 le 15/05/2009 09:55:21

Pourquoi cette source ??
Aucun intérêt....

Commentaire de pegase31 le 15/05/2009 16:39:06 administrateur CS

Il serait bon d'étoffer un peu cette "source" avec au moins un fla et qui fonctionne, car sinon je vais devoir la supprimer en attendant d'avoir une version complète ..

Peg'

Commentaire de nextdrOp le 15/05/2009 17:03:44

Pas de soucis Peg.

Fais comme bon te semble. Comme j'ai utilisé d'autres sources qui répondait à la recherche "zoom molette", et que cela m'avait permis de m'aiguiller, je pensais que cela était sympa de partager en retour.

Maintenant, je n'ai pas fait ce bout de code pour le plaisir, mais pour mon travail, qui ne consiste absolument à toucher au flash d'habitude. J'ai commencé la rédaction des fichiers épurée des noms en rapport avec notre client, mais le temps me manque. Je travaille dans l'événementiel. Notre rythme est... rapide. Voir trop.

Pour vous faire patientez jusqu'à ce week end : http://www.dparchi.com/salons/64eCOEC/64eCOEC.swf

Merci pour ta compréhension.

Commentaire de nextdrOp le 15/05/2009 17:05:12

Sachant que le seul intérêt de ce bout de code réside dans la formule de math afin de faire un zoom par rapport à la position du curseur. Est-ce que sa place est ici ou sur le forum ? Je ne sais répondre à cette question.

Commentaire de stefbuet le 19/05/2009 22:30:49

Salut,

l'évenement MOUSE_WHEEL ne marche pas sous MAC.
Il faut donc lui fournir une alternative, par exemple en utilisant les touches up & down.

Stef.

Commentaire de xyzizback le 14/07/2009 19:31:56

Salut nextdrOp
Je suis complètement novice en action script.
Ton script va (peut-être) me permettre de zoomer/dézoomer un sprite au passage de la souris, en as3.
Par contre j'ai remarqué que ton script ne démarre QUE si l'utilisateur effectue un CLIQUE sur la fenêtre/le document flash. Le changement de taille au départ pas accessible, est-ce que tu sais pourquoi?

nCha

Commentaire de xyzizback le 14/07/2009 20:14:19

Encore moi
:-)

Je suis toujours sur ton code, j'ai modifié comme suit:

"
import flash.display.Sprite;
import flash.filters.BitmapFilterQuality;
import flash.filters.BlurFilter;
import flash.events.MouseEvent;

stop();

//
// Création d'un Sprite conteneur
//
var conteneur:Sprite = new Sprite();
conteneur.name = "conteneur";
this.addChild(conteneur);
conteneur.buttonMode = true; // afin d'avoir la main et nom la flèche

//
// Chargement du logos
//
var request_FK:URLRequest = new URLRequest("logoflash.png");
var logoFK:Loader = new Loader();
logoFK.load(request_FK);

//
// Ajout de l'éléments au Sprite conteneur
//
conteneur.addChildAt(logoFK,0);

//
// Positionnement du logos
//
logoFK.x = (this.stage.stageWidth-logoFK.width)/2; logoFK.y = (this.stage.stageHeight-logoFK.height)/2;
trace("   taille de mon image= "+logoFK.width+" * "+logoFK.height);
trace("   taille du conteneur= "+conteneur.width+" * "+conteneur.height);
trace("   taille du document flash= "+this.stage.stageWidth+" * "+this.stage.stageHeight);

//
// Définition des variables, temporaires ou non
//
var tempX = logoFK.x; // position du point de transformation avant redimensionnement
var tempY = logoFK.y; // position du point de transformation avant redimensionnement
var tempW = logoFK.width; // largeur du sprite avant redimensionnement
var tempH = logoFK.height; // hauteur du sprite avant redimensionnement
var resultW = logoFK.width; // largeur obtenue par le redimensionnement
var resultH = logoFK.height; // hauteur obtenue par le redimensionnement
var ratio = 1.1; // définition du ratio fixe pour le zoom
// Attention : il est valable sur les dimensions d'origine du sprite conteneur


//
// Gestion des événements souris afin de déplacer/zoomer le conteneur
//
logoFK.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
function mouseDown(event:MouseEvent):void {
// application du filtre au rectangle.
var blur:BlurFilter = new BlurFilter();
blur.blurX = 10;
blur.blurY = 10;
blur.quality = BitmapFilterQuality.MEDIUM;
logoFK.filters = [blur];

}

logoFK.addEventListener(MouseEvent.MOUSE_UP, mouseReleased);
function mouseReleased(event:MouseEvent):void {
var cartoonSmartURL:URLRequest = new URLRequest("http://www.cartoonsmart.com");
navigateToURL( cartoonSmartURL , "_blank");
}

logoFK.addEventListener(MouseEvent.MOUSE_WHEEL, zoomCentre);
function zoomCentre(e:MouseEvent):void // Zoom sur le centre du conteneur, quelque soit sa position
{
if (e.delta > 0) //delta > 0 lorsque la molette va vers l'avant : réduction
{
logoFK.width /= ratio;
logoFK.height /= ratio;
}
else //delta < 0 lorsque la molette va vers l'arrière : agrandissement
{
logoFK.width *= ratio;
logoFK.height *= ratio;
}
logoFK.x += (tempW-logoFK.width)/2;
logoFK.y += (tempH-logoFK.height)/2;
tempX = logoFK.x;
tempY = logoFK.y;
tempW = logoFK.width;
tempH = logoFK.height;
}
"

ça fonctionne bien, cad le sprite apparaît centré puis est zoomable/dézoomable, a condition que
1) l'utilisateur clique sur une partie vide du document flash
2) l'utilisateur actionne la molette de la souris au dessus du sprite
??????
Qui plus est, les traces me renvoient des valeurs de 0 pour logoFK.width, logoFK.height, conteneur.width, conteneur.height
??????

J'veux bien un peu d'aide là svp, je sèche

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

problème lors de l'enregistrement ou déplacement du projet, erreur 1014 [ par tom099 ] Bonjour à tous et toutes!petit soucis incompréhensible : je télécharge régulièrement des sources à droite à gauche que j'étudie par la suiteje suis pa Zoom sur map + déplacement [ par grunge_1 ] Salut a vous tous! Je fait un site en temps que stagière pour un zonning industriel et c'est la première foi que je bricole quelque choses avec action Déplacement / Zoom dans une scène [ par foruma ] Bonjour !Je n'arrive pas à trouver comment faire pour fabriquer la navigation de mon site.Je suis nul en AS et je ne trouve rien que je ne comprend su Zoom/dézoom avec déplacement et variateur [ par cesarion ] C'est encore moi et ma carte ...Tout d'abord, je suis content, mon zoom et mon d&#233;placement sur la carte fonctionne (si si voir : http: Molette de la souris en as3 [ par aerial9 ] Bonjour à tous, Je vous expose mon problème : Pour un jeux flash, je voudrais pouvoir utiliser la molette de la souris. Si possible, pourriez-vous me AS3 comment écouter plusieurs mc [ par coolyao ] Bonjour, Je suis débutant en as3 et j'aimerais réaliser un petit jeux sans prétention. Mais même sans prétention je bute sur le code. Je m'explique. AS3 Enregistrement d'images d'un diaporama [ par prodf ] Bonjour, voilà, j'ai chercher partout en pensant que ma question était récurrente mais apparemment non, voilà je souhaiterais proposer aux visiteurs l [AS3] Mask avec 2 background [ par ichigoZ710 ] Bonjour, ma question est simple, est-ce qu'en actionscript 3 il est possible de faire un masque avec 2 backgrounds ? Le premier serait un background c controle temporelle des videos dynamiques AS3 [ par aerial9 ] Salut à tous, je sollicite une nouvelle fois votre précieuse aide. J'ai besoin de faire avancer ou reculer la lecture d'une vidéo dynamique selon un é As3 This[] pour un sous objet [ par solage ] Bonjour, Je reviens de nouveau pour un problème avec "this[]". Je n'arrive pas à appeler dynamiquement un sous objet... exemple: objet1.objetDedans1.x


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales