Superposition d'objets dans l'inventaire

Bonjour à tous :slight_smile:

Je reviens vers vous au sujet de mon inventaire, car oui, je suis toujours entrain de bosser dessus ! plus c long, plus c bon, n’est ce pas ? ^^
Je vais tâcher de vous expliquer mon nouveau problème clairement :slight_smile: ça fait 2 jours que je bloque dessus…

La scène d’inventaire se présente en 2 parties :

  • A droite, un shop dans lequel on peut acheter des Items : ils sont générés aléatoirement, il y a donc une quantité presque infinie d’items différents.
  • A gauche, l’inventaire du joueur

L’inventaire se compose de 180 “cases” (12 cases en largeur x 15 de hauteur) de 30x30pixels chacune.
Partons du principe (pour simplifier) que tous les objets de l’inventaire ont une dimension de 30x30 pixels.
Les objets sont déplacés dans l’inventaire grâce au comportement “objets déplaçables” (qui entre nous soit dit est extra)

Lorsque que l’on clic sur un objet à déplacer, je créer un carré de 30x30 pixels (nous l’appellerons le “carré de sélection”). Ce “carré de sélection” va suivre l’objet déplacé en se déplaçant, non pas de manière continue, mais case par case (de 30pixels à chaque fois) suivant la formule suivante :
"round(DessinItemsShop.PointX(deplac)/30)*30 " pour les X
"round(DessinItemsShop.PointY(deplac)/30)*30 " pour les Y
=> “DessinItemShop” est le groupe regroupant tous les objets de l’inventaire possibles, et donc l’objet qui est entrain d’être déplacé.

Lorsque le clic est relâché, l’objet vient se mettre à la même position que le “carré de sélection”, ce qui permet de simuler des cases de rangement dans l’inventaire.
Jusque là, tout va bien :slight_smile:

Ensuite arrive donc la question de la superposition des objets dans l’inventaire, et c’est là que ça se corse pour moi :slight_smile:
Il y a 2 cas de figures :

1/ Lorsqu’un objet arrive dans l’inventaire pour la première fois, il ne faut pas qu’il vienne par dessus un objet déjà présent.
=> pour ce point, j’ai trouvé une solution et ne vais pas vous embêter avec ça.

2/ lorsque l’on déplace un objet à l’intérieur même de l’inventaire, si je relâche le clic lorsqu’il est sur un objet déjà présent, je ne veux pas qu’il se superposent. Et c’est là que je bloque.

A noter que chaque objet présent dans l’inventaire a des “variables objets” associées (pour chaque occurrence) telle que :

  • Position X réelle de l’objet dans l’inventaire (une fois posé) PosX
  • Position Y réelle de l’objet dans l’inventaire (une fois posé) PosY
  • Une variable (0 ou 1) lorsque l’objet est en mouvement
  • Le numéro de l’objet (car chaque objet est unique)

Je ne pensais pas que ce point serait une difficulté.
J’avais imaginé faire ceci (juste pour vous expliquer la logique) :

  • Si l’objet du groupe “DessinItemShop” est entrain d’être déplacé,
    ALORS : la variable “Mouvement” = 1

  • Si la variable “Mouvement”=1
    et l’objet du groupe “DessinItemShop” n’est pas entrain d’être déplacé
    et “DessinItemShop” est en colision avec “DessinItemShop”
    ALORS, supprimer l’objet “carré de sélection”
    et déplacer objet du groupe “DessinItemShop” à la position PosX,PosY (où PosX et PosY sont les variables d’objets dont j’ai parlé plus haut).

Il s’avère que ça ne fonctionne absolument pas… (ce qui est normal en fait)
J’ai ensuite essayé pleins d’autre idées, mais rien ne fonctionne…

C’est pourquoi je pense que j’aborde le problème sous un mauvais angle, et c’est pourquoi je me permet de poster :slight_smile:
Je n’attends pas de solution toute faite, mais des idées de solutions si possible ^^

Un grand merci à tous ! :slight_smile:

A++

Ludo

Une idée… Utiliser des objets pour tes cases d’inventaire, avec des variables d’objets (structure ou non ) : quand tu déplaces un items dans l’inventaire et que le clic est relaché => l’objet case_1 (par exemple) prendrais alors dans les variables toutes les infos dont tu as besoins : l’id de l’objet, le nom, la description, eventuellement la quantité.
Ainsi chaque case de stockage est indépendante. Elle affiche son contenu dynamiquement (visuel + texte nom/quantité, etc.). Elle ne pourrait pas se voir “empiler” des objets de natures différentes, et enfin elle permettrait à l’inverse de “stacker” les objets similaires en incrémentant uniquement la variable quantité.

Je ne sais pas si c’est clair, mais je pense que vu ce que tu détailles ci-dessus tu devrais assez vite comprendre l’idée.

Perso j’ai un système comme celui-là : un fichier xml stocke ma base de données d’item (nom, description et autres propriétés), des cases d’inventaire avec variables (“id” pour en guise d’identifiant unique, et “quantité”, 2 seules var néceessaires) utilisant l’objet dessin (rectangle) pour afficher dynamiquement une image suivant l’id de l’objet. Ensuite au survol/clic de l’inventaire je récupère depuis le XML tout un tas de paramètre lié aux objets : nom, descrip, poids, valeur, etc.

Bonjour Kink et merci de ta réponse.

J’ai passé encore toute la journée dessus, et j’ai finalement réussi ! Mais pas en suivant le principe que tu m’as indiqué. Mais merci quand même beaucoup de t’être penché sur la question et d’avoir pris la peine de me répondre !

Voilà ce que j’ai finalement fait :

1/ Lorsque la variable objet “movement” de “DessinItemShop” = 0, pas d’action
=> sous événement : lorsque le “carré de sélection” est en collision avec “dessinItemShop”, faire que la variable ABC = 1
=> sous événement : lorsque le “carré de sélection” n’est pas en collision avec “dessinItemShop”, faire que la variable ABC = 0

2/ Lorsque l’objet “DessinItemShop” n’est pas entrain d’être déplacé
et que la variable objet “movement” de “DessinItemShop” = 1,
ALORS faire = 0 la variable objet movement de “DessinItemShop”
=> sous événement : Lorsque la varaible “ABC” = 0, faire que la position l’objet “DessinItemShop” soit égal à la position de “carré sélection”
=> sous événement : Lorsque la varaible “ABC” = 1, faire que la position de l’objet “DessinItemShop” soit égal à sa position initiale PosX, PosY.

Pour expliquer un peu :
1/ Dans l’étape 1, je sélectionne l’objet immobile, et si il est collision avec le “carré selection”, j’incrémente une variable ABC.
2/ Dans l’étape 2, je sélectionne l’objet mobile, et en fonction de la valeur de la variable ABC, je lui donne une position.

C’était tout con, mais il m’aura fallu bcp de temps pour y parvenir ! ^^
En espérant que ça puisse servir à d’autres personnes ^^

En tout cas un grand merci à toi Kink de t’être penché sur la question et de m’avoir répondu !

A+++

Ludo

C’est une question qui revient souvent et qui souvent fait abandonne les débutants. Je ne sais pas si tu utilises Gdevelop depuis longtemps mais en tout cas tu expliques bien ta logique ! J’ai hate de voir ton jeu !

Salut Kink,

Ca fait un an et demi que j’utilise GDevelopp et que je bosse sur le même jeu ^^ et il y a encore beaucoup de choses à faire !
C’est vraiment un super logiciel qui s’adapte aussi bien aux créateurs débutants que confirmés, et qui permet vraiment de faire tout ce qu’on veut, c’ est extra ! :slight_smile: même si c’est parfois compliqué ^^

Je ne manquerais pas de mettre un post sur le forum lorsque le jeu sera terminé, mais ca risque de ne pas être pour tout de suite encore ^^ peu importe, je ne suis pas pressé :slight_smile: et Gdevelopp continu d’être développé, ce qui est extra !
Bravo aux développeurs de Gdevelopp et à toute la communauté active :slight_smile: et merci à toi aussi !

A+++

Ludo

N’hesites pas à contribuer sur le forum ou sur le wiki :slight_smile: on est pas beaucoup à être actifs et (un peu) experimentes sur le fofo, et gdevelop ne demande qu’à prendre son envol ! :slight_smile:

ok !