Titre: soustraction de forme en as
Posté par: hacknours le le 29-09-2004 a 16:56:32
Bonjour à vous, Ma question est la suivante : Est-il possible de soustraire une forme (générée en action script) à une autre forme (elle aussi générée en action script) ?
Dans mon exemple, j'ai une montagne composée de quelques points et courbes à laquelle je voudrai soustraire un rond symbolisant le cratère dû à l'explosion d'un obus. En théorie c'est simple (comme d'habitude) mais je ne voit pas du tout comment le taper en script...
Une solution aurait été de rajouter des points et courbes à ma montagne en fonction de l'endroit de l'impact... Cà paraît compliqué à réaliser. Une autre solution aurait été de rajouter un rond sur un masque, mais la montagne est une forme générée en action script...
Pour l'instant j'ai simplement fait en sorte que l'explosion se termine par un rond de la même couleur que le fond. Cela donne l'impression d'un trou, mais en réalité la montagne est toujours là.
l'exemple est disponible à l'adresse suivante: http://www.geocities.com/laurencewest/tankgame.swf
mettez .fla pour avoir la source.
Merci. |
Titre: Re:soustraction de forme en as
Posté par: tavman le le 30-09-2004 a 13:59:21
Un petit code qui pourra te mettre sur la piste :
_root.createEmptyMovieClip("f", 0); // Dessin de la forme : f.lineStyle(0, 0, 100); f.beginFill(0xFF0000, 100); f.moveTo(100, 100); f.lineTo(100, 200); f.lineTo(200, 200); f.lineTo(200, 100); f.lineTo(100, 100); // RetraiDécoupage dans la forme : f.lineStyle(0, 0, 0); f.lineTo(125, 125); f.lineStyle(0, 0, 100); f.lineTo(125, 175); f.lineTo(175, 175); f.lineTo(175, 125); f.lineTo(125, 125); // On retourne au point de départ : f.lineStyle(0, 0, 0); f.lineTo(100, 100); f.endFill();
En fait, tu redessine ta forme a chaque fois alors C relou mais ca passe de manière invisible... Sinon, c'est clair que la meilleure technique C de jouer avec un masque ou avec un rond de la même couleur que le fond...
Au pire même, si tu veut mettre un ptit dessin dans le fond, tu peut rajoutter un morceau du dessin masqué par un cercle que tu positionne dynamiquement.... Je pense que c'est le plus simple... |
Titre: Re:soustraction de forme en as
Posté par: hacknours le le 30-09-2004 a 15:54:21
Salut Tavman, Merci pour ta réponse, mais si tu as regardé le code que j'ai utilisé, c'est plus compliqué que çà. Je n'ai pas utilisé .lineTo (X, Y); mais .curveTo (X, Y, X', Y');
La montagne en question n'est pas faite de segements droits, mais de courbes.
Tu me dis que la meilleure technique est de faire un masque... D'où ma question: comment créé tu un calque masque en action script ?
La technique du rond de la même couleur que le fond n'est pas une bonne solution. Cela donne l'impression que la montagne est entamée, mais en réalité elle est juste cachée... Du coups si un missile passe au même endroit, la montagne est toujours là, caché derrière le rond, et le missile explosera "en l'air"...
Voici le code que j'utilise (sur un bouton):
Code:
on (release) { for(n=1; n<10; n++){ _root["rand"+n]=Math.random()*Stage.width/10; } _root.createEmptyMovieClip("MC", 0); _root.MC.beginFill( 0x555555, 50); _root.MC.lineStyle(2, 0x777777); _root.MC.moveTo(0,(Math.random()*Stage.height/2)+Stage.height/2); for (m=1; m<10; m++){ lex=(Stage.width*m)/10; lexx=(Stage.width*(m+.5))/10; _root["ley"+m]=(Math.random()*Stage.height/2)+Stage.height/2; leyy=(_root["ley"+m-1]+_root["ley"+m])/2; _root.MC.curveTo(lex,_root["ley"+m],lexx,leyy); } _root.MC.lineTo(Stage.width,(Math.random()*Stage.height/2)+Stage.height/2); _root.MC.lineTo(Stage.width,Stage.height); _root.MC.lineTo(0,Stage.height); _root.MC.endFill(); _root.nextFrame(); }
|
|
|
Titre: Re:soustraction de forme en as
Posté par: tavman le le 30-09-2004 a 17:42:37
Ahhh ouep je voit mieux... Ce que je t'ai montré est en effet bcp plus facile a réaliser avec des droites qu'avec des courbes, mais j'avais pas envie dme prendre la tete a créer un cercle... c'est pas trop compliqué d'avoir un cercle "approximatif" en AS, le plus dur c'est d'avoir un véritable cercle... Ou plutot quelque chose qui y ressemble vraiment (on n'a qu'une seule poignée là ou il nous en faudrai 2)
Bon sinon, si tu prend la solution de masquer ta forme, je suppose que tu sais utiliser setMask :
MonClip.setMask(MonClipMasque);
mais le plus dur, ca va etre de créer ton masque... tu retombe sur le même probleme pour enlever une partie et en plus je sais pas si ca passe bien avec les hitTest.
Donc déjà perso, ce que je te conseil, c'est de faire des listes :
PoigneeX PoigneeY PosX PosY
Après ca, c'est clair que pour enlever un morceau... t'es pas sortie de l'auberge... Alors peut etre qu'en créant ta forme dynamiquement (avec les listes) + une autre forme qui lui servira de masque et enlever des morceaux sur ce masque avec ma technique, tu risque de retomber a peut pret sur tes pieds... T'enleve un morceau du masque mais pas du clip ou l'inverse peut marcher aussi.... Mais ca va etre bien compliqué tout ca moi jdit. |
Titre: Re:soustraction de forme en as
Posté par: hacknours le le 02-10-2004 a 22:30:20
Salut, Bah oui, c'est bon, le setMask ne me pose pas de problème. Mais là où le bas blesse, c'est que je si j'utilise cette méthode, çà fait tout sauf ce que je voudrai: 1. Le cratère devient un mask du _root... résultat: on voit l'endroit du trou et on ne voit plus le reste (= inverse) 2. Le cratère devient mask d'un mask déjà existant... résultat: un morceau du mask existant devient apparant (mask sur mask = pas de mask) 3. Le cratère devient un mask du _root, mais je change le rond en un grand cadre moins le rond... résultat: flash ne semble pas prendre en compte le découpage à l'intérieur du cadre. Au final, ma scène apparaît en entier, donc pas de trou.
J'espère que mon problème est clairement expliqué. S'il existait un outil du style montagne.setUnMask(cratère); ce serait vachement plus simple. D'ailleurs un masque est sensé masquer par rapport à ce qu'il contient et non pas masquer tout sauf ce qu'il contient... enfin bon...
J'en profite pour posé une autre question (puisque celle ci ne semble pas avoir de solution): Est-il possible de transformer un clip en forme basique (équivalant à ctrl+B lors de l'édition) et vis et versa ?
exemple d'application: on a une colonne (MC) qui tombe et s'arrête en touchant le sol. transformée en forme je veux pouvoir en découper un morceau (de la taille que je veux), qui se transforme en deux MC dont un, qui touche le sol, reste stable et l'autre tombe à nouveau jusqu'à ce qu'il touche un sol. Le tout se retransforme en forme brute pour pouvoir le découper à nouveau.
Merci de votre patience pour me répondre. |
Titre: Re:soustraction de forme en as
Posté par: tavman le le 03-10-2004 a 13:26:48
Justement : ce que je te disai de faire, c'est la technique pour soustraire une forme mais de le faire sur ton masque...
Donc tu dessine dynamitquement tes montagnes et un masque par dessus qui a exactement la même forme que tes montagnes.
Maintenant, lorsque tu soustrait un rond a ton masque (et là, faut utiliser le script que je t'ai donné en fait), qu'est-ce qui se passe ?
Tu a un cercle sur le bord de ton masque a l'intérieur duquel tes formes sont inversées donc t'as du vide a la place de la montagne et de la montagne a la place du vide (uniquement dans le cercle). Bon, là tu va me dire "bahh oui, mais moi je veut pas de la montagne a la place du vide..." mais tu t'en tape : c'est ton masque et dans la forme en dessous, le bout de montagne rajoutté n'existe pas... Donc il apparait pas...
C'est compliqué a faire, on est d'accord, mais sinon je voit pas trop comment faire.
A moins que tu ne décide de faire l'inverse : Tu dessines ce qui n'est pas de la montagne, tu en fait un masque, et quand tu lance une roquette, tu regarde si le hitTest est faux
if (this.hitTest (maforme._x , maforme._y , 1) == false )
ca devrait marcher... Et là, tu rajoutte des cercles a ton masque et voila... Enfin bon là, c'est de la réflexion de "jme suis réveillé ya 20 minutes alors j'ai un peu la gueule dans le paté" mais je croit que ca pourrai marcher.
Bonne chance a toi ;) |
Forum-webmaster | Actionné par YaBB SE
© 2001-2003, YaBB SE Dev Team. Tous droits réservés.
|