Forum d'entraide à la création de jeux d'aventure
 
PortailAccueilFAQRechercherS'enregistrerMembresConnexion

Partagez | 
 

 Question general sur les structs.

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
galactichobo
C'est quoi la Tasse Bleue ?
C'est quoi la Tasse Bleue ?


Nombre de messages : 46

Date d'inscription : 24/11/2014


MessageSujet: Question general sur les structs.   Ven 28 Nov 2014 - 18:27

Salut, depuis un bout de temps j'utilise beaucoup les structs surtout pour des items, Bon moi ce que je fait je change les noms des items pour mettre la quantité.

En fait j'ai créer un struct pour TOUT les items pour les nom, le prix...et les choses de bases.

Mais a de mettons que j'ai des items de type : nourriture et médicament.
Nourriture rajoute du "hunger"
Médicament rajoute du "Health"

Ce que je ferait c'est de créer 2 autre struct : nourriture / medicament avec des variable.

Mais ça devient mêlant un peu avec les numéros.

Bon, c'est sur que je pourrais mettre tout dans une seul structure mais je me retrouverai avec beaucoup d'items avec des variables inutiles, et puis j'ai peur que AGS ne le prenne pas bien (avec 300 items / 50 variable par exemple).

Question:

Est-ce que c'est possible d'associé un struct a un type-managed comme InventoryItem? Il me semble que j'avais trouvé un post sur le forum anglais comme quoi on pouvais avec .ID ... mais je le trouve vraiment plus.

Merci, ou si vous avez une idée d'une façon de faire plus simple.






Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2431

Date d'inscription : 01/08/2006


MessageSujet: Re: Question general sur les structs.   Dim 30 Nov 2014 - 1:52

Salut galactichobo. Je suis pas sûr d'avoir bien saisi ta question, mais je vais expliquer ce que j'ai compris.

Si je me trompe pas, tu as créé des objets d'inventaire que tu veux utiliser comme des médicaments, et d'autres objets d'inventaire que tu veux utiliser comme de la nourriture. Imaginons que tu as 10 objets d'inventaire, que tes objets 0, 1, 2, 3, 8 et 9 soient de la nourriture et que tes objets 4, 5, 6 et 7 soient des médicaments.
Il me semble que ce que tu trouves mêlant, c'est d'automatiser l'assignation de chaque objet d'inventaire à une structure personnalisée différente selon qu'il s'agit de nourriture ou d'un médicament, ce d'autant plus qu'il n'y a aucune régularité entre le numéro ID de l'objet d'inventaire et son type (nourriture vs. médicament).
Dans l'idéal, dans l'exemple que je donne, on voudrait 6 instances de la structure personnalisée réservée à la nourriture (pour les objets d'inventaire 0, 1, 2, 3, 8 et 9) et 4 instances de la structure personnalisée réservée aux médicaments (pour les objets d'inventaire 4, 5, 6 et 7). Le problème c'est qu'une fois qu'on sort de cet exemple précis, on a aucun moyen de savoir à l'avance combien d'instances de chaque type de structure personnalisée on voudra ni quels seront les objets d'inventaire associés à la première structure et lesquels seront associés à la seconde structure.

Pour le problème de savoir "automatiquement" quels objets d'inventaire doivent être associés à quelle structure, on peut utiliser leurs propriétés personnalisées. Par exemple, on peut créer une propriété personnalisée textuelle nommée Type qui pourra valoir "Médicament" ou "Nourriture". Ensuite, à chaque fois qu'on crée un objet d'inventaire, on règle sa propriété personnalisée Type avec la valeur voulue.

À partir de là, pour coller au plus près de ce qu'on veut obtenir avec AGS <3.4, on peut partir sur un code comme le suivant :
Code:
#define MEDICAMENTS_TOTAL 4 // Le nombre total d'objets d'inventaire qui sont des médicaments. Tu dois les compter et rentrer la valeur manuellement. Tu auras des bugs si tu donnes un nombre trop faible.
#define NOURRITURE_TOTAL 6 // Le nombre total d'objets d'inventaire qui sont de la nourriture. Tu dois les compter et rentrer la valeur manuellement. Tu auras des bugs si tu donnes un nombre trop faible.

struct Medicament {
  int health = 5; // une valeur par défaut, fais tes réglages
  InventoryItem* item; // L'objet d'inventaire auquel est associée l'instance Medicament
};

struct Nourriture {
  int hunger = 10; // une valeur par défaut, fais tes réglages
  InventoryItem* item; // L'objet d'inventaire auquel est associée l'instance Nourriture
};

Medicament medocs[MEDICAMENTS_TOTAL]; // On crée autant d'instances Medicament que d'objets d'inventaire qui sont des médicaments
Nourriture bouffe[NOURRITURE_TOTAL]; // On crée autant d'instances Nourriture que d'objets d'inventaire qui sont de la nourriture

int association_id[]; // Cette variable va nous permettre d'associer les ID des instances des structures avec les ID des objets d'inventaire

// On associe nos objets et nos structures au début du jeu
function game_start() {
  association_id = new int[Game.InventoryItemCount];
  int i, m, n;
  while (i < Game.InventoryItemCount) {
    if (inventory[i].GetProperty("Type") == "Nourriture") {
      if (n >= NOURRITURE_TOTAL) AbortGame("Le nombre d'objets d'inventaire de type Nourriture est superieur au nombre renseigne dans NOURRITURE_TOTAL");
      else {        
        association_id[i] = n;
        bouffe[n].item = inventory[i];
        n++;
      }
    }
    else if (inventory[i].GetProperty("Type") == "Médicament") {
      if (m >= MEDICAMENTS_TOTAL) AbortGame("Le nombre d'objets d'inventaire de type Medicament est superieur au nombre renseigne dans MEDICAMENTS_TOTAL");
      else {        
        association_id[i] = m;
        medocs[m].item = inventory[i];
        m++;
      }
    }
    i++;
  }
}

// Des fonctions pour récupérer l'ID de l'instance Medicament à laquelle est associé un objet d'inventaire
int Medicament_ID(InventoryItem this*) {
  if (this.GetProperty("Type") != "Médicament") AbortGame("L'objet d'inventaire %d n'est pas un medicament.", this.ID);
  return association_id[this.ID];
}
int Nourriture_ID(InventoryItem this*) {
  if (this.GetProperty("Type") != "Nourriture") AbortGame("L'objet d'inventaire %d n'est pas de la nourriture.", this.ID);
  return association_id[this.ID];
}
Ensuite, tu peux t'amuser à faire des choses comme ça :
Code:
Display("Vous venez de manger une banane, vous avez repris %d points de faim !", Nourriture[iBanane.Nourriture_ID()].hunger);
Ou encore :
Code:
int i;
while (i < MEDICAMENTS_TOTAL) {
  InventoryItem *tmp = medocs[i].item;
  if (tmp != null) player.LoseInventory(tmp);
  i++;
}
Display("Vous venez de perdre toute votre nourriture !");

À partir d'AGS 3.4.0.2 (alpha), tu devrais pouvoir faire quelque chose comme ça (mais je n'ai jamais testé ces nouvelles fonctionnalités) :
Code:
managed struct Medicament {
  int health = 5; // une valeur par défaut, fais tes réglages
  InventoryItem* item; // L'objet d'inventaire auquel est associée l'instance Medicament
};

managed struct Nourriture {
  int hunger = 10; // une valeur par défaut, fais tes réglages
  InventoryItem* item; // L'objet d'inventaire auquel est associée l'instance Nourriture
};

Medicament* medocs[];
Nourriture* bouffe[];

int association_id[];

// On associe nos objets et nos structures au début du jeu
function game_start() {
  association_id = new int[Game.InventoryItemCount];
  int i, m, n;
  while (i < Game.InventoryItemCount) {
    if (inventory[i].GetProperty("Type") == "Nourriture") n++;
    else if (inventory[i].GetProperty("Type") == "Médicament") m++;
    i++;
  }
  medocs = new Medicament[m];
  bouffe = new Nourriture[n];
  while (i > 0) {
    i--;
    if (inventory[i].GetProperty("Type") == "Nourriture") {
      n--;
      bouffe[n].item = inventory[i];
      association_id[i] = n;
    }
    else if (inventory[i].GetProperty("Type") == "Médicament") {
      m--;
      medocs[m].item = inventory[i];
      association_id[i] = m;
    }
  }
}

// Des fonctions pour récupérer l'ID de l'instance Medicament à laquelle est associé un objet d'inventaire
int Medicament_ID(InventoryItem this*) {
  if (this.GetProperty("Type") != "Médicament") AbortGame("L'objet d'inventaire %d n'est pas un medicament.", this.ID);
  return association_id[this.ID];
}
int Nourriture_ID(InventoryItem this*) {
  if (this.GetProperty("Type") != "Nourriture") AbortGame("L'objet d'inventaire %d n'est pas de la nourriture.", this.ID);
  return association_id[this.ID];
}

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
galactichobo
C'est quoi la Tasse Bleue ?
C'est quoi la Tasse Bleue ?


Nombre de messages : 46

Date d'inscription : 24/11/2014


MessageSujet: Re: Question general sur les structs.   Dim 30 Nov 2014 - 21:03

Salut Kitai. Un gros merci pour la réponse. Je suis pas sur de tout comprendre, mais je regarde ça et je te revient avec une réponses sous peu.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
galactichobo
C'est quoi la Tasse Bleue ?
C'est quoi la Tasse Bleue ?


Nombre de messages : 46

Date d'inscription : 24/11/2014


MessageSujet: Re: Question general sur les structs.   Lun 1 Déc 2014 - 17:41

Bon j'ai regarder ça, mais je trouve très mêlant les int i,m,n... c'est censé vouloir dire quoi?
Et j’imagine que l'utilisation de AbordGame est pour assuré une protection?

Mais bon j'ai compris comment utilisé les propriétés, c'est plutôt cool! En fait c'est utilisé pour des informations de départ? Je crois que c'est mieux de pas changer les propriétés durant le jeu?

Bon je crois je vais illustré par une exemple :

Bon mettons que j'ai 4 items de deux catégorie, comme on a dit : Food et medecine.

Je créer une structure pour les propriété général (tout les objets) parce que ca m'évite de créer des function pour acheter a tout les catégorie..

Code:

function game_start()
{
generals[0].ItemName="Burger";
generals[0].PriceBuy=2.30;
foods[0].hunger=10;
foods[0].cooldowntimer=5;

generals[1].ItemName="Pizza";
generals[1].PriceBuy=1.25;
foods[1].hunger=8;
foods[1].cooldowntimer=4;

//ici sa devien melant car il n'y a pas le meme chiffre pour les deux structures...

generals[2].ItemName="Small Health Pack";
generals[2].PriceBuy=10.00;
medecines[0].health=30;
medecines[0].cooldowntimer=15;

generals[3].ItemName="Medium Health Pack";
generals[3].PriceBuy=20.00;
medecines[1].health=60;
medecines[1].cooldowntimer=30;
}

À 4 items / 2 catégorie c'est pas trop mêlant, mais avec plus ça peu le devenir rapidement..
Donc sois trouver le moyen d'avoir le même numéros par items pour les struct...
Bon, en fait c'est pas vraiment un problème, mais juste d’être plus organisé..

De toute facon ce code ma donner une erreur:

Code:

   while (i < Game.InventoryItemCount){
            if (inventory[i].GetProperty("Type") == "Nourriture") //Cannot convert string..
{
              if (n >= NOURRITURE_TOTAL) AbortGame("Le nombre d'objets d'inventaire de type Nourriture est superieur au nombre renseigne dans NOURRITURE_TOTAL");
              else {        
                association_id[i] = n;
                bouffe[n].item = inventory[i];
                n++;
              }
            }

Je suis avec AGS 3.3.0 en passant.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2431

Date d'inscription : 01/08/2006


MessageSujet: Re: Question general sur les structs.   Mar 2 Déc 2014 - 9:53

galactichobo a écrit:
De toute facon ce code ma donner une erreur:
Au temps pour moi, il faut remplacer tous les GetProperty par des GetTextProperty.

galactichobo a écrit:
Bon j'ai regarder ça, mais je trouve très mêlant les int i,m,n... c'est censé vouloir dire quoi?
galactichobo a écrit:
Donc sois trouver le moyen d'avoir le même numéros par items pour les struct...
Les int i, m, n; sont des variables, où i va successivement prendre comme valeur l'ID de chaque item, et m et n vont correspondre à l'ID de l'instance Medecine ou Nourriture qu'on associe à chacun de ces objets. On n'a pas besoin d'avoir une correspondance parfaite entre l'ID de l'item et l'ID de l'instance de structure étant donné qu'on s'est créé des fonctions pour récupérer l'instance depuis l'item, et aussi pour récupérer l'item depuis l'instance.

galactichobo a écrit:
Bon je crois je vais illustré par une exemple :

Bon mettons que j'ai 4 items de deux catégorie, comme on a dit : Food et medecine.

Je créer une structure pour les propriété général (tout les objets) parce que ca m'évite de créer des function pour acheter a tout les catégorie..
Dans ce cas si chaque élément de generals correspond à un élément foods ou medecines, je pense qu'il serait bienvenu d'utiliser le mot-clé extends (en revanche je ne l'ai jamais utilisé pour les structures "managed").

Pour ton exemple en particulier, j'imagine quelque chose comme ça (à modifier selon tes spécificités bien sûr) :
Code:
#define MEDICAMENTS_TOTAL 4 // Le nombre total d'objets d'inventaire qui sont des médicaments. Tu dois les compter et rentrer la valeur manuellement. Tu auras des bugs si tu donnes un nombre trop faible.
#define NOURRITURE_TOTAL 6 // Le nombre total d'objets d'inventaire qui sont de la nourriture. Tu dois les compter et rentrer la valeur manuellement. Tu auras des bugs si tu donnes un nombre trop faible.
 
struct General {
  int PriceBuy;
  String ItemName;
  InventoryItem* item; // L'objet d'inventaire auquel est associée à l'instance
  int cooldowntimer; // Il semble que cette propriété soit commune aux deux types
};

struct Medicament extends General {
  int health = 5; // une valeur par défaut, fais tes réglages
};
 
struct Nourriture extends General {
  int hunger = 10; // une valeur par défaut, fais tes réglagesciée l'instance Nourriture
};

General generals[MEDICAMENTS_TOTAL+NOURRITURE_TOTAL]; // On crée des instances générales
Medicament medecines[MEDICAMENTS_TOTAL]; // On crée autant d'instances Medicament que d'objets d'inventaire qui sont des médicaments
Nourriture foods[NOURRITURE_TOTAL]; // On crée autant d'instances Nourriture que d'objets d'inventaire qui sont de la nourriture
 
int association_id[]; // Cette variable va nous permettre d'associer les ID des instances des structures avec les ID des objets d'inventaire
 
// On associe nos objets et nos structures au début du jeu
function game_start() {
  association_id = new int[Game.InventoryItemCount];
  int i, g, m, n;
  while (i < Game.InventoryItemCount) {
    if (inventory[i].GetTextProperty("Type") == "Nourriture") {
      if (n >= NOURRITURE_TOTAL) AbortGame("Le nombre d'objets d'inventaire de type Nourriture est superieur au nombre renseigne dans NOURRITURE_TOTAL");
      else {        
        association_id[i] = n;
        generals[g].item = inventory[i];
        generals[g].ItemName = inventory[i].Name;
        n++;
        g++;
      }
    }
    else if (inventory[i].GetTextProperty("Type") == "Médicament") {
      if (m >= MEDICAMENTS_TOTAL) AbortGame("Le nombre d'objets d'inventaire de type Medicament est superieur au nombre renseigne dans MEDICAMENTS_TOTAL");
      else {        
        association_id[i] = m;
        generals[g].item = inventory[i];
        generals[g].ItemName = inventory[i].Name;
        m++;
        g++;
      }
    }
    i++;
  }
}
 
// Des fonctions pour récupérer l'ID de l'instance Medicament à laquelle est associé un objet d'inventaire
int Medicament_ID(InventoryItem this*) {
  if (this.GetTextProperty("Type") != "Médicament") AbortGame("L'objet d'inventaire %d n'est pas un medicament.", this.ID);
  return association_id[this.ID];
}
int Nourriture_ID(InventoryItem this*) {
  if (this.GetTextProperty("Type") != "Nourriture") AbortGame("L'objet d'inventaire %d n'est pas de la nourriture.", this.ID);
  return association_id[this.ID];
}
Pour ton exemple particulier dans la fonction game_start, on aurait quelque chose comme ça :
Code:
function game_start() {
  int tmp_id;

  tmp_id = iBurger.Nourriture_ID();
  foods[tmp_id].PriceBuy=2.30;
  foods[tmp_id].hunger=10;
  foods[tmp_id].cooldowntimer=5;

  tmp_id = iPizza.Nourriture_ID();
  foods[tmp_id].PriceBuy=1.25;
  foods[tmp_id].hunger=8;
  foods[tmp_id].cooldowntimer=4;

  tmp_id = iSmallPack.Medecine_ID();
  medecines[tmp_id].PriceBuy=10.00;
  medecines[tmp_id].health=30;
  medecines[tmp_id].cooldowntimer=15;

  tmp_id = iMediumPack.Medecine_ID();
  medecines[tmp_id].PriceBuy=20.00;
  medecines[tmp_id].health=60;
  medecines[tmp_id].cooldowntimer=30;
}

_________________
Ga is Ga
Vous pouvez consulter l'aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php En ligne
galactichobo
C'est quoi la Tasse Bleue ?
C'est quoi la Tasse Bleue ?


Nombre de messages : 46

Date d'inscription : 24/11/2014


MessageSujet: Re: Question general sur les structs.   Mar 2 Déc 2014 - 20:11

Bon okay, un gros merci.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Question general sur les structs.   Aujourd'hui à 17:18

Revenir en haut Aller en bas
 
Question general sur les structs.
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Question general sur le doublon
» [Blind-Test]Films, séries...
» QUESTION : La contrefaçon dans le jeu vidéo ?
» Question sur cities xl 2011
» Question 3DO

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Adventure Games Studio fr :: CREATION DE JEUX :: Questions / Réponses-
Sauter vers: