| Ciblage dans différentes zones | |
|
|
Auteur | Message |
---|
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Ciblage dans différentes zones Mar 17 Fév 2015 - 19:47 | |
| Bonsoir, je penche sur un truc qui me pose quelques soucis (non pas de codage mais plutôt de manière de procéder). Voici un schéma : Les bords représentent une "room", cette room est séparée par des murs (traits noirs) en plusieurs pièces (les différentes couleurs). Ma Caméra et mon Player ce trouve dans une des zones, et j'aimerais lister toutes les instances présentes dans cette pièce et désactiver les autres. Alors j'ai deux idées en tête : - La première est de vérifier s'il y a un mur avec une "collision line" entre l’instance et le Player, le problème c'est que les coins peuvent contre-mettre les choses. - La seconde est de vérifier dans un tableaux chaque case avec un algo qui va séparer les pièces en fonction des cases murées, mais j'ai peur que ça prennent pas mal de temps à l'ouverture de la room. Auriez vous une autre idée de comment procéder? |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 19:52 | |
| Pourquoi pas stocker pour chaque zone la liste des rectangles qui la composent ? _________________ Home is not a place, it's a feeling.
|
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 19:58 | |
| Oui mais tu les calcules comment? avec des collision line? |
|
| |
D-z Utilisateur confirmé: Rang *****
Messages : 1611 Localisation : Montpellier
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 20:36 | |
| Je suppose que le plus simple est de les faire à la main... Après c'est pas mon domaine, mais doit y avoir des algos capables de découper efficacement des formes chelous en paquets de rectangles :p _________________ Home is not a place, it's a feeling.
|
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 21:04 | |
| Ajouter une fonction de cadrage de pièce dans le map-editor alors. Mais doit bien avoir un algo quant même je pense.
|
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 21:15 | |
| Les murs sont forcément horizontaux/verticaux? Si oui l'algo de partitionnement doit pas être compliqué. J'en vois un vite fait, mais pas sur qu'il marche dans tous les cas, c'est juste un truc qui me passe par la tete: 1) Pour chaque mur, tu regardes les sommets de la forme qui peuvent être projetés dessus, et tu crées de nouveau 'sommets' 2) Tu relies les sommets a leurs sommets voisins 3) Tu extrais les rectangles Une fois que t'as réussi a extraire tous les rectangles d'une salle, tu sais très facilement les instances qu'elle contiens. Dans tous les cas, l'algo peut être fait de manière très simple si la map est représentable sur une grille. J'avais déjà fait un topic sur la simplification en "moindres rectangles" d'une matrice, si ça t’intéresse. |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 21:53 | |
| Merci Oni pour le procédé, alors en voyant ton schéma j'ai pensé a procéder comme ça: Je prend tout les murs du bord et relie de lignes, ensuite je parse les jointures des lignes, mais ensuite comment déterminer qu'elle rectangle appartient à quelle pièce? Et sur des murs en diagonal ça ne marche plus? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 22:14 | |
| Ben la dans l'idée il s'agissait de créer une liste de bounding box qui permettent de recréer la pièce. Ainsi il était simple ensuite de savoir quelles instances sont dans la pièce en faisant de bête tests de collisions (rectangle). Le soucis s'il y a des diagonales c'est qu'il ne s'agit plus de faire une décomposition en rectangles, mais une décomposition en polygones convexes, pour faire des tests de collisions avec des polygones convexes. Alors déjà, c'est vraiment beaucoup plus compliqué, et ensuite, GM n'a pas de fonction pour savoir si une instance est dans un polygone convexe (enfin je ne crois pas, même si box2d le permettrait). Dooonc, la seule solution viable que je vois, sans trop se prendre la tête, est de se débrouiller a retranscrire la pièce dans une matrice, et ensuite recréer les boudings box a partir de cette fameuse matrice (ce qui est très simple, et y a plusieurs façons de faire, mais pas forcément toutes efficaces). Bref la partie compliquée de l'algo deviens de représenter une sale dans une grille. Déjà faut choisir une bonne taille de grille (normalement il suffit de prendre la taille du plus petit mur), et ensuite, recréer le 'contenu' de la pièce. Pour ça je ne vois qu'une façon de procéder, et il faut mettre un objet spécial qui indique l’intérieur de la pièce (ici le rond vert) et faut aussi que la pièce soit fermée d'une façon ou d'une autre (a la limite tu crée un objet mur séparateur que tu détruits ensuite, après les calculs, si les pièces ne sont pas fermées de base). L'algo est en trois étapes: Ensuite, pour obtenir les bounding box (pour optimiser les calculs de collision avec les instances) tu fusionne juste les cellules horizontales, puis verticales si c'est possible. |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ciblage dans différentes zones Mar 17 Fév 2015 - 22:17 | |
| Solution probable dans ce post:
Ensuite, si tes instances "exterieures" a la pièce sont fixes, tu peux partir sur le même principe. Pour chaque instance de la room, tu lances un rayon du rond vert (centre de chaque pièce) a celle ci en testant les collisions avec les murs.
S'il y a collision avec un mur, l'instance est en dehors de la pièce, s'il n'y a pas collision, elle est dedans.
Cette façon est la plus simple et efficace je pense. Et ça te permet de donner a chaque instance de l'objet "RoomInterior" une liste d'instances qui la composent par exemple. |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: Ciblage dans différentes zones Jeu 19 Fév 2015 - 12:07 | |
| Merci beaucoup Oni ça m'a permis de voir beaucoup plus clair. Voilà j'ai bidouillé un truc qui m'a pas l'air trop mal. http://host-a.net/u/Caly/SeparatorParts2.gmkJ'arrive à créer un Sprite qui me sert de masque pour la pièce que je cible. Niveau optimisation je pense pas pouvoir faire beaucoup mieux avec GM :s Tu peut jeter un coup d’œil Oni stp, et dire ce que tu en pense du procédé et surtout de l'optimisation? |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ciblage dans différentes zones Jeu 19 Fév 2015 - 12:53 | |
| Ça me parait correct, en tout cas ça a l'air de bien marcher et niveau perfs ça tourne bien. J'espère juste que le côté récursif fera pas de dégâts sur de grosses room Jpense qu'y a moyen de faire mieux en explorant l'idée que j'ai posté en dernier, car ça nécessite pas la creation de masques, mais faudrait trouver une solution pour résoudre le soucis des sales non convexes... et la forcément ça risque de demander de la récursivité... Je ferais quelques tests si j'ai le temps, j'ai quelques idées :p |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ciblage dans différentes zones Jeu 19 Fév 2015 - 13:42 | |
| J'ai fait un petit test rapide de mon coté, ça nécessite de placer quelques objets manuellement mais ça marche au poil: http://host-a.net/u/onilink_/partitionnement_rooms.gmkEt l’implémentation est vraiment très simple. Faudrait juste utiliser une pile plutôt qu'une liste pour les nodes, car sous GM les listes ne sont pas de vrai listes... |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: Ciblage dans différentes zones Jeu 19 Fév 2015 - 14:36 | |
| Yep cool J'avais pensé à ça aussi j'avais même commencé à faire un petit test. Plus qu'à créer une alerte dans le mapEditor qui signale qu'un Actor est sans Controlor et donc nécessite l'ajout d'un Node. Et un Stack ou Queue pour gérer la liste des Actors. Merci pour la piste à suivre. La création d'un masque est vraiment coûteuse sur GM? Je vais faire des tests de perf' sur ma version car elle nécessite moins de boulot niveau Editage de map, si ça va pas je part sur la tienne qui est moins gourmande en ressources mais moins maniable. Merci |
|
| |
onilink_ Modérateur
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
| Sujet: Re: Ciblage dans différentes zones Jeu 19 Fév 2015 - 14:58 | |
| Pour les masques je sais pas trop comment ils ont codé ça donc niveau perfs je pourrais pas te dire. La seule chose qui est sure c'est que ça prend pas mal de mémoire. Mais bon ça dépend de la taille du masque quoi...
Faut tester sur de grosses rooms après. Pis dans ton cas tu peux aussi faire un système de résolution de masques (genre taille divisée par deux, puis ensuite tests de collision avec scale x2). |
|
| |
Caly Utilisateur confirmé: Rang ****
Messages : 1285 Localisation : Haute Normandie Projet Actuel : Capturer, apprivoiser et dresser des Pokémons sauvages pour faire des spectacles de rue et en faire mon métier.
| Sujet: Re: Ciblage dans différentes zones Jeu 19 Fév 2015 - 15:30 | |
| - Citation :
- Pis dans ton cas tu peux aussi faire un système de résolution de masques (genre taille divisée par deux, puis ensuite tests de collision avec scale x2).
Héé génial ça javais pas pensé, 1 node= 1px ensuite je multiplie par le node_width/height réel, ce qui fait que je peut gérer tout les objets de la pièce avec une mémoire vidéo réduite Je teste ce soir sur un grosse map pour voir le rendu en MS. |
|
| |
Contenu sponsorisé
| Sujet: Re: Ciblage dans différentes zones | |
| |
|
| |
| Ciblage dans différentes zones | |
|