Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment :
Smartphone Xiaomi 14 – 512 Go- 6,36″ 5G ...
Voir le deal
599 €

 

 Lancer son premier jeu

Aller en bas 
5 participants
Aller à la page : Précédent  1, 2, 3, 4, 5, 6, 7
AuteurMessage
Baguettator
Cliqueur Amateur
Cliqueur Amateur



Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyLun 8 Juin 2020 - 20:54

Bon alors j'avance, j'ai essayé d'appliquer ce que tu as proposé en oubliant mon idée de structure !

Mais le tableau de characters, je n'arrive pas à le faire fonctionner...

En haut du global script, j'ai déclaré mes variables :
int nbpersoscolonie; // la variable qui compte les personnages qui seront affichés
Character* persoscolonie[]; // le tableau de characters

Dans la fonction game_start, je déclare le tableau dynamique :
persoscolonie = new Character[nbpersoscolonie];

Je choisis les 6 persos, puis lorsque je valide, il y a quelque chose du genre :
si [amy a été sélectionnée]
{
cAmy.ChangeRoom(6);
persoscolonie[nbpersoscolonie]=cAmy;
nbpersoscolonie++;
}

Ainsi de suite pour chaque perso, on aura donc nbpersoscolonie=6 au bout du compte vu qu'on en aura sélectionné 6. Ils iront tous en room 6 (là où ils s'afficheront).

Puis j'ai créé la fonction que tu as montré, en la modifiant à ma situation :

void UpdatePositionsJoueurs()
{
int PosX = 13; // Position X de base à définir
for (int s=0 ; s < nbpersoscolonie ; s++)
{
if (persoscolonie[s].Room == 6) // si le character est présent dans la room je le positionne
{
if (s<20)
{
persoscolonie[s].x = PosX;
persoscolonie[s].y = 840;
PosX += 95 ; // Décalage horizontal en pixels pour le prochain
}
if (s>=20)
{
persoscolonie[s].x = PosX;
persoscolonie[s].y = 960;
}
}
}
}

Comme je l'ai dit le tableau de characters ne fonctionne pas, le jeu crasse sans cesse au lancement, en me disant que je suis "out of bounds". Mais je ne vois pas où est l'erreur...! J'ai encore des choses à apprendre...
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur



Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMar 9 Juin 2020 - 7:17

Il y a en effet un peu de confusion avec l’usage des tableaux dynamiques.

La taille du tableau est à définir en amont, tu peux ensuite lire et écrire seulement dans les limites de cette taille, sinon c’est le fameux « Out of bounds ».
Il est important de comprendre que si la taille est 6, les index du tableau seront 0,1,2,3,4 et 5. C'est ainsi dans la plupart des langages informatiques, il faut faire attention pour éviter les crashs.

Pour ton exemple:
Code:
Character* persoscolonie[]; // déclare le tableau de characters
int nbpersoscolonie = 6; // la taille du tableau
int indexpersoscolonie = 0; // la variable qui compte les personnages qui seront affichés

// Pour construire le tableau avant de l'utiliser
persoscolonie = new Character[nbpersoscolonie];// il a donc une taille de 6 avec des index de 0 à 5

Encore une fois il serait utile de faire une fonction dédiée à la sélection:
Code:
void AjouteDansColonie(this Character*)
{
    if ( indexpersoscolonie < nbpersoscolonie)
    {
         persoscolonie[indexpersoscolonie] = this; // ajoute le character dans le tableau
         indexpersoscolonie++; // passe à l'index suivant
    }
    if ( indexpersoscolonie == nbpersoscolonie ) // Lance le jeu si le tableau est rempli
}

Avec ça tu peux ajouter tes characters très facilement:
Code:
cWanda.AjouteDansColonie();
cAmy.AjouteDansColonie();
//...
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMar 9 Juin 2020 - 9:11

OK, et ça MARCHE !!!

Vraiment merci pour le coup de main, car je commençais à bien m'y perdre !

Du coup, j'ai donné au tableau la valeur d'une constante qui est 40 (y aura jamais plus de characters dans la room, et de toute façon, je crois que c'est la limite ?)
Les persos s'alignent sur deux lignes, 20 par ligne maxi.

Du coup j'ai adapté la fonction de placement :

Code:
void UpdatePositionsJoueurs(this Character*)
        {
          int PosX = 13;  // Position X de base à définir
          for (int s=0 ; s < nbpersoscolonie ; s++)
          {
              if (persoscolonie[s].Room == 6) // si le character est présent dans la room je le positionne
              {
                if (s<20)
                {
                persoscolonie[s].x = PosX;
                persoscolonie[s].y = 840;
                PosX += 95 ; // Décalage horizontal en pixels pour le prochain
                }
                if (s>=20)
                {
                  persoscolonie[s].x = PosX;
                  persoscolonie[s].y = 960;
                  PosX += 95 ;
                }
              }
          }
        }

Le seul problème : le premier perso est positionné légèrement en dehors de l'écran de la room (qui a pourtant bien les mêmes dimmensions que le jeu, à savoir : 1920*1080). Je vais regarder pourquoi. En tout cas, les autres sont bien rangés comme prévu, c'est très beau à voir sourire

EDIT : ok, je me doutais que ça allait être quelque chose du genre, mais je viens de lire que character.x et character.y font référence aux coordonnées du centre-bas de la sprite du perso. Tout pour arranger grand sourire
Bon je vais faire un beau calcul alors sourire
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMar 9 Juin 2020 - 9:45

Alors, pour revenir sur cette histoire de jeu ralenti : j'ai compilé le jeu pour voir où j'en suis, et je l'ai lancé hors AGS. Le dossier du jeu compilé fait... 2Go !!!

J'ai l'impression que c'est beaucoup, mon jeu n'a aucune animation et pas de 3D.

Alors j'ai beaucoup de Sprites (1500 pour l'instant) mais essentiellement des sprites de petites dimmensions (90*110). Bon y en a quand même des 1920*1080 (résolution de mon jeu). C'est ça qui fait prendre beaucoup de place ?
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMar 9 Juin 2020 - 16:34

Bonjour à nouveau,

Bon je vais vers de nouveaux problèmes, mais ça devrait être les derniers gros problèmes :

Juste je commence à m'emmêler dans tout ça. Et je veux juste vérifier que j'ai compris ce qu'il faut faire.

Maintenant que mes personnages arrivent bien dans la room 6 (la "base" de l'équipe) et qu'ils sont bine alignés, je voudrais faire de même pour les envoyer en expedition.

C'est à dire : le joueur choisis au moins un perso qui ira en expedition (room 7), puis qui reviendra à la base (room 6). ça peut donc être des expeditions de 1 perso jusqu'à tous les persos de la base !

Donc j'ai procédé comme suit :

- une constante dans le header : #def MAXPERSOSEXPEDITION 36 // pas besoin d'aller plus haut, le joueur en aura jamais autant en expedition.

- variables déclarées en haut du global script : int nbpersosexpedition ET int indexpersosexpedition;

- Un nouveau tableau de characters en haut de mon global script : Character* persoexpedition[];

Jusque là, je pense que ça va, en gros j'ai fait la même chose que pour l'autre en remplaçant "colonie" par "expedition".

J'ai ajouté dans la structure des personnages un attribut : Expedition, une booléenne (comme Mort) qui permet de vérifier si le perso va partir en expedition ou non. L'idée c'est qu'une fois qu'on a choisi les persos qui vont en expedition, une boucle va "scanner" ceux qui ont été sélectionné (donc ceux dont this.expedition=true).

Pour faire varier cette booléenne, lorsque je dois choisir les personnages, je clique sur celui que je veux choisir et son this.expedition devient true.

Seulement, ça ne fonctionne pas.

J'ai déclaré ça comme ça :

dans la structure header :
Code:
import attribute bool Mort, Expedition;
  protected bool mort, expedition;
[...]
import bool get_Expedition(); // $AUTOCOMPLETESTATICONLY$
  import bool set_Expedition(); // $AUTOCOMPLETESTATICONLY$

dans le global script, exemple en cliquant sur Amy :

Code:
function cAmy_AnyClick()
{
if (mouse.Mode==eModeWalkto)
{
playerID=cAmy.GetProperty("PersonnageID");
if (personnage[playerID].Zombivant==0)
{
  gInterfacepersos.Visible=true;
  Fondinterfacepersos.NormalGraphic=1517;
  Interfacepersonom.Text=personnage[playerID].Nom;
}
else
{
  gInterfacepersoszombivant.Visible=true;
  Fondinterfacepersoszombivant.NormalGraphic=1527;
  Interfacezombinom.Text=personnage[playerID].Nom;
}
}
else
{
  playerID=cAmy.GetProperty("PersonnageID");
  if (personnage[playerID].Expedition==false)
  {
    personnage[playerID].Expedition=true;
    nbpersosexpedition++; // on compte 1 perso qui part, ce sera utile pour la boucle plus tard
  Display("OUAIS !!!");
  }
  else
  {
    personnage[playerID].Expedition=false;
    nbpersosexpedition--;
    Display("Ohhh...");
  }
}
}

Mais en testant ça, player[ID].Expedition est toujours faux, car j'ai beau cliqué et recliquer dessus, ça ne fait rien d'autre... J'ai fait une erreur quelque part ?

PS : lorsque je dois choisir les persos qui partent en expedition, la souris change de mode, j'ai fait ça pour séparer les deux actions (plus clair pour moi, et ça permettra peut-être de changer l'icone de la souris au passage). En tout cas aucun problème de ce côté, ça fonctionne.

EDIT : PARDOOOOOOONN !!! J'avais mis cette booléenne en protégée par la structure... Effectivement ça pouvait pas marcher. Tout va bien !!! Je vais essayer de créer la loop pour faire le scan !
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 10:26

Bonjour,

Pardon pour tous ces messages désordonnés, j'ai un peu panniqué ces derniers temps, en arrivant à faire fonctionner les choses à moitié, je me suis un peu emporté...

Pour l'instant, j'en suis au point où les personnages sont bien arrivés dans la room 6.

Maintenant je dois en choisir certains et les envoyer dans la room 7 (la room d'expedition). J'ai donc créé un autre tableau (persosexpedition). J'ai créé deux fonctions pour ajouter les persos sélectionnés dans ce tableau, puis pour les positionner alignés dans la room 7.

MON PROBLEME : je rencontre des erreurs "null pointer referenced". Et je ne vois vraiment pas ce qui cloche. Parfois, le personnage est bien envoyé en room 7, puis il revient bien en room 6 à la fin de l'expedition. Parfois je veux en envoyer deux, et c'est là que ça crashe.

Je mets des aperçus de mon script pour illustrer comment je m'y suis pris.

Les deux fonctions pour ajouter dans le tableau persosexpedition :

Code:
// Positionnement des persos en expedition
void UpdatePositionsExpedition(this Character*)
{
int PosX = 58;  // Position X de base à définir
for (int s=0 ; s < nbpersosexpedition ; s++)
{
  if (persosexpedition[s].Room == 7) // si le character est présent dans la room je le positionne
  {
    if (s<16)
    {
      persosexpedition[s].x = PosX;
      persosexpedition[s].y = 950;
      PosX += 95 ; // Décalage horizontal en pixels pour le prochain
    }
    if (s>=16)
    {
      persosexpedition[s].x = PosX;
      persosexpedition[s].y = 1070;
      PosX += 95 ;
    }
  }
}
}

void AjouteDansExpedition(this Character*)
{
if ( indexpersosexpedition < MAXPERSOSEXPEDITION)
  {
    persosexpedition[indexpersosexpedition] = this; // ajoute le character dans le tableau
    indexpersosexpedition++; // passe à l'index suivant
  }
}

Quand j'ia choisi les persos pour l'expedition, on appuie sur le bouton :

Code:
// Boutons Nouvelle expedition
function Continuerdeckzombie_OnClick(GUIControl *control, MouseButton button)
{
gNouvelleexp.Visible=false;
for (int i=0 ; i<50 ; i++)
{
  if (personnage[i].expedition==true)
  {
    personnage[i].Acteur.ChangeRoom(7);
    personnage[i].Acteur.AjouteDansExpedition();
    personnage[i].Acteur.UpdatePositionsExpedition();
  }
}
player.ChangeRoom(7);
}

Exemple d'un personnage, lorsqu'on clique dessus (j'ai utilisé un autre mode de souris pour le choisir pour l'expedition) :

Code:
function cAmy_AnyClick()
{
if (mouse.Mode==eModeWalkto)
{
playerID=cAmy.GetProperty("PersonnageID");
if (personnage[playerID].Zombivant==0)
{
  gInterfacepersos.Visible=true;
  Fondinterfacepersos.NormalGraphic=1517;
  Interfacepersonom.Text=personnage[playerID].Nom;
}
else
{
  gInterfacepersoszombivant.Visible=true;
  Fondinterfacepersoszombivant.NormalGraphic=1527;
  Interfacezombinom.Text=personnage[playerID].Nom;
}
}
else
{
  playerID=cAmy.GetProperty("PersonnageID");
  if (personnage[playerID].expedition==false)
  {
    personnage[playerID].expedition=true;
    nbpersosexpedition++;
  Display("OUAIS !!!");
  }
  else
  {
    personnage[playerID].expedition=false;
    nbpersosexpedition--;
    Display("Ohhh...");
  }
}
}

J'espère que je suis clair, car vraiment je me sens impuissant face à ces manipulations... J'avais l'impression d'avoir compris comment cela fonctionnait, et là, je crois que pas vraiment... Donc si quelqu'un veut bien m'aider à résoudre cela, je serai très reconnaissant, car je suis à bout de souffle !
S'il faut, je peux résumer la situation entièrement, car les messages de ce sujet se sont empilés, et c'est peut-être incompréhensible. Voir je peux faire un nouveau sujet si ça peut aider.
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann


Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 11:58

"null pointer referenced" veut dire que tu essayes d’exécuter une méthode/fonction sur un pointeur qui est vide. Comme tu utilises des tableaux de pointeurs il faut être très rigoureux.

En regardant un peu je pense que cela peut venir de tes pointeurs Acteur dans ta struct Personnage, car tu fais une boucle sur 50 index. Ont-ils tous un Character assigné à leur pointeur ?

Cela peut aussi venir de tes tableaux de pointeurs pour les expéditions puisque tu utilises également des boucles, mais je ne comprends plus à quoi correspondent tes variables/constantes nbpersosexpedition , indexpersosexpedition et MAXPERSOSEXPEDITION.

Je crois que tu utilises des tableaux surdimensionnés pour pouvoir ajouter des éléments dans les espaces vides sans détruire le tableau. Pour utiliser une boucle sur tous les index du tableau tu devrais avoir une variable qui connait exactement le nombre d’éléments qu’il contient et ne pas utiliser sa taille comme référence, sinon tu vas exécuter le code sur des pointeurs vides.

Pour sécuriser ce genre de crash il faut comparer le pointeur au mot clé null avant de lui demander d’exécuter quelque chose qu’il ne peut pas faire à vide.
Exemple :
Code:
if ( persosexpedition[i] != null ) persosexpedition[i].FaitQuelqueChose();
Une approche plus propre serait d’utiliser la méthode de @Kitai pour ajouter/retirer des éléments aux tableaux, ce qui t’assurerait d’avoir toujours la bonne taille par rapport au nombres d’élément.

Bon courage !
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 12:54

Alors j'ai bien mis cette vérification (if persosexpedition[i] != null), cela évite le crash désormais. Mais ça ne fonctionne pas comme il faudrait : les personnages repartent bien dans la room 6 après l'expedition, mais ils se repositionnent bizaremment...

Peut-être qu'il faudrait reprendre depuis le début pour effectivement être rigoureux, parce que j'ai dû faire le bazar !

CE QUE JE VEUX FAIRE :
- la room 6 est dédiée à la "base" du joueur, où sont affichés les personnages de son équipe en bas, alignés/ La room 7 est dédiée aux "expeditions", où des personnages de la base sélectionnés sont envoyés. A la fin de l'expedition, les personnages retournent en room 6 (à la base), et se repositionnent, ainsi que ceux qui étaient restés (on repositionne tout le monde en gros).
- il y a 50 personnages dans le jeu, on peut en avoir 40 maxi dans la base (constante MAXIPERSOSCOLONIE), et 32 maxi en expedition (constante MAXIPERSOSEXPEDITION).

CE QU'ON A DEJA FAIT :
- un tableau dynamique qui compte les personnages dans la base : persoscolonie
- un tableau dynamique qui compte les personnages en expedition : persosexpedition
- un script "Fiche Personnage" qui crée les 50 personnages au lancement du jeu. Ils ont le même numéro (index) dans le tableau "personnage" que leur ID dans le jeu (le player.character est invisible avec l'ID 0, puis les autres characters ont un ID de 1 à 50).
- une structure qui gère les paramètres de tous les personnages. Tous les persos de la Structure ont un pointeur .Acteur, déclaré : Character *Acteur;
- on a utilisé les deux constantes pour définir la taille du tableau dynamique. Cela permet d'avoir toujours le nombre d'éléments nécessaires, même s'ils ne sont pas attribués. Visiblement cela n'a pas posé problème pour "aligner" 6 personnages en room 6, mais peut-être qu'une partie de l'erreur réside là-dedans.

- on a plusieurs variables : nbpersoscolonie compte les personnages dans la colonie. nbpersosexpedition compte les personnages en expedition.
- j'ai rajouté dans la structure des persos une booléenne (non protégée !) : expedition. Cela permet de vérifier si on a sélectionné le personnage pour aller en expedition.

on a deux fonctions pour ajouter des persos dans le tableau persoscolonie et les positionner correctement :

Code:
// Positionnement des persos dans la colonie
void UpdatePositionsJoueurs(this Character*)
{
int PosX = 58;  // Position X de base à définir
for (int s=0 ; s < nbpersoscolonie ; s++)
{
  if (persoscolonie[s] != null && persoscolonie[s].Room == 6) // si le character est présent dans la room je le positionne
  {
    if (s<20)
    {
      persoscolonie[s].x = PosX;
      persoscolonie[s].y = 950;
      PosX += 95 ; // Décalage horizontal en pixels pour le prochain
    }
    if (s>=20)
    {
      persoscolonie[s].x = PosX;
      persoscolonie[s].y = 1070;
      PosX += 95 ;
    }
  }
}
}

void AjouteDansColonie(this Character*)
{
if ( indexpersoscolonie < MAXPERSOSCOLONIE)
  {
    persoscolonie[indexpersoscolonie] = this; // ajoute le character dans le tableau
    indexpersoscolonie++; // passe à l'index suivant
  }
}

On a les mêmes fonctions pour faire de même avec les persos qui vont en expedition (juste imaginer que persoscolonie devient persosexpedition, etc...).

Quand je pars en expedition, je choisis les personnages :

- chaque personnage choisi fait this.expedition=true. Et nbpersosexpedition++. Si on choisit de ne plus l'envoyer, this.expedition=false et nbpersosexpedition--.

- lorsque j'ai choisi les personnages qui m'intéressent, je clique sur "OK", et je crée une boucle qui "scanne" l'ensemble des personnages du jeux et vérifie ceux qui ont : this.expedition=true
Code:
for (int i=1 ; i<=50 ; i++)
{
  if (personnage[i].expedition==true)
  {
    personnage[i].Acteur.ChangeRoom(7);
    personnage[i].Acteur.AjouteDansExpedition();
    personnage[i].Acteur.UpdatePositionsExpedition();
    nbpersoscolonie--;
  }
}

Puis on arrive en room 7 (là où l'expedition a lieu).

Les personnages partis en expedition sont donc ajoutés au tableau persosexpedition et placés correctement grâce aux deux fonctions. J'ai d'ailleurs l'impression que cela marche jusqu'ici, mais bon, je ne me réjouis pas trop vite sourire

Lorsqu'on quitte l'expédition, on appuie sur un bouton et j'ai scripté ça ainsi :
Code:
persoscolonie = new Character[1]; // je change la taille du tableau pour le réinitialiser (le vider)
persoscolonie = new Character[MAXPERSOSCOLONIE]; // je lui redonne la bonne taille, mais cette fois il est donc vide
nbpersoscolonie=0; // je réinitialise cette variable
nbpersosexpedition=0;
for (int i=1 ; i<=50 ; i++)
{
  if (personnage[i].Acteur.Room==7 || personnage[i].Acteur.Room==6) // si le perso est room 6 à ce moment là : il n'est pas allé en expedition mais il est resté dans la colonie. donc on le place également
  {
    personnage[i].expedition=false;
    personnage[i].Acteur.ChangeRoom(6); // on l'envoie en room 6 si ce n'est déjà fait
    nbpersoscolonie++; // vu qu'on l'a réinitialisé, on lui fait un +1 pour compter les persos qui seront dans la colonie
    personnage[i].Acteur.AjouteDansColonie(); // on ajoute dans le tableau persoscolonie (qui doit être réinitialisé)
    personnage[i].Acteur.UpdatePositionsJoueurs(); // on positionne correctement le personnage
  }
}
persosexpedition= new Character[1]; // on réinitialise le tableau persosexpedition pour qu'il soit vide, il reservira et sera rempli pour la prochaine expedition
persosexpedition = new Character[MAXPERSOSEXPEDITION];
player.ChangeRoom (6); // on retourne en room 6 voir le résultat (qui pour l'instant est pas terrible...)

Dans mes tests, les personnages vont bien en expedition lorsque c'est la première fois (ils sont bien positionnés). Lorsqu'ils reviennent en room 6, c'est bizarre. Si je relance une expedition, les persos vont en room 7 mais gardent le même placement qu'ils avaient en room 6 (donc il peut y avoir des trous), et si on les ramène en room 6, ils gardent la même position.

J'ai l'impression que la réinitialisation des tableaux ne marche pas comme je l'ai fait. Et peut-être qu'effectivement la fonction de @Kitai serait une solution, mais je ne comprends pas comment l'employer, car c'est... très complexe pour moi actuellement langue

Si @Kitai passe par ici, aurait-il une idée/suggestion pour utiliser sa fonction ?

Après peut-être que mes boucles sont fausses, et que c'est ça qui foire. Mais j'ai l'impression que non, car lors du premier départ en expedition, tout se passe comme prévu. Donc tout va bien la première fois qu'on utilise le tableau, mais après...
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann


Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 13:33

C'est un peu délicat de comprendre tout le fonctionnement mais j'ai le sentiment que le problème vient de la fonction ChangeRoom , car il est notifié dans la doc :
Citation :
IMPORTANT : Cette commande ne change pas la pièce immédiatement ; le changement de pièce n'a en fait lieu que lorsque le script a fini de s'exécuter (ceci afin d'éviter les problèmes causés par le déchargement du script alors qu'il est toujours en exécution). Cela signifie que vous ne devriez utiliser aucune commande qui concerne la nouvelle pièce (position d'objets, etc.) après cette commande dans le même code.
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 13:45

Ah... ça pourrait impliquer qu'effectivement il y a un problème...

Cela voudrait sans doute dire qu'il faut que je lance les boucles au moment où le player.character arrive en room 6. Mais dans le script de la room6, je ne peux pas faire personnage[i].Acteur.AjouteDansColonie, ni personnage[i].AjouteDansColonie...

Cela est dû à un problème d'import / export entre les scripts ?

EDIT : je viens de lire un post, effectivement on peut "importer" des fonctions pour que les scripts de room aient accès à des fonctions du global script ! Je vais tester en plaçant mes boucles lors du fade-in de ma boucle.
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 15:40

Alors je viens d'essayer, et j'ai toujours le même genre de problème :

- la première expédition, tous les persos sont bien alignés dans la room 7
- retour en room 6 : le premier personnage qui était parti en expédition se place en première position dans la room 6 (donc souvent il recouvre un autre personnage qui n'était pas allé en expédition)
- les autres personnages partis en expedition (room 7) restent à la même place qu'ils avaient en room 6
- si je lance une deuxième expedition : les persos qui y vont ont la même place qu'ils avaient lorsqu'ils étaient en room 6.

EDIT : je crois que ça marche !!!!! En fait, avant de lancer les boucles j'avais bien réinitialisé les tableaux persoscolonie et persosexpedition, mais... j'avais pas réinitialisé les indexpersoscolonie et indexpersosexpedition ! D'où les placements bizarres... Bon je fais des tests plus poussés et je vous tiens au courant si c'était une fausse lueur d'espoir sourire
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann


Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 17:34

Baguettator a écrit:
persoscolonie = new Character[1]; // je change la taille du tableau pour le réinitialiser (le vider)
persoscolonie = new Character[MAXPERSOSCOLONIE]; // je lui redonne la bonne taille, mais cette fois il est donc vide
nbpersoscolonie=0; // je réinitialise cette variable
nbpersosexpedition=0;

Si tu utilises le mot clé new le présent tableau est détruit donc tu n’as pas besoin de la ligne d’avant pour le « vider ».
Pour détruire un tableau qui n’est plus utile afin de libérer la mémoire il faut juste faire :
Code:
persoscolonie = null;

Baguettator a écrit:
Mais dans le script de la room6, je ne peux pas faire personnage[i].Acteur.AjouteDansColonie, ni personnage[i].AjouteDansColonie...

Cela est dû à un problème d'import / export entre les scripts ?

Si ce sont des méthodes de ta structure elles devraient déjà être accessibles depuis tous les autres scripts pourtant.

Tant mieux si ça marche, mais du coup je ne comprends pas à quoi te sert indexpersoscolonie et indexpersosexpedition puisque tu utilises nbpersoscolonie et nbpersosexpedition pour compter les éléments présents dans les tableaux, j'ai l’impression que tu te compliques les choses avec deux fois les mêmes variables.
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMer 10 Juin 2020 - 18:28

OK, donc je vais juste faire new pour le tableau pour le remettre à vide ! sourire

Pour les fonctions AjouteDansColonie, ce sont des fonctions du global script, pas des fonctions de la structure. Tu penses que ce serait plus simple si on les intégrait dans la fonction ? Actuellement je les ai importées dans le Header du Global script, elles sont accessibles à tous, ça m'a au moins permis de mieux comprendre la différence entre header et corps de script sourire

J'ai le sentiment que indexpersocolonie donne une ligne au personnage dans le tableau persocolonie, alors que nbpersocolonie permet de vérifier combien de persos ont été choisis. Mais peut-être que ça peut être réduit à une variable, je vais étudier ça. Si jamais tu vois que c'est vraiment un doublon inutile, n'hésite pas à me l'indiquer, mais je cherche aussi de mon côté ! sourire
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann


Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyJeu 11 Juin 2020 - 12:14

Baguettator a écrit:
Pour les fonctions AjouteDansColonie, ce sont des fonctions du global script, pas des fonctions de la structure. Tu penses que ce serait plus simple si on les intégrait dans la fonction ?
Il n'y a pas d'obligation mais c'est un peu le but de la structure de contenir toutes les méthodes qui la composent. Par contre si tu veux utiliser des attributes ou des variables writeprotected, c'est obligatoire.

Baguettator a écrit:
J'ai le sentiment que indexpersocolonie donne une ligne au personnage dans le tableau persocolonie, alors que nbpersocolonie permet de vérifier combien de persos ont été choisis.
Pour visualiser :
Tu as un tableau vide et une variable compteur à 0. Tu ajoutes un élément à l’index compteur (donc 0 pour le moment),
tableau[compteur] = élémentA ;
Le tableau contient un nouvel élément donc tu incrémentes le compteur :
compteur += 1 ;
Tu ajoutes encore un élément à l'index suivant (le compteur qui vaut 1)
tableau[compteur] = élémentB;
Tu incrémentes compteur += 1 ;
Du coup compteur te sert à la fois à indexer un nouvel élément dans le tableau et pour te dire combien il contient d’éléments si tu veux le parcourir par une boucle.

Concernant l'utilisation de tableaux avec des index libres ou des tableaux qui s'adaptent à la taille de la colonie, les deux sont possibles. J'ai l'impression que la deuxième solution est plus adaptée à ton cas, puisque tu veux te servir des tableaux pour mémoriser des ordres de sélections et que cette opération va se répéter plusieurs fois.
J'ai essayé d'adapter la méthode de @kitai à ton cas, regarde si cela peut t'aider:
Code:
Character* persoscolonie[];
int nbpersoscolonie;

void ArriveDansColonie(this Character*)
{
  // Vérifie si le personnage n'est pas déjà dans le tableau colonie
  bool dejaDansLaColonie = false ;
  for ( int i = 0 ; i < nbpersoscolonie ; i++ )
  {
    if ( persoscolonie[i] == this ) dejaDansLaColonie = true ;
  }
  
  // S'il n'y est pas, augmente la taille du tableau pour l'ajouter
  if ( dejaDansLaColonie == false )
  {
    // sauvegarde dans un tableau temporaire plus grand
    Character *temp[] = new Character[nbpersoscolonie+1];
    for ( int i = 0 ; i < nbpersoscolonie ; i++ ) temp[i] = persoscolonie[i];
    // ajoute un perso
    temp[nbpersoscolonie] = this ;
    nbpersoscolonie++;
    persoscolonie = temp ;
  }
}

void QuitteLaColonie(this Character*)
{
  // Cherche l'index du personnage dans le tableau colonie
  int index = -1 ;
  for ( int i = 0 ; i < nbpersoscolonie ; i++ )
  {
    if ( persoscolonie[i] == this ) index = i ;
  }
  
  if ( index >= 0 ) {
    nbpersoscolonie--; // Si l'index est valide on retire le personnage
    if ( nbpersoscolonie > 0 ) // si le tableau contient au moins un élément
    {
      Character *temp[] = new Character[nbpersoscolonie];
      int j = 0 ;
      for ( int i = 0 ; i < nbpersoscolonie ; i++ )
      {
        if ( j == index ) j++ ;
        temp[i] = persoscolonie[j];
        j++;
      }
      persoscolonie = temp ;
    }
    else persoscolonie = null ; // sinon on détruit la tableau
  }
}
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyJeu 11 Juin 2020 - 14:49

Effectivement je viens de regarder, ça a l'air intéressant ! Ce qui veut dire que :

- je déclare le tableau persoscolonie avec une taille prédéfinie au lancement du jeu (sinon ça crashe)

- puis lorsque des personnages rejoignent ou quittent le groupe, je leur applique l'une ou l'autre de ces fonctions pour qu'ils intègrent le tableau

- ensuite je leur applique les fonctions UpdatePositionJoueurs (celle que tu avais écrite plus tôt pour les aligner correctement) pour les placer à côté de ceux qui y sont déjà

C'est bien cela ?

EDIT : malgré tout, j'ai réussi à faire fonctionner ce que je voulais. A chaque fois je réinitialise les tableaux, et je fais des boucles qui scannent les personnages concernés par l'action. En tout cas, j'arrive à ajouter des persos dans l'expedition, qui rejoignent ensuite la colonie, et sont toujours bien rangés. C'est peut-être pas dans les règles de l'art, mais ça marche !
Je me penche quand même sur l'autre solution avec les tableaux qui s'agrandissent. Mais ça va peut-être demander une relecture de tout le script, ça risque d'être fastidieux...
Mais je garde ça en tête pour plus tard, je pourrai le tester sur une copie "backup" du jeu, pour ne pas avoir peur de tout détruire ce que j'ai déjà fait sourire

Question qui n'a rien à voir : j'aurai peut-être encore de l'aide à demander sur ce forum, mais @Arlann, @valoulef et @Kitai, vous m'avez énormément aidé, et je tiens à vous remercier très chaleureusement ! Je serais ravi de vous mentionner dans les "crédits" du jeu et de faire part de toute l'aide cruciale que vous m'avez apportée. Etes-vous d'accord que je vous cite, et si oui, avec quel nom/pseudo/autre appellation ou information vous concernant ?

En tout cas, vraiment merci, parce que je partais de vraiment rien en matière de programmation, et j'ai appris beaucoup de chose grâce à vous ! grand sourire
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 8:20

Au passage : @Arlann, tu m'as dit qu'on pouvait créer plusieurs scripts pour que le travail soit mieux organisé et plus clair à lire (plutôt qu'avoir des milliers de lignes de code qui s'enchaînent...).

J'imagine que dans ma situation, ce serait plus simple de, par exemple, avoir un script où je mets toutes les fonctions "lorsqu'on clique sur un personnage, qu'est-ce que ça fait", dans un autre script "lorsqu'on clique sur les boutons des menus, qu'est-ce que ça fait" etc...

Pour réaliser cela, j'ai l'impression qu'il faut exporter toutes les fonctions pour qu'elles soient dispos pour tous les scripts ? ça voudrait dire que j'organise mes scripts comme ça :

- Twoclick handler (créé par le jeu par défaut)

- script 1 boutons de menus

- script 2 clics sur characters

[...]

- script Struc_Personnage

- script Fiche_Personnage

- Global script

- Rooms script

Ainsi les fonctions pourraient être utilisées n'importe où ?

Mais est-ce qu'une fonction liée à un bouton/character ("on_click" par exemple) peut se trouver ailleurs que dans le Global script ?
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann


Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 9:16

Baguettator a écrit:
Mais est-ce qu'une fonction liée à un bouton/character ("on_click" par exemple) peut se trouver ailleurs que dans le Global script ?
Non tous les événements des GUI/Character/Item sont obligatoirement déclenchés depuis le global script, tu ne peux pas déplacer les fonctions qu’AGS créé automatiquement, mais tu peux très bien demander à cette fonction d’en appeler une autre depuis un autre script si tu veux ranger par thématique.
Si tu utilises 50 boutons pour faire la même action sur 50 Characters différents tu as tout intérêt à avoir une seule fonction générique avec le character en argument. La placer dans un script dédié (au dessus) peut te permettre de la retrouver facilement mais ce n’est pas obligatoire.
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 9:21

Hélas, je l'ai déjà fait, moi ce qui m'aurait arrangé c'est de trier les fonctions "anyclickon" des characters, parce que ça prend plein de place dans le global script... Tant pis !

Merci ! sourire
Revenir en haut Aller en bas
Arlann
Cliqueur Amateur
Cliqueur Amateur
Arlann


Nombre de messages : 286

Date d'inscription : 06/04/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 9:40

Je ne suis peut être pas clair, ton global script peut ressembler à ça :
Code:
function cChar1_AnyClick()   { cChar1.FaitQuelqueChose(); }
function cChar2_AnyClick()   { cChar2.FaitQuelqueChose(); }
function cChar3_AnyClick()   { cChar3.FaitQuelqueChose(); }
function cChar4_AnyClick()   { cChar4.FaitQuelqueChose(); }
//...
et mettre ta fonction FaitQuelqueChose() ailleurs.


Dernière édition par Arlann le Ven 12 Juin 2020 - 11:16, édité 1 fois
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 9:42

Ah !!! incroyable !! Très malin sourire

Et moi très bête langue

Merci pour l'astuce !
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 10:10

Alors j'essaye de mettre en pratique ce que tu m'as dit, donc je redéfinis les variables nécessaires dans le nouveau script créé (qui est plus haut que mon global script), je les importe/exporte, mais j'ai une erreur bizarre :

Error : expected "," or ";", not "int".

C'est dans mon header du nouveau script, que j'ai rédigé comme ça :

Code:
// new module header

import int nbpersosexpedition;

import function Anyclick_Personnage(this Character*);

Et je l'ai bien exportée en bas du script module. Là je vois pas l'erreur, c'est bizarre ?

EDIT : oups pardon, je me suis fourvoyé, l'erreur était dans le script module pas dans le header... une bêtise, pardon !
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 12 Juin 2020 - 14:28

Bon néanmoins j'ai des soucis pour créer de nouveaux scripts pour alléger mon global script :

J'essaye d'instancier les tableaux dont j'ai besoin dans mes codes au début des scripts "secondaires", mais AGS me signale une erreur. Je déclare comme ça, en haut du script.asc :

Code:
int nbdogtrouve;
int indexdogtrouve;
Character* dogtrouve[];

Et AGS me dit une erreur pour l'instanciation du tableau "dogtrouve" : Error (line 5): Attributes of identifier do not match prototype

C'est pourtant comme cela qu'on déclare un tableau pour la première fois ?
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptySam 13 Juin 2020 - 14:43

Pardon pour le multi posts... triste

En fait, j'ai vraiment des soucis à placer des fonctions sur des scripts dédiés pour alléger le Global Script.

J'ai essayé de reporter les fonctions AjouteDansColonie et UpdatePositionDans Colonie, et AGS crashe en disant : AjouteDansColonie n'est pas un "public member" de "Character".

Qu'est-ce que cela veut dire ?
Revenir en haut Aller en bas
Baguettator
Cliqueur Amateur
Cliqueur Amateur
Baguettator


Nombre de messages : 232

Date d'inscription : 21/05/2020


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyVen 7 Aoû 2020 - 20:11

Je déterre ce premier sujet que j'avais créé il y a un moment sourire

Juste pour dire que depuis j'ai l'impression d'avoir beaucoup progressé dans l'utilisation d'AGS, j'ai réussi à scripter PLEIN de choses grâce à tous vos conseils, et donc je voulais juste vous remercier, pour toute l'aide et la patience dont vous faites preuve grand sourire clin d'oeil

Je suis en train de simplifier mon code, car avec tout ce que j'ai appris depuis deux mois, je me rends compte que j'ai scripté certaines choses de manière assez massive là où de bonnes vieilles boucles ou une approche plus "générique" de certains aspects permettent de réduire considérablement le code, tout en le rendant plus pratique à manipuler, notamment si on doit rajouter du contenu sans avoir à trifouiller partout. Je crois que en quelques jours, j'ai divisé par 2 la taille de certains scripts (dont le global script !!)

Voilà, pardon pour ce sentimentalisme, mais je vous remercie chaleureusement, ce genre d'entraide sur de tels forums sont autant de preuves que l'homme est capable de faire des choses sympas ! sourire

Mention spéciale à Arlann, valoulef et Kitai qui m'ont bien dépêtré de certains (gros) problèmes grand sourire
Revenir en haut Aller en bas
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptyMar 22 Sep 2020 - 11:28

Salut @Baguettator ! Ravi que tu aies pu avancer dans ton projet et dans l'apprentissage d'AGS, et ravi d'avoir pu t'y aider ! Ce que tu décris rappelle de bons souvenirs clin d'oeil

_________________
Vous êtes déjà allés à Condate ? Ils ont un petit vin qui à un goût de pierre à catapulte. C'est Toutatis en culotte de velours si j'ose m'exprimer ainsi.
Revenir en haut Aller en bas
Adipson
Adepte de la Grande Tasse Bleue
Adepte de la Grande Tasse Bleue
Adipson


Nombre de messages : 161

Age : 52

Localisation : Hyères

Date d'inscription : 21/02/2016


Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 EmptySam 14 Nov 2020 - 5:25

Baguettator a écrit:


Mention spéciale à Arlann, valoulef et Kitai qui m'ont bien dépêtré de certains (gros) problèmes grand sourire

Ce sont en effet des passionnés qui méritent vraiment un remerciement infini.
Je ne calcule pas le nombre de fois où je leur ait posé des casses-tête et j'ai toujours eue de l'aide.
Sans eux, j'aurai abandonné mon gros projet très vite !
Vive la communauté AGS fr !
(d'ailleurs je reviens souvent faire un petit tour dessus, la preuve encore aujourd'hui) grand sourire

_________________
Adipson Studio
Point&Click
Revenir en haut Aller en bas
http://www.adipson.com
Contenu sponsorisé





Lancer son premier jeu - Page 7 Empty
MessageSujet: Re: Lancer son premier jeu   Lancer son premier jeu - Page 7 Empty

Revenir en haut Aller en bas
 
Lancer son premier jeu
Revenir en haut 
Page 7 sur 7Aller à la page : Précédent  1, 2, 3, 4, 5, 6, 7
 Sujets similaires
-
» Mon premier jet
» Tiens, je suis le premier?
» Mon premier post/plein de questions.
» premier achat d'un jeu fait avec AGS
» Command and conquer premier du nom dispo en libre chargement

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: