Bonjour à tous.
Je me suis (enfin) remis à King of Planastel, ce qui signifie en fait que j'ai tout recommencé à zéro et décidé dorénavant de réfléchir AVANT d'agir.
Suivant ce nouveau précepte, je viens ici vous demander des avis avant de me lancer à corps perdu dans quelque chose qui ne fonctionnera peut-être pas.
Voilà : Je voudrais créer pour mon jeu des dialogues, ou du moins des menus de choix non-bloquants.
Au cours du jeu en effet, le joueur va faire face à divers événement qui lui demanderont de faire des choix, façon fiction interactive. La fonction dialogue d'AGS est bien pratique pour mettre ceci en place MAIS, je voudrais aussi que le joueur puisse demander leur avis aux compagnons qui l'accompagnent en cliquant dessus.
Un exemple idiot pour illustrer ce que je veux faire :
- Code:
-
Display("Vous faites face à un monstre.");
dMonstre.Start();
//Les 3 options de dMonstre s'affichent alors à l'écran ( a)Combattre, b)Fuir, c)Jouer de la trompette")
//et ailleurs dans mon script j'ai un
function cCopain_interact{
cCopain.Say("Je ne pense pas que ce soit une bonne idée de jouer de la trompette");
}
//qui s'éxecute même si la fenêtre de dialogue est ouverte
Avec la fonction dialogue par défaut d'AGS, cela ne marche pas, une fois la fenêtre de dialogue ouverte, aucune interaction n'est permise sinon de faire un choix.Même pas via un repetedly execute always. Je cherche donc un moyen de contourner ce problème, et j'ai déjà imaginé plusieurs solutions.
Solution 1:
Il existe un moyen de désactiver la fonction bloquante des dialogues d'AGS et je suis trop idiot pour la trouver.
Solution 2:
Créer un affichage des dialogues personnalisé comme expliqué ici
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php?id=personnalisation_de_l_affichage_des_options_des_dialogues. Peut-être que je pourrais me servir du function dialog_options_mouse_click ? Le problème c'est que je ne vois pas trop comment et que le
- Citation :
- IMPORTANT : Les quatre fonctions de dialogue personnalisées sont toutes exécutées sur le fil non-bloquant. Cela signifie que vous ne devriez pas appeler de fonction bloquante, telles que Character.Say, Wait ou Display, à l'intérieur car elles pourraient ne pas se comporter correctement.
ne m'encourage guère dans cette voie
Solution 3 :
Abandonner complètement l'outil dialogue d'AGS pour utiliser plutôt un GUI à boutons. C'est celle que j'ai adopté pour le moment, et elle marche. Mais qu'est-ce que c'est pas pratique...!
J'ai le texte de l'event et celui des boutons dans ma fonction custom Event
Les conséquences du choix du joueur dans mes fonctions button_OnClick
Et les commentaires des camarades dans les fonctions character_Interact
Quand j'aimerais bien avoir tout ça rassemblé dans un même endroit (les textes et les conséquences du choix au moins, comme pour les dialogues d'AGS).
Cette solution m'embete aussi parce que j'adore AGS surtout pour sa fonction dialogue qui est très pratique, alors si je ne l'utilise même plus...
Auriez-vous donc une autre solution à proposer, ou un moyen d'améliorer celle que j'ai trouvé ?
(Mon post est déjà assez long, donc je me permet d'expliciter un peu plus ma méthode dans le spoiler :
- Spoiler:
J'ai une variable string Event qui me permet de définir de quel événement il s'agit. (ça pourrait tout aussi bien être une variable int mais je trouve plus clair de dire Event="Monstre"; que Event=36;)
J'ai mon GUI gChoice avec 3 boutons : bChoice1, bChoice2, bChoice3.
Puis dans mon GlobalScript j'ai :
- Code:
-
//Ma fonction qui tire un event au sort
function PickEvent(){
int ranEvent=Random(150);
if (ranEvent==0) Event="Monstre";
if (ranEvent==1) Event="Corridor";
if (ranEvent==2) Event="Trésor";
...
}
//Ma fonction qui lance l'event et détermine ce qu'il y a marqué sur les boutons
RunEvent();{
if(Event=="Monstre"){
Display("Oh un monstre ");
bChoice1.Text="Combattre";
bChoice2.Text="Fuir";
bChoice3.Text="Jouer de la trompette";
gChoices.Visible=true;
}
if(Event=="Corridor"){
Display("Oh un corridor ");
bChoice1.Text="prendre à droite";
bChoice2.Text="prendre à gauche";
bChoice3.Text="Jouer de la trompette";
gChoices.Visible=true;
}
...
//Mes fonction button_OnClick bien trapues
function bChoice1_OnClick(GUIControl *control, MouseButton button)
{
if(Event=="Monstre"){
gChoices.Visible=false;
Display("Vous combattez le monstre");
//il se passe des trucs
Event="none";
}
if(Event=="Corridor"){
gChoices.Visible=false;
Display("Vous prenez à droite");
//il se passe des trucs
Event="none";
}
....
}
function bChoice2_OnClick(GUIControl *control, MouseButton button)
{
//pareil avec les résultats du choix 2
}
function bChoice3_OnClick(GUIControl *control, MouseButton button)
{
//pareil avec les résultats du choix 3
}
//Et puis encore ailleurs, mes character interact, pour avoir l'avis du perso en cliquant dessus
function cNina_Interact()
{
if(Event=="none"){
cNina.Say("");
}
if(Event=="Monstre"){
cNina.Say("Jouer de la trompette semble une bonne idée");
}
...
}
function cClem_Interact()
{
if(Event=="none"){
cClem.Say("");
}
if(Event=="Monstre"){
cClem.Say("Jouer de la trompette ne semble pas une très bonne idée");
}
...
}
Voilà. C'est bien lourdingue, tout est éparpillé dans diverses fonctions. Sachant que je vise une centaine d'events et une vingtaine de personnages, vous voyez le problème...