[Moteur MMF2] Collisions ennemis/ décor (Zelda-like)

Démarré par Gold-Link, 29 Décembre 2011 à 17:55

0 Membres et 1 Invité sur ce sujet

Hello  :)

Dans le cadre de mon projet de Zelda amateur j'essaye désespérément de programmer le système de monstres. Le souci n'est pas dans l'ordre des dégâts etc... Il vient plutot des collisions des monstres avec le décor...Je n'y arrive tout simplement pas. J'ai essayé de programmer une "box" constituée de quatre capteurs autour de chaque monstre lorsqu'il rentrait en collision avec le décor, tout fonctionne bien quand il n'y a qu'un monstre, sauf que des qu'il y en a plusieurs soit les capteurs sont assignés au mauvais monstre soit le monstre passe tout bonnement au travers du décor.
J'ai essayé d'assigner chaque capteur a "son" monstre lors de la création du capteur sur celui-ci en rentrant dans une variable la valeur fixe du monstre concerné.

Je demande donc si on pourrait m'apporter une aide afin de gérer les collisions des monstres avec le decor quitte a tout reprogrammer d'une façon différente  ;)

PS: c'est le dernier élément du jeu qui m'empêche de progresser dans la programmation...ca serait cool que ca soit résolu  :lol:

Bah déjà, tu n'as besoin que de deux capteurs (le coin en bas à droite et celui en haut à gauche) :P
Montre ton code (ou peu importe ce que c'est sous MMF x) ) ^^

Je te donne la portion de code pour le capteur du haut sachant que le reste est similaire pour les autres capteurs:

Collision du monstre

SI Monstre : Collision au dessus d'un obstacle

ALORS Créer capteur Haut, bas, gauche et droite a la position Xmonstre et Ymonstre.
ALORS Assigner la variable A (du monstre) à 1.
ALORS Assigner la variable A de chacun des capteurs avec la valeur fixe du monstre.



Déplacement des capteurs

SI capteur_haut est au dessus du monstre (pour bien préciser au logiciel de quel capteur et de quel monstre on fait allusion)
ET SI la variable A capteur_haut = valeur fixe du monstre concerné

ALORS placer en permanance le capteur a la position Xmonstre et Ymonstre pour qu'ils se déplacent ensemble


Rebond du monstre

SI variable A du monstre = 1
SI capteur_haut est au dessus du monstre
et SI la variable A du capteur = valeur fixe du monstre concerné
ET SI le capteur haut est au dessus du décor

ALORS faire changer le monstre dans un direction opposée.
ET variable A du monstre = 0


Sachant qu'ici je n'ai pas encore pu détruire chacun de ces capteurs car ils sont soumis au bug...

Si je comprends bien, A est l'identifiant du monstre ? Si c'est le cas, penses bien à en mettre un différent par monstre :P
MMF ne donne pas un identifiant de base par objet ?
Ca serait plus simple de faire 4 variables internes au monstre qui pointent vers ses 4 capteurs, non ?

29 Décembre 2011 à 18:42 #4 Dernière édition: 29 Décembre 2011 à 19:05 par Gold-Link
En fait la variable A du monstre sert a dire si il est en collision, en fait pour le code actuel ca a peu d'importance.
Par contre chaque objet actif (ici par monstre) sous mmf est différent seulement par sa valeur fixe , chaque objet en possede une différente afin de leur faire une distinction.

Apres ton idée des 4 valeurs différentes est a voir, j'ai une idée , je teste ça et je dirai si ça fonctionne  :) Mais avant y'avait un autre truc qui me chiffonne: tu parlais de deux capteurs utiles (haut-gauche et bas-droite) sauf que mon monstre se déplace dans 8 directions donc si il arrive sur un obstacle en provenant du nord-est, avant d'être stoppé par les capteur il aura déja bien marché sur le décor, je me trompe ?

EDIT : bon toujours pas mais ca permet de cibler le probleme, je pense que le bug est du a la reconnaissance de l'ennemi concerné par la collision . En effet si deux monstres touchent en même temps un obstacle le capteur se place sur l'ennemi mais il ne reste pas dessus excepté pour un seul des monstres.


Les barres blanches sont les capteurs, un seul des ennemis en possede. Les deux du haut devraient être détruits (mais pas encore codé...)

Apres si chris pouvait me filer un coup de main, lui meme ayant bien connu mmf ca serait génial... ^_^

Après, ça dépend comment tu gères tes collisions. Si c'est avec un carré, tu peux calculer la position de deux coins à partir des deux autres :P
Pour les capteurs, il suffit de les replacer au dessus de l'ennemi à chaque fois que celui-ci se déplace d'au-moins un pixel. Mais déjà, je pense que tu devrais coder la suppression et voir ce que ça donne ^^

Bah pour la suppression j'ai été confronté au même probleme car soit les capteurs partaient de tous les ennemis ou étaient enlevés du bon ennemi mais étaient transportés sur un autre monstre (qui s'en retrouvait a la fin avec plus qu'il n'en faut) et finissait pas faire ramer puis planter le jeu...
Si mmf pouvait assigner directement une valeur un a objet lors de sa création ça serait beaucoup plus simple...
Apres replacer les capteurs oui mais on revient au même problème: il faut que le capteur soit sur le BON ennemi...

Donc en fait le problème, c'est que les capteurs partagent leur variable ?
Dans ce cas, vaut mieux gérer les collisions dans le monstre lui-même : si sa "bordure haute" est en collision avec le décor, alors changer de sens, etc.

Mais justement les capteurs ne sons pas censés partager leurs variables, en fait dans la variable A du capteur lors de sa création, je lui assigne la valeur fixe du nombre, et il ne peut exister qu'une valeur fixe meme si deux objets sont identiques. Apres si le capteur qui est au dessus du monstre en collision possède la même valeur fixe que ce monstre, c'est ce monstre qui doit rebrousser chemin....sauf que non...

29 Décembre 2011 à 20:08 #9 Dernière édition: 29 Décembre 2011 à 20:52 par Neo2
[Modifié par erreur... Je disais de faire supprimer le capteur.]

Ca semblait fonctionner puis avec des tests plus poussés finalement non...
La je vois plus du tout...hum je me demande comment chris s'y est pris pour faire ca sous mmf 1  :rolleyes:


En fait avec un ennemi ca fontionne tres bien. Ensuite j'en ai mis deux (alignés) et un troisième (en arriere) et je les ai laissés divaguer dans un petit espace clos en activant en suivant ton principe toutes les collisions et au bout d'un certain temps les capteurs ne disparaissaient plus et un des monstres finissait par passer au travers des murs...

Hm... Essaye en faisant supprimer le capteur dans tous les cas :

SI variable A du monstre = 1
SI capteur_haut est au dessus du monstre
et SI la variable A du capteur = valeur fixe du monstre concerné
ET SI le capteur haut est au dessus du décor

ALORS faire changer le monstre dans un direction opposée.
ET variable A du monstre = 0

supprimer capteur

Idem...
j'ai cherché sur internet quelque chose du genre , si des gens avaient des problemes du style et la seule solution ca d'utiliser la valeur fixe de l'objet en question mais...voila quoi  :P

Le plus simple reste quand même de procéder comme ça :
SI Monstre : Collision au dessus d'un obstacle
   SI Xmonstre <= Xobstacle ALORS prendre une direction orientée à droite
   SI Xmonstre + (taille) >= Xobstacle ALORS prendre une direction orientée à gauche
   SI Ymonstre <= Yobstacle ALORS prendre une direction orientée en bas
   SI Ymonstre + (taille) >= Yobstacle ALORS prendre une direction orientée en haut

Ca devrait marcher correctement, du moment que le monstre a une taille strictement supérieure à 0 ^^
Après, je sais pas ce qui est faisable ou non avec MMF :p

Malheuresement sous mmf2 on ne peut pas obtenir d'informations provenant du décor (donc pas de position relative au décor) mais seulement d'objets "actifs" , et il serait sucidaire de n'utiliser que des objets actifs pour obstacles  :ninja:
Je cherche désormais un "engine" de monstres style zelda sous mmf2 pour comprendre le fonctionnement mais apparemment rien sur internet n'a été fait ...

(Félicitez-moi, j'ai fait modifié au lieu de répondre :ninja:)
Mais dans ce cas, la condition :
Citation de: Gold-Link le 29 Décembre 2011 à 18:24ET SI le capteur haut est au dessus du décor
Sera vrai dés l'instant qu'il y a un décor, même si ce n'est que du sol, non ?

"Au dessus du décor" signifie simplement au dessus d'un obstacle (ou en collision avec un obstacle) mais c'est la seule option que mmf2 permet en interaction avec des "backdrops" (obstacles-décors). Toutefois si le décor en question n'est pas un obstacle , le logiciel ne le prend pas en compte.

J'aurai être du plus clair , désolé...  :ninja:

Donc il y a les décors qui servent de décoration et les décors qui peuvent interagir avec les objets ? Mouais... :P
Un dernier essai ? :D
SI Monstre en collision avec Obstacle ALORS
   
    Creer CapteurHorizontal
    CapteurHorizontal.X = Monstre.X
    CapteurHorizontal.Y = Monstre.Y
    SI CapteurHorizontal en collision avec obstacle ALORS
        Changer direction de Monstre vers le bas
    SINON
        CapteurHorizontal.Y = Monstre.Y + Monstre.Hauteur
        SI CapteurHorizontal en collision avec obstacle ALORS
            Changer direction de Monstre vers le haut
    Détruire CapteurHorizontal
   
    Creer CapteurVertical
    CapteurVertical.X = Monstre.X
    CapteurVertical.Y = Monstre.Y
    SI CapteurVertical en collision avec obstacle ALOSR
        Changer direction de Monstre vers la droite
    SINON
        CapteurVertical.X = Monstre.X + Monstre.Largeur
        SI CapteurVertical en collision avec obstacle ALORS
            Changer direction de Monstre vers la gauche
    Détruire CapteurVertical

Wala :P Si tout est effectué d'une traite, ça devrait marcher.

...Non plus, j'ai essayé mais on ne peut pas tout faire en une condition sous MMF, ca aurait été trop beau...
En fait ca foire toujours au niveau de l'attribution de chaque capteur a la valeur fixe.



Citation de: Gold-Link le 29 Décembre 2011 à 21:25...Non plus, j'ai essayé mais on ne peut pas tout faire en une condition sous MMF, ca aurait été trop beau...
En fait ca foire toujours au niveau de l'attribution de chaque capteur a la valeur fixe.
Comment ça ? Il n'y a pas besoin de valeur fixe. Il n'y a qu'un seul objet capteur à la fois, il ne devrait pas avoir de problème à l'identifier :huh:

Certes mais pour que le capteur se place sur l'ennemi lorsqu'il y en a qu'un seul il le trouve de suite mais quand il y en a deux en collision, les capteurs ne savent pas sur quel ennemi aller...

Apres pour GameMaker j'y avais pensé au tout début mais perso j'ai plus d'aisance avec mmf (malgré ce pb..)

Citation de: Gold-Link le 29 Décembre 2011 à 21:42Certes mais pour que le capteur se place sur l'ennemi lorsqu'il y en a qu'un seul il le trouve de suite mais quand il y en a deux en collision, les capteurs ne savent pas sur quel ennemi aller..
Il n'y a qu'un seul capteur à la fois, et c'est le monstre qui les créée. Il peut donc très bien modifier lui-même leur position pour les mettre sur la sienne. Il teste ensuite s'ils sont en collision ou non, puis les supprime. Il n'y a pas besoin d'identifier quoi que ce soit, tout le code se déroule chez le monstre, et je pense qu'il peut connaître sa propre position quand même :p

Pas moyen que tu montres le code tel qu'il est sous MMF avec un screen shot ?

Tiens , voila le code; il s'agit de la première version de celui-ci. J'ai préféré le remettre car les autres tentatives ont été vaines...

[spoiler][/spoiler]


Ca a l'air de fonctionner , merci encore ! Je vais toutefois essyer de poucer le vice encore plus loin pour voir si il peut y avoir des éventuels bugs persistants. Apres je dois t'avouer que j'ai du un tout petit peu modifier ton code car le tien est adapté seulement si la coordonnée X de monstre se situe en haut de son sprite or chez moi je préfere le mettre au milieu mais ca semble fonctionner.

Je teste et je dirai par la suite si tout marche, merci encore  ^_^

Derien ^^
Pourvu que ça marche, que je me la pète à résoudre des problèmes de logiciels que je n'ai même pas :ninja: