Forums Développement Multimédia

Aller au contenu

localToGlobal avec un objet constitué d'un rectangle ou de points

CODE Actionscript

8 réponses à ce sujet

#1 darkrat

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 61 messages

Posté 06 August 2013 - 21:12 PM

salut,

voilà la situation en bref, j'ai une hiérarchie d'objet servant d'objets d'affichage à rôles diverses. A la base de cette hiérarchie se situe ma classe mère contenant un objet Hitbox, cet objet sert à tester les collisions et étend -pour le moment- rectangle.

Le problème c'est que lorsque je veux tester une collision entre deux hitbox les coordonnées des points sont récupérées sur base de leur position au sein de l'objet d'affichage et non au sein de la scène. La méthode intersects de Rectangle réagit de la même manière et la méthode de conversion localToGlobal est réservée aux Sprite/MovieClip comment faire?

merci d'avance pour vos réponses

NB : la taille de la hitbox ne fait pas forcément la taille du sprite et n'aura pas forcément une forme rectangulaire par la suite mais basée sur des points (l'idée reste qu'il faut convertir) donc hitTestObject ne suffit pas (et parait que c'est lourd en plus)

edit : j'ai pensé a créer la hitbox avec les coordonées du movieclip + celle de la hitbox mais ca rate pour les rotations du coup

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 06 August 2013 - 21:26 PM

Salut,

A lire pour aider : http://forums.mediab...iche_collisions
Collisions de deux AABB : http://forums.mediab...ns#aabb_vs_aabb

Citation

les coordonnées des points sont récupérées sur base de leur position au sein de l'objet d'affichage
Pour récupérer facilement la position réelle (scène) de ton rectangle dans ton objet d'affichage (conteneur) tu peux par exemple faire :

X = monConteneur.x + monRectangle.x;
Y = monConteneur.y + monRectangle.y;

La taille de ton rectangle ne dépendant pas de sa position le reste ne devrait pas poser de problème.
Si il s'agit de points c'est pareil, pour revenir à la position de tes points par rapport à la scène il te suffit d'ajouter la position du conteneur, et si tu as une imbrication de conteneurs (c'est mal) il te faudra prendre en compte la position de chaque conteneur imbriqué. Tu peux faire une classe qui remonte automatiquement tous les parents d'une hitBox et récupère les position de chacun pour calculer la position réelle du point. Si tes conteneurs sont fixes, c'est un calcul à faire une seule fois à l'initialisation pour récupérer une valeur fixe à ajouter à tous tes points pour ce conteneur.

L'idéal serait (si c'est un jeu par exemple) de n'avoir qu'un seul objet d'affichage et de tout gérer au même niveau.

#3 darkrat

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 61 messages

Posté 07 August 2013 - 19:14 PM

le problème c'est que parent n'est pas reconnu au sein de la hitbox donc je ne sais pas accéder aux coordonnées de l'objet, ma classe de base étend Sprite (celui de starling, ca change quelque chose?)

merci pour ta doc sur les collisions ca va m’être utile

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 07 August 2013 - 19:48 PM

Salut,

Je ne comprend pas un truc :

Citation

Le problème c'est que lorsque je veux tester une collision entre deux hitbox les coordonnées des points sont récupérées sur base de leur position au sein de l'objet d'affichage et non au sein de la scène.

Citation

parent n'est pas reconnu au sein de la hitbox donc je ne sais pas accéder aux coordonnées de l'objet

Y a un truc pas logique ou c'est moi ?

Ta hitBox c'est un rectangle, par défaut il possède 4 paramètres : position X, position Y, largeur, hauteur.

Tu n'as pas besoin de la méthode "intersect" pour vérifier la collision (voir : http://forums.mediab...ns#aabb_vs_aabb ) :
function collisionBoxBox(A:Rectangle,B:Rectangle):Boolean{
        if (A.y+A.height < B.y || A.y > B.y+B.height || A.x > B.x+B.width || A.x+A.width < B.x) return false;
        return true;
}

Tu as besoin des paramètres de la hitBox et la position du point que tu veux tester.

Citation

j'ai une hiérarchie d'objet servant d'objets d'affichage à rôles diverses. A la base de cette hiérarchie se situe ma classe mère contenant un objet Hitbox, cet objet sert à tester les collisions et étend -pour le moment- rectangle.

Donc la hitBox est à la racine, elle est sur la scène et donc possède des paramètres globaux (pas besoin de la modifier sauf si tu la déplace ou en change la taille), sa position est la position réelle sur la scène, donc elle on s'en occupe pas.

Reste à trouver les points.

Citation

les coordonnées des points sont récupérées sur base de leur position au sein de l'objet d'affichage et non au sein de la scène

C'est donc que le point que tu veux tester se trouve dans un objet d'affichage que tu connais.
Partant de là tu peux récupérer les coordonnées locales du point dans l'objet d'affichage, et ajouter les coordonnées de l'objet d'affichage pour obtenir la position réelle sur la scène.

Citation

le problème c'est que parent n'est pas reconnu au sein de la hitbox donc je ne sais pas accéder aux coordonnées de l'objet

Donc si je comprend bien tu as une hitBox (A) qui se trouve à la racine et dans chaque objet de ta hiérarchie tu as une nouvelle hitBox ( B ) pour laquelle tu veux tester la collision avec la hitBox (A).

Dans tous les cas tu dois savoir quel objet est affiché ou pas, donc tu peux faire un truc du genre :

// récupère les hitBox
B = monObjetAffiché.saHitBox;
A = laHitBoxdeBase;

// corrige la position de la hitBox de l'objet
B.x = monObjetAffiché.x + B.x;
B.y = monObjetAffiché.y + B.y;

Puis comparer A et B pour la collision.

Je ne connais pas ton projet mais de ce que tu en dis moi je serait passé par un tableau ou un dictionary pour stocker mes objets affichés, puis je ferais une simple boucle sur le tableau pour tester tous les objets affichés avec la hitBox. Cependant cela demande à ce que tu n'ait pas d'objets imbriqués dans d'autres objets etc... ayant tous une hitBox, ou que la hitBox que tu veux tester ne soit pas dans l'objet qui se trouve au énième niveau de la hiérarchie (mais c'est un problème de conception dans ce cas).

#5 darkrat

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 61 messages

Posté 07 August 2013 - 20:22 PM

soit je te comprend mal soit l'inverse ^^, ma hitbox n'est pas la classe racine ma hitbox est instanciée au sein de ma classe racine. Le calcul de collision s'effectue au sein de cette classe hitbox et lors de ce calcul je voudrais avoir la position de l'objet qui la contient (une instance d'une classe fille de la classe racine) j'essaye avec parent.x mais ca parent n'est pas reconnu pourtant la hitbox est bien contenue dans cette autre classe, cette dernière étant instanciée sur la scène

edit : j'ai fait un petit diagramme de classe pour être sûr
http://hpics.li/d45dbcb

#6 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 07 August 2013 - 21:38 PM

Il me semble pourtant avoir bien compris, mais si ça se trouve quelque chose m'échappe.

Je sais bien que la classe hitBox n'est pas la classe racine du projet, mais je pense qu'on ne parle pas de la même chose.

Pour moi une "hitBox" est une simple zone, un rectangle, on peut en faire une classe indépendante si on a besoin d'ajouter des paramètres ou fonctionalités, mais normalement pour définir une hitBox (2D) la classe Rectangle suffit.

Ensuite, toujours pour moi, tu dois avoir une classe "Collisions" dans laquelle tu colle les formules pour "AABB vs AABB" et "AABB vs Point", et toutes celles dont tu peux avoir besoin.

Pour tester la collision entre deux hitBox (AABB) je passe simplement les deux hitBox à la méthode de la classe "Collisions" qui correspond à la collision que je veux tester.

var collisions:Boolean = Collisions.AABBvsAABB(hitBox1,hitBox2);

J'ai besoin d'un repère de coordonnées commun pour toutes les hitBox afin de pouvoir tester la collision. Partant du principe que le repère Global est celui de la scène et que c'est sur la scène qu'est instanciée par défaut une des deux hitBox (appelons-la "A"), je considère de que "A" est dans le bon repère de coordonnées, ça fait déjà ça de moins à vérifier.

Reste à trouver les coordonnées de la seconde hitBox à tester (ou du point), appelons-la "B". Selon ton schémas tu crée des objets à partir de la classe principale, et .... et c'est là où tu ne donne pas assez d'infos .... tu souhaite tester la collision avec une hitBox se trouvant dans les objets instanciés ultérieurement.

Questions :
- Tu as bien une hitbox (telle que je la défini) sur la scène au départ ?
- Les objets doivent tester la collision avec cette hitBox et aussi entre eux ?

Lorsque tu ajoute un nouvel objet à ta scène, tu récupère la hitBox qu'il contient et il te suffit de corriger sa position en conséquence (en lui ajoutant la positon de l'objet que tu viens d'instancier), puis de faire test tests de collisions avec la hitBox corrigée. Cela peut se faire directement dans ton objet qui serait donc à même d'effectuer lui même les corrections sur sa hitBox afin de renvoyer toujours une hitBox correctement placée.

Si tu as plusieurs objets à tester en même temps, une solution efficace serait de coller tous les objets instanciés dans un tableau, puis de faire une boucle sur le tableau et de tester la collision avec les hitBox corrigées de chaque objet actuellement actif.

Reste le problème des objets imbriqués, un objet A qui contient un objet B, qui contient un objet C, comment tester la hitBox de C ?
Normalement si tes objets sont des objets d'affichage (DisplayObject) tu peut remonter via "Parent", et si ce ne sont pas des objets d'affichage alors ils n'ont pas de position définie (sauf mention spéciale) donc ils ne sont pas à prendre en compte.

Voilà de mon côté ce que je comprend, mais peut-être que je me trompe et dans ce cas il faudrait plus d'explications de ton côté ou un petit exemple bricolé vite fait (le tout dans un Zip) de ce que tu souhaite faire pour qu'on puisse causer de la même chose Image IPB

#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 07 August 2013 - 23:12 PM

Re,

Voici un petit exemple de ce que j'avais en tête, mais c'est peut-être totalement pas ça aussi..... :smile:

Fichier(s) joint(s)



#8 darkrat

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 61 messages

Posté 08 August 2013 - 19:02 PM

oh c'est gentil à toi d'avoir pris la peine de faire cette source, comme je t'ai dit avant je n'avais pas de classe collision et j'essayais de calculer la collision au sein même de ma hitbox ce qui posait problème pour récupérer les coordonnées de l'objet, j'ai créé une classe collision et rectifié un peu mon agencement poo et tout va pour le mieux maintenant merci encore

(ah mais en fait en remotant je m'aperçois que mon précédant message n'est pas la oO)

#9 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 08 August 2013 - 19:53 PM

Re,

Pas de problème, le tout c'est que tu soit arrivé à tes fins, bon courage pour la suite.



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