|
| Lancer son premier jeu | |
| | |
Auteur | Message |
---|
Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Lun 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... |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Mar 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(); //... |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mar 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 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 Bon je vais faire un beau calcul alors |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mar 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 ? |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mar 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 ! |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mer 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. |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Mer 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 ! |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mer 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 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 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... |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Mer 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.
|
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mer 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. |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mer 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 |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Mer 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. |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Mer 10 Juin 2020 - 18:28 | |
| OK, donc je vais juste faire new pour le tableau pour le remettre à vide ! 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 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é ! |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Jeu 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 } }
|
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Jeu 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 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 ! |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Ven 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 ? |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Ven 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. |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Ven 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 ! |
| | | Arlann Cliqueur Amateur
Nombre de messages : 286
Date d'inscription : 06/04/2016
| Sujet: Re: Lancer son premier jeu Ven 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 |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Ven 12 Juin 2020 - 9:42 | |
| Ah !!! incroyable !! Très malin Et moi très bête Merci pour l'astuce ! |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Ven 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 ! |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Ven 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 ? |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Sam 13 Juin 2020 - 14:43 | |
| Pardon pour le multi posts... 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 ? |
| | | Baguettator Cliqueur Amateur
Nombre de messages : 232
Date d'inscription : 21/05/2020
| Sujet: Re: Lancer son premier jeu Ven 7 Aoû 2020 - 20:11 | |
| Je déterre ce premier sujet que j'avais créé il y a un moment 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 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 ! Mention spéciale à Arlann, valoulef et Kitai qui m'ont bien dépêtré de certains (gros) problèmes |
| | | valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
| Sujet: Re: Lancer son premier jeu Mar 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 _________________ 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.
|
| | | Adipson Adepte de la Grande Tasse Bleue
Nombre de messages : 161
Age : 52
Localisation : Hyères
Date d'inscription : 21/02/2016
| Sujet: Re: Lancer son premier jeu Sam 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 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) |
| | | Contenu sponsorisé
| Sujet: Re: Lancer son premier jeu | |
| |
| | | | Lancer son premier jeu | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |