|
| Curseur dynamique et problème d'accolades ? | |
| | Auteur | Message |
---|
Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Curseur dynamique et problème d'accolades ? Jeu 3 Fév 2022 - 6:18 | |
| Rebonjour à tous !! Après avoir visionné le tuto de valoulef (merci à lui !) à ce sujet, je suis donc en train de mettre en place un curseur dynamique. Après plusieurs tests, à priori mon script est logique... Seulement, je rencontre un problème de syntaxe que je n'arrive pas à résoudre. Chaque bloc isolé a l'air de fonctionner individuellement mais lorsque j'essaie de les mettre à la suite, ça fait du caca. Le problème est que je ne sais pas du tout où placer exactement mes accolades: - Code:
-
function repeatedly_execute()
{ if (IsGamePaused() == 1) return; Hotspot* hsurvol = Hotspot.GetAtScreenXY (mouse.x, mouse.y); Object* osurvol = Object.GetAtScreenXY (mouse.x, mouse.y); Character* csurvol = Character.GetAtScreenXY (mouse.x, mouse. y); // survol des hotspots { if(hsurvol != hotspot[0]) {mouse.ChangeModeGraphic(eModeAller,2);} else {mouse.ChangeModeGraphic (eModeAller,1);} if((hsurvol.GetProperty("Regarder") == true)&& (mouse.IsModeEnabled(eModeMain))) {mouse.ChangeModeGraphic(eModeMain,6);} else {mouse.ChangeModeGraphic (eModeMain,5);} if((hsurvol.GetProperty("Regarder") == true)&& (mouse.IsModeEnabled(eModeRegarder))) {mouse.ChangeModeGraphic(eModeRegarder,4);} else {mouse.ChangeModeGraphic (eModeRegarder, 3);} } // survol des objets { if ((osurvol != null) && (mouse.IsModeEnabled(eModeRegarder))) {mouse.ChangeModeGraphic(eModeRegarder,4);} else {mouse.ChangeModeGraphic (eModeRegarder, 3);} if((osurvol != null) && (mouse.IsModeEnabled(eModeMain))) {mouse.ChangeModeGraphic(eModeMain,6);} else {mouse.ChangeModeGraphic (eModeMain,5);} } //survol des personnages { if((csurvol != null) && (mouse.IsModeEnabled(eModeRegarder))) {mouse.ChangeModeGraphic(eModeRegarder,4);} else {mouse.ChangeModeGraphic (eModeRegarder, 3);} if((csurvol != null) && (mouse.IsModeEnabled(eModeMain))) {mouse.ChangeModeGraphic(eModeMain,6);} else {mouse.ChangeModeGraphic (eModeMain,5);} if((csurvol != null) && (mouse.IsModeEnabled(eModeParler))) {mouse.ChangeModeGraphic(eModeParler,8);} else {mouse.ChangeModeGraphic (eModeParler,7);} }}
Je crois comprendre qu'à la place de certains " if " je devrais plutôt utiliser " else if " mais il y a des subtilités que je ne pige pas car lorsque j'essaie de le faire, j'ai moult messages d'erreur. Si l'un(e) de vous peut éclairer ma lanterne... Mercizoubi. _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Curseur dynamique et problème d'accolades ? Jeu 3 Fév 2022 - 17:03 | |
| Je pense que ce que tu veux se rapprocherait plus de ça (j'illustre seulement les hotspots ici) : - Code:
-
function repeatedly_execute() { if (IsGamePaused() == 1) return; // survol des hotspots // Hotspot* hsurvol = Hotspot.GetAtScreenXY (mouse.x, mouse.y); if (hsurvol != hotspot[0]) // Si le hotspot est différent de hotspot[0]... { // ... alors exécute le code qui se trouve entre ce { et le } correspondant if ((hsurvol.GetProperty("Regarder") == true)) // si, en plus, le hotspot a la propriété Regarder... { // ... alors exécute le code qui se trouve entre ce { et le } correspondant if (mouse.IsModeEnabled(eModeRegarder)) // si, en plus (en plus), le mode eModeRegarder est activé... { // ... alors exécute le code qui se trouve entre ce { et le } correspondant mouse.ChangeModeGraphic(eModeRegarder,4); } else // sinon (=si hotspot différent de hotspot[0] et si propriété Regarder, MAIS mode eModeRegarder PAS activé)... { // ... alors exécute le code qui se trouve entre ce { et le } correspondant if (mouse.IsModeEnabled(eModeMain)) // si, plutôt, le mode eModeMain est activé... { // ... alors exécute le code qui se trouve entre { et le } correspondant mouse.ChangeModeGraphic(eModeMain,6); // utilise l'emplacement 6 pour l'image du mode eModeMain } else // sinon (=si hotspot différent de hotspot[0] et si propriété Regarder, MAIS mode eModeRegarder PAS activé ET mode eModeMain PAS activé non plus)... { // ... alors exécute le code qui se trouve entre ce { et le } correspondant mouse.ChangeModeGraphic(eModeAller,1); // utilise l'emplacement 1 pour l'image du mode eModeAller } } } else // sinon (=si hotspot différent de hotspot[0] MAIS PAS propriété Regarder)... { // ... alors exécute le code qui se trouve entre ce { et le } correspondant mouse.ChangeModeGraphic(eModeAller,2); // utilise l'emplacement 2 pour l'image du mode eModeAller } } else // sinon (=si hotpost est hotspot[0]) { // ... alors exécute le code qui se trouve entre ce { et le } correspondant mouse.ChangeModeGraphic(eModeAller,1); // utilise l'emplacement 1 pour l'image du mode eModeAller }
// survol des objets // Object* osurvol = Object.GetAtScreenXY (mouse.x, mouse.y); // [reste du code]
J'imagine que tu voudras changer quelques trucs. Par exemple le code utilise l'emplacement 1 pour eModeAller dans deux situations différentes (soit en survolant un hotspot avec la propriété "Regarder" alors que les modes Regarder et Main sont pas activés, soit en survolant aucun hotpost) mais je suis pas sûr que ce soit exactement ce que tu veux Bien que ce soit une question de préférence (ça fait pas de différence pour AGS, seulement pour nous humains) je te conseille de toujours aller à la ligne après un { et avant un }, et d'ajouter deux espaces devant chaque ligne qui se trouve entre ces { et }. Ça te (nous) permettra de mieux identifier quelles lignes sont censées prendre effet dans quelles conditions, surtout lorsqu'il y a tant de conditions imbriquées _________________ 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 ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Curseur dynamique et problème d'accolades ? Jeu 3 Fév 2022 - 17:56 | |
| Arf j'ai tout décomposé / regardé (et testé bien sûr)... ça fonctionne pas, du moins pas comme je le souhaite. Je vais m'inspirer de tes annotations en vert pour taper une nouvelle fois mon code, merci encore et encore !! Au cas où, j'explique tout de même ce que fait mon curseur de base et ce que je souhaiterais. Il s'agit du curseur de base du template empty avec les 4 modes (fleche, voir, main, parler), que l'on "passe" en faisant défiler au moyen de la molette ou plus simplement en cliquant sur le bouton droit. Et le clic gauche bah c'est le clic gauche quoi, qui permet au joueur de jouer . - Code:
-
// called when a mouse button is clicked function on_mouse_click(MouseButton button) { if (IsGamePaused()) { // game is paused, so do nothing (i.e. don't process mouse clicks) } else if (button == eMouseLeft) { // left-click, so try using the current mouse cursor mode at this position Room.ProcessClick(mouse.x, mouse.y, mouse.Mode); } else if (button == eMouseRight) { // right-click, so cycle the mouse cursor mode mouse.SelectNextMode(); } else if (button == eMouseWheelNorth) { // mouse wheel up will cycle the cursor mode backwards mouse.SelectPreviousMode(); } else if (button == eMouseWheelSouth) { // mouse wheel up will cycle the cursor mode backwards mouse.SelectNextMode(); } } Ce que je souhaite: Lorsque je survole un hotspot, si la propriété est sur true (car je souhaite que des fois certaines soient sur false), la souris se met en surbrillance, pour le mode "voir" et "main" pricipalement. idem pour les objets, sauf que là tous seront true (donc pas besoin de passer par la fenêtre de propriété et le GetProperty en fait)... Et pour les personnages, le mode "voir" et "parler" devraient suffire. Je compte probablement utiliser la flèche active pour spécifier les sorties de room, mais j'hésite encore sur ce dernier point (peut-être y aura-t-il une anim de flèches). _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
Dernière édition par Ravaillac le Ven 4 Fév 2022 - 5:39, édité 1 fois |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Curseur dynamique et problème d'accolades ? Ven 4 Fév 2022 - 5:35 | |
| Bon bah voilà je me prends la tête de bonne heure, décidément... Y'a un truc que je ne comprends pas. Car comme je le disais dans le premier message, mon script fonctionne super de manière isolée. - Code:
-
{if (IsGamePaused() == 1) return; Hotspot* hsurvol = Hotspot.GetAtScreenXY (mouse.x, mouse.y); Object* osurvol = Object.GetAtScreenXY (mouse.x, mouse.y); Character* csurvol = Character.GetAtScreenXY (mouse.x, mouse. y); // survol des hotspots { if((mouse.IsModeEnabled(eModeRegarder))&&(hsurvol != hotspot[0])) {mouse.ChangeModeGraphic(eModeRegarder,4);} else {mouse.ChangeModeGraphic (eModeRegarder,3);} }
{if (mouse.y > 225){ gInventaire.Visible = false; gBille.Visible = true; } else if (mouse.x >1050){ gInventaire.Visible = false; gBille.Visible = true; } }} Ici, donc, mon curseur loupe fonctionne de manière isolée, et se met en surbrillance (image 4) si hotspot différent de zéro, et sinon, redevient "normal" en se (re)mettant sur l'image 3 grâce au "else". (car si je ne tape pas ce else bah elle reste surbrillancée (oui, surbrillancée) en permanence). Vous remarquerez au passage, juste en dessous de ce premier code, que j'ai un inventaire qui vient et qui se barre si le curseur se trouve dans la zone ou non (et si on appuie sur un bouton "bille" pareil (qui lui reste visible en permanence mais ça on s'en tamponne le coquillard)). Tout ça pour dire que je me base sur ce code "propre" comme exemple à suivre... Puisqu'il fonctionne bien. Et c'est là que ça devient méga-relou car si j'ajoute ceci en dessous de mon code, mais pour le curseur main... - Code:
-
else if ((mouse.IsModeEnabled(eModeMain))&&(hsurvol != hotspot[0]) { mouse.ChangeModeGraphic(eModeMain,6); else {mouse.ChangeModeGraphic (eModeMain,5); }
...Que j'essaie donc de reproduire le même principe que le curseur loupe (et en me basant sur la structure du code propre décrit précédemment), AGS me dit qu'il y a Parse error, que le "else" est en trop où je ne sais trop quoi, de toute façon le message d'erreur change à chaque fois selon le placement de mes accolades... (Bien sûr j'ai testé ce dernier code en "if", tout seul, comme pour ma loupe... Et il fonctionne très bien... Mais tout seul. ) J'en conclus donc premièrement que je ne dois pas entrer mon script correctement lorsqu'il s'agit de mettre des "if", "else" ou des "else if", surtout s'ils sont à la suite et, deuxièmement, que je suis une grosse buse (malgré moi... Car je ne trouve rien sur les forums français et anglophone à ce sujet, ou si... Mais c'est non résolu et/ou pas expliqué noir sur blanc, et idem dans le manuel). Toussa pour vous demander tout en m'arrachant les cheveux: Qu'est-ce qui ne va pas très exactement ??? Zoubimerci. _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
| Sujet: Re: Curseur dynamique et problème d'accolades ? Ven 4 Fév 2022 - 18:34 | |
| Deux remarques : - Code:
-
else if ((mouse.IsModeEnabled(eModeMain))&&(hsurvol != hotspot[0]) { mouse.ChangeModeGraphic(eModeMain,6); else {mouse.ChangeModeGraphic (eModeMain,5); } Ici le second else, situé après mouse.ChangeModeGraphic(eModeMain,6); ne sert à rien, car il ne se rapporte à aucun if précédent (tout ce qui est dans les accolades est exécuté si et seulement si le if qui les précède est vrai, et il n'y en a pas d'autres à l'intérieur). Par ailleurs il y a une accolade qui n'est pas fermée. Deuxièmement, tu as des accolades inutiles, par exemple ici : - Code:
-
// survol des hotspots { if((mouse.IsModeEnabled(eModeRegarder))&&(hsurvol != hotspot[0])) {mouse.ChangeModeGraphic(eModeRegarder,4);} else {mouse.ChangeModeGraphic (eModeRegarder,3);} } La première et la dernière accolade ne sont pas nécessaires, et isolent cette partie du code du reste, si bien que les else qui suivent ne se rapportent à rien qui vient précédemment (je pense) étant donné que le if précédent fait partie d'un autre bloc. Essaye en enchaînant tes if et te else sans ces accolades superflues qui les entourent. N'hésite pas à redemander si ça coince encore. Edit : Pour t'aider, suis bien la structure présentée ici : http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php?id=mots-cles#comparaisons_if_else _________________ 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.
|
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Curseur dynamique et problème d'accolades ? Dim 6 Fév 2022 - 12:37 | |
| Ayééééééééé !! Merci à tous pour votre aide. J'ai par ailleurs consulté un ami qui m'a expliqué les accolades, et j'ai tout fait tout seul comme un grand, et mon curseur fait tout bien comme il faut. VICTOIRE ! \o/ - Code:
-
//__________CURSEUR DYNAMIQUE_____________________________________________ Hotspot* hsurvol = Hotspot.GetAtScreenXY (mouse.x, mouse.y); Object* osurvol = Object.GetAtScreenXY (mouse.x, mouse.y); Character* csurvol = Character.GetAtScreenXY (mouse.x, mouse. y);
// comportement survol RIEN
if ((hsurvol == hotspot[0])||(osurvol == null)||(csurvol == null)) { if (mouse.IsModeEnabled(eModeAller)) { mouse.ChangeModeGraphic(eModeAller,1); } if (mouse.IsModeEnabled(eModeRegarder)) { mouse.ChangeModeGraphic(eModeRegarder,3); } if (mouse.IsModeEnabled(eModeMain)) { mouse.ChangeModeGraphic(eModeMain,5); } if (mouse.IsModeEnabled (eModeParler)) { mouse.ChangeModeGraphic(eModeParler,7); } }
// comportement survol SORTIES DE ROOM
if ((hsurvol != hotspot[0])&&(mouse.IsModeEnabled(eModeAller))) { if(hsurvol.GetProperty("Sortie")== true) { mouse.ChangeModeGraphic(eModeAller,2); } if((hsurvol.GetProperty("Sortie")== false)||(hsurvol.GetProperty("Choopa")== true)) { mouse.ChangeModeGraphic(eModeAller,1); } } // comportement survol POINTS CHAUDS if ((hsurvol != hotspot[0])&&(hsurvol.GetProperty("Choopa")== true)) { if (mouse.IsModeEnabled(eModeRegarder)) { mouse.ChangeModeGraphic(eModeRegarder,4); } if (mouse.IsModeEnabled(eModeMain)) { mouse.ChangeModeGraphic(eModeMain,6); } } // comportement survol OBJETS
if (osurvol != null) { if (mouse.IsModeEnabled(eModeRegarder)) { mouse.ChangeModeGraphic(eModeRegarder,4); } if (mouse.IsModeEnabled(eModeMain)) { mouse.ChangeModeGraphic(eModeMain,6); } }
// comportement survol PERSONNAGES
if (csurvol != null) { if (mouse.IsModeEnabled(eModeRegarder)) { mouse.ChangeModeGraphic(eModeRegarder,4); } if (mouse.IsModeEnabled(eModeParler)) { mouse.ChangeModeGraphic(eModeParler,8); } } } Pas peu fier du résultat tiens, ça a été un vrai casse-tête !! Vous remarquerez par ailleurs deux propriétés de hotspots: "Sortie" à mettre sur true pour disponible, et false pour indisponible. Et "Choopa" même topo, mais pour des points chauds... ou pas. Un petit pas pour l'homme, un grand pas pour le curseur dynamique ! Maintenant je vais m'attaquer au réglage du curseur mais pour l'inventaire. Zoubizou. _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Curseur dynamique et problème d'accolades ? Lun 7 Fév 2022 - 15:34 | |
| Bien joué ! Je dois dire aussi que ton code est très lisible, l'indentation est très claire Prochaine étape dans ta maitrise des if-then-else, remplacer des cas comme : - Code:
-
if(hsurvol.GetProperty("Sortie")== true) { mouse.ChangeModeGraphic(eModeAller,2); } if((hsurvol.GetProperty("Sortie")== false)||(hsurvol.GetProperty("Choopa")== true)) { mouse.ChangeModeGraphic(eModeAller,1); } par - Code:
-
mouse.ChangeModeGraphic(eModeAller,1); if ( (hsurvol.GetProperty("Sortie")== true) && (hsurvol.GetProperty("Choopa")==false) ) { mouse.ChangeModeGraphic(eModeAller,2); } Je te laisse déduire pourquoi cette reformulation (un peu moins redondante) est logiquement équivalente à ton code original _________________ 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 ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Curseur dynamique et problème d'accolades ? Lun 7 Fév 2022 - 16:34 | |
| Merci pour le tuyau, Kitai ! Je vais avoir l'occasion de tester ta solution très prochainement car j'aimerais que selon les propriétés true ou false d'un perso, on puisse ou non utiliser le curseur main en surbrillance ou pas. _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Contenu sponsorisé
| Sujet: Re: Curseur dynamique et problème d'accolades ? | |
| |
| | | | Curseur dynamique et problème d'accolades ? | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |