[Résolu] Sens de la collision !

Et oui c’est encore moi ><
Et j’ai encore une question, j’utilise le moteur physique et je voudrais que quand le personnage et en collision avec un objet on puisse différencier si il est en collision par la droite le bas le haut ou la gauche. Ce sera plus clair avec un exemple :

Je souhaite donc pouvoir tester une condition qui dirais en gros si le personnage et en collision avec « coté A » alors faire […]

Deux solutions : faire en fonction des coordonnées ou créer des masques de collision.

Oui, moi je créer des masque de collision ça marche impeccable :slight_smile:

C’est bien a ça que je pensais mais je m’étais dis comme les objets ne peuvent avoir que deux formes avec le moteur physique qu’il serais peut être possible par une fonction ou une connerie du genre de faire cela :stuck_out_tongue:
Et les masques de collisions vous les faites avec des objets ou des animations ? Enfin c’est quoi qui utilise le moins de ressources et fait le moins ramer ?
Merci pour les réponses :wink:

Les masques de collisions sont fait avec des objets (très souvent rectangulaires).
Ce qui fait ramer n’est pas le nombre d’objet mais les calculs effectués, ce qui est souvent effectivement causé par les objets lors des tests de collisions en masse etc…

Je vient de regarder l’exemple plateforme 2 et ci je ne me trompe pas ce que je veux faire se trouve la :


Le seul problème c’est que je ne comprends pas cette partie, alors est ce que c’est ce que je veux faire ? Et si oui quelqu’un a une petite explication ?

Je me permets de faire un petit up :wink:

Car j’ai toujours pas eu une réponse qui me dis que c’est impossible avec des calculs, sa marche avec les masques de collisions mais sa fait beaucoup d’objets avec beaucoup de calcul a faire:/
Je vais expliquer plus simplement mon problème :

J’utilise le moteur physique, j’ai un carré et je veux pouvoir tester une condition qui dirait :
Si l’objet machintruc et en collision avec le coté A du carré alors …
Ou plus simplement je veux que quand le perso et sur la face « haute », la face horizontal je puisse tester une condition. Est-ce que cela est faisable avec un calcul ou une quelconque astuce ?

Les formules du jeu de Plateforme sont un peu compliqués car elles utilisent le centre de l’objet ( mais avant que le point “Centre” ne soit ajouté à tous les objets ).
De ton coté, tu peux refaire ça “assez simplement” :

Pour chaque Objet1 :
Conditions : Objet1 est en collision avec Block
Actions : Aucune
Sous évènement : Condition : La position X de Objet1 est < à Block.X()
---------------------- Action : L’objet est à gauche du bloc
Sous évènement : Condition : La position X de Objet1 est > à Block.X()
---------------------- Action : L’objet est à droite du bloc
Sous évènement : Condition : La position Y de Objet1 est < à Block.Y()
---------------------- Action : L’objet est au dessus le bloc
Sous évènement : Condition : La position Y de Objet1 est > à Block.X()
---------------------- Action : L’objet est en dessous le bloc

Ici, j’ai utilisé un évènement “Pour chaque objet” pour s’assurer qu’on teste bien un par un les objets ( Imaginons qu’il y ait deux objets en collision avec deux blocs différents, on risquerait de mélanger les objets en collision avec un bloc mais à gauche ou à droite d’un autre ). Question performance, le test de collision du moteur physique n’est pas gourmand ( Au contraire de celui normal des objets Sprite ).

Merci je vais tester ça :wink:

Je n’ai pas eu beaucoup de temps a moi, et je viens seulement de tester, mais soit j’ai pas compris soit il y a belle est bien une erreur ? J’ai crée une nouvelle scène avec seulement un block et un perso, j’ai appliquer ton code et j’ai mis comme action changer la couleur du block, mais pourtant le block ne change pas de couleur ?! ><"

Voici un screen de mes events :

Et une démo :

mediafire.com/?628o87kljtvo1qo

La position X de SmallBox est < à SmallBox.X() ?
Ca risque pas d’être vrai :wink:

J’en profite pour signaler que la condition de collision de l’automatisme moteur physique prend uniquement en compte les premiers objets passés dans la condition. Ici, si tu veux prendre en compte les smallbox ET les heros, fait deux conditions. Ou mieux, pour t’assurer de pas mélanger quand il y a plusieurs collisions entre plusieurs Smallbox et plusieurs Héros, fait un pour chaque objet :

Pour chaque objet SmallBox : Héros est en collision avec SmallBox ...Tes sous évènements

A oui c’est sur que ça risquait pas de marcher ><
Vraiment désoler, par contre j’ai encore quelques questions, car je n’ai toujours pas réussis, oui j’en ai un peut honte mais c’est vraiment important que j’y arrive et que je comprenne :

Déjà je n’arrive pas à faire cela :

Pour chaque objet SmallBox : Héros est en collision avec SmallBox ...Tes sous évènements

Sa ce trouve ou ?

Ensuite j’ai vérifié mon code mais j’ai toujours un souci, en fonction de l’emplacement de ma SmallBox ça ne marche pas forcement, je m’explique, elle est censé passer au orange quand je suis en dessous, si je place ma SmallBox en haut sur la scène elle ne passera jamais au orange quelque soit la position de mon joueur, si je la mais au milieu ça marche a peut pets bien et si je la place en bas elle sera toujours orange ?

Screen :

Démo :
mediafire.com/?x10xpt6ctyct1ui

Je remets un screen et une démo au cas où, en espèrent comprendre et résoudre mon problème. Merci de l’aide apporté, c’est vraiment gentil. :wink:

Le “Pour Chaque objet” correspond à un évènement ayant le type “Pour chaque objet”. Les évènements “spéciaux” sont accessibles en faisant Clic droit > Insérer… > Puis en choisissant dans la liste.
Cet évènement sera répété pour chacun des objets Smallbox dans ce cas.

Ensuite pour le problème, ça vient du dernier évènement : Tu met la position Y est > à SmallBox.[b]X/b.
Pour finir, le problème de changer le bloc de couleur est que la dernière couleur qui sera insérée sera la seule visible. Pour être sur que ça marche, fait plutôt tes tests avec deux variables.

J’ai corrigé les problèmes en mettant un texte qui affiche si la balle est Dessus/Dessous et à gauche/droite de la boite quand elle en touche une :
ExemplePosition.zip (294 KB)

Merci beaucoup :wink:
Problème résolu.

Je croyais mon problèmes résolu, mais en faite non. Car les events marchent très biens, mais mon problèmes initial était de pouvoir distinguer si la collision ce faisait sur la face droite ou gauche. Or la je ne peux pas vraiment le faire car il ne distingue pas « gauche dessus » « de gauche tout cour » je ne dois pas être claire alors un shema s’impose :

Je voudrais dans le cas 2 que la collision indique que le coté gauche ! J’ai bien sur pensé à faire ceci :

Mais la valeur 50 correspond bien juste quand mon SmallBox fait cette taille or mon objet SmallBox étant destiné à servir de masque de collision sa taille est donc variable il faudrait que le chiffre 50 lui aussi soit variable et s’adapte donc a la forme que j’ai fait prendre a la SmallBox.

Je ne sais pas trop si c’est possible, mais j’espère que oui ?

SmallBox.Height() ( et SmallBox.Width() ) devrait t’être utile.
Tu peux aussi accéder par exemple à la position du Centre de l’objet en faisant SmallBox.X(Centre) et SmallBox.Y(Centre).

Tu peux trouver ces expressions dans l’éditeur d’expressions, liste propriétés des objets.

La le problème est belle est bien résolu :wink:
Merci de ton aide, car j’ai réussi a résoudre mon problème et a le comprendre. Il fallait faire :

Condition : La position Y de Héros est < à SmallBox.Y()-SmallBox.Height()/2

Ainsi on teste uniquement si le personnage est en collision avec le dessus du block.

Encore merci :wink: