RECTANGLE DE SELECTION

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 - 16 juil. 2005 à 12:51
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010 - 24 août 2005 à 00:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32732-rectangle-de-selection

BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
24 août 2005 à 00:32
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
18 juil. 2005 à 18:15
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
18 juil. 2005 à 18:07
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
18 juil. 2005 à 17:39
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
18 juil. 2005 à 17:31
"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.
cs_apokalypse Messages postés 4 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 18 juillet 2005
18 juil. 2005 à 16:55
Bon j'ai modifié mais j'ai pas recopié le code de top30 étant donné que j'aurai jamais pu coder comme ça...donc pour une version améliorée se référer au code de top30! ;)
a+
Prouprou_Sensei Messages postés 517 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 24 octobre 2006 1
18 juil. 2005 à 13:49
apokalypse fait attention tu as ajouté le updateAfterEvent mais pas comme il le fallait, ta version ne fonctionne pas, car il faut que le clip soit lui-meme l'ecouteur pour les evenements comme a fait top30 !

A tchao !
cs_apokalypse Messages postés 4 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 18 juillet 2005
18 juil. 2005 à 13:35
Merci beaucoup top30 mais ca sert à rien de s'enerver! ;)
5/10 --> c'est plutôt bien pour une première source! ;)
a+
Prouprou_Sensei Messages postés 517 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 24 octobre 2006 1
18 juil. 2005 à 12:50
D'accord ce qu'il fallait preciser c'est que le updateAfterEvent ne fonctionne qui si le clip est lui meme l'ecouteur de l'evenement.

Merci top30!

A tchao !
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
18 juil. 2005 à 12:18
Bon je vais vous faire simple. Coller ceci dans un anim à 1 image seconde :

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 () ;
}
}

// L'écouteur EST le clip de sélection. Pas besoin d 'autre object !!!
Mouse.addListener ( leClip );
};
}
SelectionRectangular ( this, "0xFF6600", "0xFF0000", 5 );

C'est FLUIDE !!!!!

De plus IL FAUT BIEN REPLACERle clip à chaque instant. N'oublier pas que son script doit être réutilisable. Par conséquent on pourrait avoir un clip SOUS la sélection et un autre SUR, des clips pouvant être créer à tout instant. Il faut bien que la sélection soit TOUJOURS ou en DESSOUS ou au DESSUS ( le cas de cet exemple ), et donc replacer le clip à la bonne profondeur à chaque instant.

Voilà j'espeère que ca éclairera la lanterne de certain...
5/10] car ca méritait certaines améliorations.

A plus.
Prouprou_Sensei Messages postés 517 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 24 octobre 2006 1
18 juil. 2005 à 00:54
En tout cas ici ca ne fonctionne pas... SI ? Parceque j'ai l'impression que le message de top30 etait un "si ca fonctionne !" déguisé ;) ...
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
17 juil. 2005 à 23:03
slt,

updateAfterEvent() force l'actualisation de l'affichage à l'écran entre deux images.

comme l'annoçait colin Moock, l'intégration de cette fonction aux evénements sur la classe Mouse à été réalisée avec la version 7 du flash player. (peut être même la version 6.40)

http://livedocs.macromedia.com/flash/mx2004/main_7_2/00001870.html

"This function works only with certain Mouse and MovieClip handlers: the mouseDown, mouseUp, mouseMove, keyDown and keyUp handlers for the Mouse class; the onMouseMove, onMouseDown, onMouseUp, onKeyDown, and onKeyUp handlers for the MovieClip class. It does not work with the Key class."

@++
cs_apokalypse Messages postés 4 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 18 juillet 2005
17 juil. 2005 à 22:52
Bon ce débat est fort interessant mais en ma qualité de newbie en programmation j'aimerai un plus d'information en ce qui concerne ce updateAfterEvent(). J'ai beau lire la doc, je comprends pas à quoi ça sert...
Prouprou_Sensei Messages postés 517 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 24 octobre 2006 1
17 juil. 2005 à 22:32
Hé bien justement je suis supris que le updateAfterEvent ne change rien...
top30 Messages postés 1158 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 6 août 2010
17 juil. 2005 à 21:05
C'est BananaTree qui a raison !
Passe ton anim en 8 images secondes et vous serez surpris !
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
16 juil. 2005 à 20:54
dsl, j'oubliais que chez macromedia c'était des cons :

http://livedocs.macromedia.com/flash/mx2004/main_7_2/00001479.html

@++
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
16 juil. 2005 à 20:49
merci prouprou, il me semblait bien que ça ne passait pas dans ce cas .... mais ça confirme !;)

Peg'
Prouprou_Sensei Messages postés 517 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 24 octobre 2006 1
16 juil. 2005 à 20:44
Le updateAfterEvent() est inutile ici :
Flash ignore les appels à updateAfterEvent qui ne sont pas dans un gestionnaire onClipEvent() ou qui ne font pas partie d'une fonction ou d'une méthode transmise à setInterval().

A tchao !
BananaTree Messages postés 337 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 2 novembre 2010
16 juil. 2005 à 19:09
slt,

"Pas mal, mais en plus de 12 img/sec, ça aurait été encore mieux ...."

pensez à utiliser updateAfterEvent :
ecouteur.onMouseMove = function() {
if (clic) {
with (_root.rectSelect) {
clear();
beginFill(couleurFond, alphaFond);
lineStyle(epaisseurContour, couleurContour, alphaContour);
moveTo(xMouse, yMouse);
lineTo(xMouse, _root._ymouse);
lineTo(_root._xmouse, _root._ymouse);
lineTo(_root._xmouse, yMouse);
lineTo(xMouse, yMouse);
endFill();
}
}
updateAfterEvent();
};

@+ et bon code.
cs_apokalypse Messages postés 4 Date d'inscription jeudi 2 décembre 2004 Statut Membre Dernière intervention 18 juillet 2005
16 juil. 2005 à 15:36
Merci pour ces précieux conseils, j'ai modifié le code en conséquence. Pour ce qui est du nom de la fonction c'était juste pour être clair quand à l'usage que l'on peut faire de cette dernière. :)
Prouprou_Sensei Messages postés 517 Date d'inscription mardi 23 décembre 2003 Statut Membre Dernière intervention 24 octobre 2006 1
16 juil. 2005 à 15:18
Salut!
Sympa comme code, mais c'est vraix que le createEmptyMovieClip a chaque mouseMove est inutile, il suffit d'utiliser clear() et de creer le clip une fois au premier clique de la souris, ou meme a l'apel de la fonction.
Dans le genre:

function RectangleSelection(profondeur, couleurFond, alphaFond, couleurContour, alphaContour, epaisseurContour) {
_root.createEmptyMovieClip("rectSelect", profondeur);
ecouteur = new Object();
Mouse.addListener(ecouteur);
ecouteur.onMouseDown = function() {
xMouse = _root._xmouse;
yMouse = _root._ymouse;
clic = true;
};
ecouteur.onMouseUp = function() {
_root.rectSelect.clear();
clic = false;
};
ecouteur.onMouseMove = function() {
if (clic) {
with (_root.rectSelect) {
clear();
beginFill(couleurFond, alphaFond);
lineStyle(epaisseurContour, couleurContour, alphaContour);
moveTo(xMouse, yMouse);
lineTo(xMouse, _root._ymouse);
lineTo(_root._xmouse, _root._ymouse);
lineTo(_root._xmouse, yMouse);
lineTo(xMouse, yMouse);
endFill();
}
}
};
}
RectangleSelection(1, "0x00FF00", 10, "0x00FF00", 100, 1);
cs_michto Messages postés 79 Date d'inscription dimanche 26 octobre 2003 Statut Membre Dernière intervention 11 août 2005
16 juil. 2005 à 13:04
'lut
Bon exemple de fonction avec paramétres. Trés clair, trés bien. Un p'tit conseil de rien du tout : quand tu teste un booléen (clip) tu peux directement ecrire if(clip) et if(!clip). C'est rien mais ça fait toujours une petite opération en moins ;). Et puis je ne sais absolument pas si ça change quelquechose, mais tu recrées ton mc à chaque mouvement de souris ?? Des avis sur le sujet ?

Sinon, tu appelle ta fonction "RectangleSelection". "RectangleDessiner" ou un nom dans le genre conviendrai mieux (Y a pas vraiment de selection :). Les coordonnées du rectangle dessiné pourrais être la selection par exemple...)

Ciao. Bonne continuation.
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
16 juil. 2005 à 12:51
Pas mal, mais en plus de 12 img/sec, ça aurait été encore mieux ....

Peg'
Rejoignez-nous