Forums Développement Multimédia

Aller au contenu

Soustraire une forme à une autre

CODE PAO

4 réponses à ce sujet

#1 ilicos

    Ceinture Blanche

  • Members
  • Pip
  • 2 messages

Posté 15 November 2014 - 19:35 PM

Bonjour à tous! :)

Je cherchais à reproduire l'effet dans worms ou le décor est réduit en miette par le biais des différents projectiles. Cependant, je peine à trouver une solution face au problème de soustraction de forme.

En bref, à chaque point qu'atteint chaque projectile, j'aimerai faire un trou dans le décor.

Je suis tombé sur Intersection de l'objet rectangle mais ce dernier renvoie le point commun entre deux formes et ne fonctionnent que sur les rectangles :')

J'ai essayé par les dessins graphics :

var monCarre:Sprite = new Sprite();
monCarre.graphics.beginFill(0);
monCarre.graphics.drawRect(0,0,200,200);
addChild(monCarre);
stage.addEventListener(MouseEvent.CLICK, maskSquare);
function maskSquare(event:MouseEvent):void
{
        monCarre.graphics.drawCircle(mouseX,mouseY,100);
}
 
Les cercles font bel et bien des trous mais rajoute de la matière dans les zones sans contact avec d'autres formes.

Il y a aussi le mask que j'ai essayé, mais ce dernier effectue l'inverse de ce que je désire! :( (pareil que intersection() des rectangles. J'ai croisé quelques "astuces" pour l'inverser -> http://stackoverflow...h-inverted-mask
Cependant la matière n'étant pas réellement enlevée, le blanc est compris dans la forme. :/

Auriez vous des solutions à proposer?

Merci d'avance,

Cordialement,
M. Presto

#2 pcxpert

    Ceinture Orange

  • Members
  • PipPipPip
  • 32 messages

Posté 15 November 2014 - 19:43 PM

Bonjour ilicos, j'ai récemment tomber sur un truc qui en parle mais bon ce n'est pas tout a fait au point comme dans le jeu mais cela est tout de même un bon début http://www.emanuelef...rrain-in-flash/

#3 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6952 messages

Posté 15 November 2014 - 20:25 PM

Salut,

Je serai toi je regarderai du côté des opérations sur les pixels.
C'est à dire essayer directement de manipuler l'ensemble des pixels contenus dans une zone.
Par exemple, le projectile touche une zone de ton bitmap de décor, tu crée virtuellement un cercle représentant la force de l'explosion, tous les pixels contenus dans ce cercle et qui ne sont pas des pixels transparents (tu peux faire évoluer ce principe pour les murs en pierre, le métal, etc... pour affiner les résultats) vont réagir à l'explosion. chaque pixel devient alors une particule (voir : http://forums.mediab...iche_particules ) chacune étant dotée de paramètres (vitesse, direction, etc...) qui vont créer un effet d'explosion des pixels situés dans ton cercle.

Donc en gros :

1 - définir un cercle d'explosion à l'impact
2 - vérifier les matières présentes (métal, sable, pierre, ...)
3 - récupérer tous les pixels inclus dans le cercle
4 - gérer chaque pixel comme une particule en fonction de la matière qu'il représente

#4 ilicos

    Ceinture Blanche

  • Members
  • Pip
  • 2 messages

Posté 15 November 2014 - 21:17 PM

Waw, super! Merci à vous deux! ;)
Je vais regarder le code des worms :)

#5 tlecoz

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3485 messages

Posté 25 November 2014 - 12:00 PM

Hello !

La methode donnée dans le lien fonctionne mais n'est pas top dans le sens ou "ok ca fait des trous" mais c'est tout, on ne peux pas aller plus loin en faisant comme ça.

A ta place, je travaillerai avec 2 bitmapdatas pour représenter le terrain.
Le premier bitmapdata contiendrait le vrai graphisme qu"on voit à l'écran, et le second contiendrait les même formes mais unie. Par exemple, tout le terrain serait uniquement en rouge, les barils d'essences ou les caisses de munition seraient en vert et chaque worms serait d'une couleur bien distincte (et référencée dans un tableau).

Ensuite, pour faire un trou, tu as besoin de la position du centre de ce trou et le rayon de ce trou.
A partir de la, tu peux déduire ou se trouve le rectangle de pixel qui contient ton trou

rect = new Rectangle(centerX - radius, centerY - radius, radius * 2, radius * 2)

maintenant que tu sais quels sont les pixels potentiellement concernés par l'explosion, il faut faire verifier la distance de chacun d'entre par rapport au centre de ton trou. Si la distance est inférieure au rayon du cercle, alors le pixel fait partie du trou et il faut l'effacer (sur les 2 bitmapData). Mais avant de l'effacer, tu peux vérifier sa couleur pour savoir si tu dois blesser un worms (chaque pixel de worms touché correspond à un point de vie en moins, c'est comme ca que ca marchait je pense) , ou si tu dois faire exploser une caisse de munition présent sur le lieu d'impact.

Et voila !

EDIT : pour calculer une distance, il faut utiliser le théoreme de pythagore, l'hypothenus que tu cherches à calculer étant représenté par la position du centre du trou et celle de chaque pixel



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP