Rectangle de selection

Soyez le premier à donner votre avis sur cette source.

Vue 5 228 fois - Téléchargée 664 fois

Description

Une fonction simple qui permet de créer un rectangle de selection facilement paramétrable. la fonction dessine un clip rectSelect sur la scène et se paramètre comme ceci:
RectangleSelection(profondeur, couleurFond, alphaFond, couleurContour, alphaContour, epaisseurContour)
Cliquez, glissez, relachez!:)

Source / Exemple :


function RectangleSelection(level, couleurFond, couleurContour, alphaFond, alphaContour, epaisseurContour) {
	if (!level["rectSelect"]) {
		var leClip = level.createEmptyMovieClip("rectSelect", level.getNextHighestDepth());
		leClip.couleurFond = couleurFond;
		leClip.couleurContour = couleurContour;
		leClip.alphaFond = alphaFond;
		leClip.alphaContour = alphaContour;
		leClip.epaisseurContour = epaisseurContour;
		leClip.onMouseDown = function() {
			this._x = _root._xmouse;
			this._y = _root._ymouse;
			this.click = true;
		};
		leClip.onMouseUp = function() {
			this.clear();
			this.click = false;
		};
		leClip.onMouseMove = function() {
			if (this.click) {
				var maxDepth = this._parent.getNextHighestDepth();
				this.clear();
				this.beginFill(this.couleurFond, this.alphaFond);
				this.lineStyle(this.epaisseurContour, this.couleurContour, this.alphaContour);
				this.moveTo(0, 0);
				this.lineTo(0, this._ymouse);
				this.lineTo(this._xmouse, this._ymouse);
				this.lineTo(this._xmouse, 0);
				this.lineTo(0, 0);
				this.endFill();
				this.swapDepths(maxDepth);
			}
			updateAfterEvent();
		};
	}
}
RectangleSelection(this, "0x00FF00", "0x00FF00", 10, 100, 1);

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010

pour ceux que ça amuse j'ai fais ce truc pour tester une de mes classes (http://www.bananatree.fr/swing/) :
//-------
import org.flashapi.swing.draw.DashedLines;
var grayDottedLine:Object = {width:0.5, height:0.5, color:0x000000, alpha:100, delay:1.5};
function drawSelectArea(clip, initX, initY) {
clip.onMouseMove = function() {
this.clear();
DashedLines.drawRectangle([initX, initY], [this._xmouse, this._ymouse], this, grayDottedLine);
updateAfterEvent();
};
clip.onMouseUp = function(idInterval) {
clearInterval (selectRect);
delete clip.onMouseMove;
this.clear();
};
}
this.onMouseDown = function() {
var initX = this._xmouse;
var initY = this._ymouse;
_global.selectRect = setInterval(drawSelectArea, 10, this, initX, initY);
};
//----

@+ et bon code
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010

Convaincu et bien vu =D
J'avais oublié que l'écouteur était un "moviClip" et non un "object" ( alors que ce fut mon conseil !!! ) et par conséquent qu'il possédait un Event "onMouseMove"...

PS :
Allez voir cette source ca pourrait aider les plus "pointus" :
http://www.flashkod.com/code.aspx?ID=32775
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010

Persiste et signe ;)

essaye plutot ça ( pour que le rafraichissement ne tiennent plus compte de l'état enfoncé) :

function SelectionRectangular(level, couleurFond, couleurContour, alphaDivision) {
// Si le clip de sélection n'existe pas...
if (!level["__selectionMC__"]) {
// Le créer à la plus haute profondeur.
var leClip = level.createEmptyMovieClip("__selectionMC__", level.getNextHighestDepth());
// On mémorise les couleurs
leClip.background = couleurFond;
leClip.border = couleurContour;
leClip.alpha = alphaDivision;
// Au click enfoncé
leClip.onMouseDown = function() {
this._x = _root._xmouse;
this._y = _root._ymouse;
this.click = true;
};
// Au click relaché
leClip.onMouseUp = function() {
this.clear();
this.click = false;
};
// Quand la souris bouge
leClip.onMouseMove = function() {
if (this.click) {
// La plus haute profondeur
var maxDepth = this._parent.getNextHighestDepth();
this.clear();
this.beginFill(this.background, 100/this.alpha);
this.lineStyle(0, this.border, 100);
this.moveTo(0, 0);
this.lineTo(0, this._ymouse);
this.lineTo(this._xmouse, this._ymouse);
this.lineTo(this._xmouse, 0);
this.lineTo(0, 0);
this.endFill();
this.swapDepths(maxDepth);
}
updateAfterEvent();
};
}
}
SelectionRectangular(this, "0xFF6600", "0xFF0000", 5);

@+ et bon code
top30
Messages postés
1158
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
6 août 2010

Sont tétus les jeunes !!!!
Si tu laisses ton code comme ceci, si tu charges un niveau, le niveau sera AU DESSUS de ta selection et tu ne pourras rien faire. Sauf peut être reprogrammer ta fonction comme je te l'ai dit avec le clip de destination comme paramètre...

De plus je m'ennerve pas, mais suis un grand adepte des points d'exclamations ( Et oui comme la vie !!! )

Bananatree, si tu fais sauter le "addListener(leClip)" en 1 image/seconde, tu perdras la fluidité. Tu devrais savoir que quand j'affirme, c est que j'ai testé ! ;D Teste le donc toi même...
BananaTree
Messages postés
337
Date d'inscription
vendredi 15 octobre 2004
Statut
Membre
Dernière intervention
2 novembre 2010

"il fallait preciser c'est que le updateAfterEvent ne fonctionne qui si le clip est lui meme l'ecouteur de l'evenement"

Certes.
Ce que je propose, c'est de supprimer cette ligne ;) :
Mouse.addListener ( leClip );

Par contre faites gaffes à un petit truc :
updateAfterEvent se comporte quasiment comme onEnterFrame. il convient donc de ne pas effectuer deux updateAfterEvent pour un même évènement (comme par exemple on peu faire appel par inatention à deux _root.onEnterFrame() placé à des endroits différents du scénario).

Sinon, gâre aux saccades ...

l'utilisation de setInterval et des évènements de souris permet d'éliminer toutes références à la fonction onEnterFrame. de fait, pour la fluidité, on n'est plus limité que par le taux de chargement du processeur.

comme me l'a fait remarqué top 30 en son temps : "j'ai du relire au moins 3 ou 4 fois la doc de flash..." .

alors n'hésitez pas à zieuter la livedoc de macromedia, même si elle est en anglais, c qd même ce qui se fait de mieux.

@+ et bon code.

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.