Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -20%
Ecran PC GIGABYTE 28″ LED M28U 4K ( IPS, 1 ms, ...
Voir le deal
399 €

 

 Curseur dynamique et problème d'accolades ?

Aller en bas 
3 participants
AuteurMessage
Jorkz
Cliqueur Emérite
Cliqueur Emérite
Jorkz


Nombre de messages : 665

Age : 39

Localisation : Montpellier

Date d'inscription : 16/07/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyJeu 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. uh
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. grand sourire
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyJeu 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
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Jorkz
Cliqueur Emérite
Cliqueur Emérite
Jorkz


Nombre de messages : 665

Age : 39

Localisation : Montpellier

Date d'inscription : 16/07/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyJeu 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 !! clin d'oeil

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).

Curseur dynamique et problème d'accolades ? Gq13


Dernière édition par Ravaillac le Ven 4 Fév 2022 - 5:39, édité 1 fois
Revenir en haut Aller en bas
Jorkz
Cliqueur Emérite
Cliqueur Emérite
Jorkz


Nombre de messages : 665

Age : 39

Localisation : Montpellier

Date d'inscription : 16/07/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyVen 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. uh )

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. 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


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyVen 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
Revenir en haut Aller en bas
Jorkz
Cliqueur Emérite
Cliqueur Emérite
Jorkz


Nombre de messages : 665

Age : 39

Localisation : Montpellier

Date d'inscription : 16/07/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyDim 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. grand sourire
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyLun 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
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Jorkz
Cliqueur Emérite
Cliqueur Emérite
Jorkz


Nombre de messages : 665

Age : 39

Localisation : Montpellier

Date d'inscription : 16/07/2006


Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? EmptyLun 7 Fév 2022 - 16:34

Merci pour le tuyau, Kitai ! sourire

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.
Revenir en haut Aller en bas
Contenu sponsorisé





Curseur dynamique et problème d'accolades ? Empty
MessageSujet: Re: Curseur dynamique et problème d'accolades ?   Curseur dynamique et problème d'accolades ? Empty

Revenir en haut Aller en bas
 
Curseur dynamique et problème d'accolades ?
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» curseur dynamique sauf pour un hotspot
» Problème curseur
» Problème Curseur inventaire
» Curseur qui disparait.
» Faire Pointeur dynamique genre Photoshop en fonction de l'outil selectionné ?

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: