pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 2013
-
16 juil. 2005 à 12:51
BananaTree
Messages postés337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDerniè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.
BananaTree
Messages postés337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDerniè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és1158Date d'inscriptionvendredi 21 février 2003StatutMembreDerniè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"...
BananaTree
Messages postés337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDerniè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és1158Date d'inscriptionvendredi 21 février 2003StatutMembreDerniè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és337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDerniè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és4Date d'inscriptionjeudi 2 décembre 2004StatutMembreDernière intervention18 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és517Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention24 octobre 20061 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és4Date d'inscriptionjeudi 2 décembre 2004StatutMembreDernière intervention18 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és517Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention24 octobre 20061 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és1158Date d'inscriptionvendredi 21 février 2003StatutMembreDerniè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;
};
// 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és517Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention24 octobre 20061 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és337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDerniè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)
"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és4Date d'inscriptionjeudi 2 décembre 2004StatutMembreDernière intervention18 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és517Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention24 octobre 20061 17 juil. 2005 à 22:32
Hé bien justement je suis supris que le updateAfterEvent ne change rien...
top30
Messages postés1158Date d'inscriptionvendredi 21 février 2003StatutMembreDerniè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és337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 2 novembre 2010 16 juil. 2005 à 20:54
dsl, j'oubliais que chez macromedia c'était des cons :
pegase31
Messages postés6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 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és517Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention24 octobre 20061 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és337Date d'inscriptionvendredi 15 octobre 2004StatutMembreDerniè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 ...."
cs_apokalypse
Messages postés4Date d'inscriptionjeudi 2 décembre 2004StatutMembreDernière intervention18 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és517Date d'inscriptionmardi 23 décembre 2003StatutMembreDernière intervention24 octobre 20061 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:
cs_michto
Messages postés79Date d'inscriptiondimanche 26 octobre 2003StatutMembreDernière intervention11 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és6138Date d'inscriptiondimanche 21 décembre 2003StatutModérateurDernière intervention 4 septembre 201312 16 juil. 2005 à 12:51
Pas mal, mais en plus de 12 img/sec, ça aurait été encore mieux ....
24 août 2005 à 00:32
//-------
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
18 juil. 2005 à 18:15
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
18 juil. 2005 à 18:07
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
18 juil. 2005 à 17:39
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...
18 juil. 2005 à 17:31
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.
18 juil. 2005 à 16:55
a+
18 juil. 2005 à 13:49
A tchao !
18 juil. 2005 à 13:35
5/10 --> c'est plutôt bien pour une première source! ;)
a+
18 juil. 2005 à 12:50
Merci top30!
A tchao !
18 juil. 2005 à 12:18
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.
18 juil. 2005 à 00:54
17 juil. 2005 à 23:03
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."
@++
17 juil. 2005 à 22:52
17 juil. 2005 à 22:32
17 juil. 2005 à 21:05
Passe ton anim en 8 images secondes et vous serez surpris !
16 juil. 2005 à 20:54
http://livedocs.macromedia.com/flash/mx2004/main_7_2/00001479.html
@++
16 juil. 2005 à 20:49
Peg'
16 juil. 2005 à 20:44
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 !
16 juil. 2005 à 19:09
"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.
16 juil. 2005 à 15:36
16 juil. 2005 à 15:18
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);
16 juil. 2005 à 13:04
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.
16 juil. 2005 à 12:51
Peg'