Redimensionner et tourner un clip a l'aide des fleches

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 575 fois - Téléchargée 16 fois

Contenu du snippet

soit un clip sur la scene que l'on peut deplacer avec la souris. On peut egalement avec les fleches du clavier le faire tourner et le redimensionner.

Source / Exemple :


import flash.geom.Transform;
import flash.geom.Matrix;

plasrou_mc.onPress = function() {
	this.startDrag(false);
};
plasrou_mc.onRelease = function() {
	this.stopDrag();
};
var num:Number = new Number();
var numleft = -5;
var numright = 5;
var nume = 1;
var compta:Number = 0;
var comptb:Number = 0;
var comptc:Number = 0;
var comptd:Number = 0;

var mouseListener:Object = new Object();
mouseListener.onMouseUp = function():Void  {
	if (plasrou_mc.hitTest(_xmouse, _ymouse)) {
		
		var posxrect = plasrou_mc._x;
		var posyrect = plasrou_mc._y;
		
		var keyListener:Object = new Object();
		keyListener.onKeyDown = function() {
			var tourneMatrix:Matrix = new Matrix();
			var translateMatrix:Matrix = new Matrix();
			var neo:Transform = new Transform(plasrou_mc);
			var echelleMatrix:Matrix = new Matrix();
			
			if (Key.isDown(Key.LEFT)) {
				compta = 1;
				if ((compta != comptc) && (compta != comptd)) {
					numleft = numleft-5;
					num = numleft+numright;
					tourneMatrix.rotate(num*Math.PI/180);
					translateMatrix.translate(posxrect,posyrect);
					tourneMatrix.concat(translateMatrix);
					dadaMatrix = tourneMatrix.clone();
				} else {
					numleft = numleft-5;
					num = numleft+numright;
					tourneMatrix.rotate(num*Math.PI/180);
					translateMatrix.translate(posxrect,posyrect);
					tourneMatrix.concat(translateMatrix);
					dadaMatrix = tourneMatrix.clone();
					tourneMatrix.concat(dodoMatrix);
					tourneMatrix.tx = posxrect;
					tourneMatrix.ty = posyrect;
				}
				neo.matrix = tourneMatrix;
				
			} else if (Key.isDown(Key.RIGHT)) {
				comptb = 1;
				if ((comptb != comptc) && (comptb != comptd)) {
					numright = numright+5;
					num = numright+numleft;
					tourneMatrix.rotate(num*Math.PI/180);
					translateMatrix.translate(posxrect,posyrect);
					tourneMatrix.concat(translateMatrix);
					dadaMatrix = tourneMatrix.clone();
				} else {
					numright = numright+5;
					num = numright+numleft;
					tourneMatrix.rotate(num*Math.PI/180);
					translateMatrix.translate(posxrect,posyrect);
					tourneMatrix.concat(translateMatrix);
					dadaMatrix = tourneMatrix.clone();
					tourneMatrix.concat(dodoMatrix);
					tourneMatrix.tx = posxrect;
					tourneMatrix.ty = posyrect;
				}
				neo.matrix = tourneMatrix;

			} else if (Key.isDown(Key.UP)) {
				comptc = 1;
				if ((comptc != compta) && (comptc != comptb)) {
					nume = nume+0.1;
					echelleMatrix.scale(nume,nume);
					translateMatrix.translate(posxrect,posyrect);
					echelleMatrix.concat(translateMatrix);
					dodoMatrix = echelleMatrix.clone();
				} else {
					nume = nume+0.1;
					echelleMatrix.scale(nume,nume);
					translateMatrix.translate(posxrect,posyrect);
					echelleMatrix.concat(translateMatrix);
					dodoMatrix = echelleMatrix.clone();
					echelleMatrix.concat(dadaMatrix);
					echelleMatrix.tx = posxrect;
					echelleMatrix.ty = posyrect;
				}
				neo.matrix = echelleMatrix;
				
			} else if (Key.isDown(Key.DOWN)) {
				comptd = 1;
				if ((comptd != compta) && (comptd != comptb)) {
					nume = nume-0.1;
					echelleMatrix.scale(nume,nume);
					translateMatrix.translate(posxrect,posyrect);
					echelleMatrix.concat(translateMatrix);
					dodoMatrix = echelleMatrix.clone();
				} else {
					nume = nume-0.1;
					echelleMatrix.scale(nume,nume);
					translateMatrix.translate(posxrect,posyrect);
					echelleMatrix.concat(translateMatrix);
					dodoMatrix = echelleMatrix.clone();
					echelleMatrix.concat(dadaMatrix);
					echelleMatrix.tx = posxrect;
					echelleMatrix.ty = posyrect;
				}
				neo.matrix = echelleMatrix;
			}
		};
		Key.addListener(keyListener);
	}
}
Mouse.addListener(mouseListener);

Conclusion :


Si quelqu'un a un code plus compact je suis preneur.

A voir également

Ajouter un commentaire

Commentaires

otomat
Messages postés
21
Date d'inscription
lundi 24 septembre 2007
Statut
Membre
Dernière intervention
30 janvier 2010
-
bah alors la j'avoue ne pas avoir le niveau m'autorisant a juger d'esthetique en ce qui concerne la programmation.
Ton code est simple, complet et efficace:adopté. La variable de stockage est vraiment une bonne idee dont je prends note. Ca devrait pouvoir me simplifier pas mal de choses.
Merci Slagt
Slagt
Messages postés
236
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
29 mars 2011
-
J'aurais pas fait exactement comme ça, mais ton truc marche bien. Quoi que je trouve ça plutot moche de déclarer un keyListener dans un mouseListener, mais bon, les goûts et les couleurs...

Dans le code qui suit, il faut placer sur la scène un clip "monMc".
Ensuite, tu peux rajouter autant de clip que tu veux, ça marchera, du moment que tu leur attribue le même onPress et le même onRelease, le dernier clip sur lequel tu as cliqué étant stocké dans la variable CLIP.

==================
var CLIP:MovieClip;
monMc.onPress = function ()
{
CLIP = this;
startDrag (CLIP, false);
}

monMc.onRelease = function ()
{
stopDrag();
}

var EC:Object = new Object();
EC.onKeyDown = function ()
{
if (!CLIP)
return;

if (Key.isDown(Key.LEFT))
{
CLIP._rotation -= 5;
}
else if (Key.isDown(Key.RIGHT))
{
CLIP._rotation += 5;
}

if (Key.isDown(Key.UP))
{
CLIP._xscale += 10;
CLIP._yscale = CLIP._xscale;
}
else if (Key.isDown(Key.DOWN))
{
CLIP._xscale -= 10; CLIP._yscale CLIP._xscale Math.max(0, CLIP._xscale);
}
}
Key.addListener (EC);
==================

J'ai rajouté le code empêchant d'avoir un _xscale/_yscale négatif.
otomat
Messages postés
21
Date d'inscription
lundi 24 septembre 2007
Statut
Membre
Dernière intervention
30 janvier 2010
-
c'est nickel Slagt
voici le code pour le gars ou la gazesse qui comme moi aurait mal lu la notice, on peut y rajouter une condition pour eviter la symetrie lorsque num devient negatif :
plasrou_mc.onPress = function() {
this.startDrag(false);
};
plasrou_mc.onRelease = function() {
this.stopDrag();
};
var num:Number = 100

var mouseListener:Object = new Object();
mouseListener.onMouseUp = function():Void {
if (plasrou_mc.hitTest(_xmouse, _ymouse)) {
var keyListener:Object = new Object();
keyListener.onKeyDown = function() {

if (Key.isDown(Key.LEFT)) {
plasrou_mc._rotation -= 5;
} else if (Key.isDown(Key.RIGHT)) {
plasrou_mc._rotation += 5;
} else if (Key.isDown(Key.UP)) {
num += 10
plasrou_mc._xscale = num;
plasrou_mc._yscale = num;
trace(plasrou_mc._width);
trace(plasrou_mc._height);
} else if (Key.isDown(Key.DOWN)) {
num -= 10
plasrou_mc._xscale = num;
plasrou_mc._yscale = num;
}
};
}
Key.addListener(keyListener);
};
Mouse.addListener(mouseListener);
otomat
Messages postés
21
Date d'inscription
lundi 24 septembre 2007
Statut
Membre
Dernière intervention
30 janvier 2010
-
Merci Slagt.
Je vais essayer avec _xscale et _yscale et si ca marche, tant mieux. Apparament ca devrait le faire vu que ces instruction sont en pourcentage.
C'est d'ailleurs un peu pour cette raison que j'avais publie cette source, ca me semblait un peu trop b... et j'avais aucun retour sur le forum. En attendant, j'ai appris quelques trucs sur l'utilisation de matrix.
Bref mieux vaut bien relire la notice et trouver la bonne instruction avant de se lancer.
Slagt
Messages postés
236
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
29 mars 2011
-
Nan nan, utilise PAS _width et _height ! Le moins possible en fait !

Pour toi, y a quelque chose de beaucoup mieux, c'est _xscale et _yscale. L'avantage, c'est que ce nombre peut être négatif, et inverse la forme dans ce cas. L'autre avantage, c'est que tu n'as pas besoin de calculer le rapport à chaque fois entre les largeur et hauteur. Si tu veux diviser par deux la taille, tu mets _xscale et _yscale à 50. Tout simplement (50%).

Si tu veux faire une symétrie horizontale, tu mets _xscale à -100.

Voilà le genre de truc qu'on peut faire :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.