Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -50%
-50% Baskets Nike Air Huarache Runner
Voir le deal
69.99 €

 

 Click non fonctionnel sur la fenêtre d'un inventaire.

Aller en bas 
4 participants
Aller à la page : 1, 2  Suivant
AuteurMessage
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 3 Avr 2019 - 13:15

Alors voilà mon problème, c'est sûrement un truc tout con, donc désolé d'avance, mais je n'arrive pas a cliquer sur une fenêtre de mon inventaire. Disons que rien ne se passe, comme si elle n'était pas active...



Code:


function on_mouse_click(MouseButton button) // called when a mouse button is clicked. button is either LEFT or RIGHT
{
  GUIControl *theControl = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  int Slot = mouse.GetModeGraphic(eModePointer);

  if (IsGamePaused() == 1) // Game is paused, so do nothing (ie. don't allow mouse click)
 {
  }
  if (button == eMouseLeft)   {

   if(mouse.Mode == eModePointer){
       mouse.GetModeGraphic(eModePointer);

              if ((theControl == InventoryObj_arme)||(theControl == InventoryObj_nourriture)||(theControl == InventoryObj_recoltable)){
                      
        if(Slot != 13) Restor_item_cursor();      

                }
    }


En gros, je peux cliquer sur les objets présents dans l'inventaires (en gros ça lance le script item_On_Click) mais si je clique où la zone est vide d'objet, rien ne se passe, alors que je voudrais que ça lance la fonction : Restor_item_cursor();
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 3 Avr 2019 - 16:57

J'ai pas été capable de trouver une façon standard de gérer les clics sur les fenêtres d'inventaire, donc je peux te proposer de mettre ça dans ton Global Script :
Code:
bool clicked = false;
function repeatedly_execute(){
  if (!clicked && Mouse.IsButtonDown(eMouseLeft)){
    clicked = true;
  }
  else if (clicked){
    GUIControl* current = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
    if (current != null && current.AsInvWindow != null){
      Display("Click on inventory");
    }
    clicked = false;
  }
}
C'est peut-être un peu trop sensible : par exemple si tu cliques à nouveau dans l'inventaire lorsque le message est à l'écran pour le faire disparaître, bah ça redéclenche un clic et donc ça ré-affiche le message en question. Mais ça devrait pas être trop difficile à maîtriser dans l'absolu.
Et si tu cliques pendant qu'il y a une animation bloquante en train de jouer par exemple, il me semble que ça n'exécutera pas le code. Pour ça tu devrais plutôt utiliser repeatedly_execute_always, mais dans ce cas tu ne pourrais pas utiliser de fonctions bloquantes comme Display.

_________________
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 !
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyJeu 4 Avr 2019 - 9:44

J'ai trouvé un truc pas trop mal en cherchant a droite à gauche.

Code:

function on_event (EventType event, int data) {
  GUIControl *theControl = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
 
 
  if((event == eEventGUIMouseDown) && ((theControl == MaFenetreInventaire){
   
    blablabla();
   
  }


Ca fonctionne pas trop mal. Je lisais que avec la variable data, on pouvait indiquer un control en utilisant son ID...
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyJeu 4 Avr 2019 - 12:51

C'est assez mal foutu mais classiquement on utilise eMouseLeftInv au lieu de eMouseLeft et eMouseRightInv au lieu de eMouseRight. Les clics "normaux" fonctionnent partout à ma connaissance sauf sur les fenêtres d'inventaires, ne me demandez pas pourquoi... En tout cas, fort heureusement, nul besoin de recoder une fonction pour ça. 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
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyJeu 4 Avr 2019 - 15:37

Ah, bien vu !

filoulefilou a écrit:
Ca fonctionne pas trop mal. Je lisais que avec la variable data, on pouvait indiquer un control en utilisant son ID...
En fait data prend comme value le numéro du GUI, pas du GUIControl (tu pourrais très bien cliquer sur une zone vide du GUI, auquel cas il n'y aurait pas d'élément). Ta solution me paraît idéale telle quelle.

valoulef a écrit:
C'est assez mal foutu mais classiquement on utilise eMouseLeftInv au lieu de eMouseLeft et eMouseRightInv au lieu de eMouseRight. Les clics "normaux" fonctionnent partout à ma connaissance sauf sur les fenêtres d'inventaires, ne me demandez pas pourquoi...
En fait que ce soit eMouseLeft ou eMouseLeftInv, la fonction on_mouse_click semble pas se déclencher lors d'un clic sur une zone vide de fenêtre d'inventaire (c'est-à-dire lorsque tu cliques en survolant la fenêtre d'inventaire sans survoler un objet d'inventaire pour autant).

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMar 1 Fév 2022 - 15:56

Salut !
Je déterre ce sujet car je rencontre le même problème, et je ne comprends pas la solution proposée par filoulefilou...

En fait: Où réellement utiliser les fonctions eMouseLeftInv et eMouseRightInv ?
Si quelqu'un a la réponse, merci ! sourire

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMar 1 Fév 2022 - 16:56

À moins que tu veuilles spécifiquement détecter un clic gauche vs un clic droit, t'as pas besoin d'utiliser eMouseLeftInv ni eMouseRightInv. Tu peux simplement mettre le bout de code que @filoulefilou utilise plus haut dans ton GlobalScript, en replaçant blablabla(); bien sûr

Si tu veux détecter clic gauche vs droit, tu peux ajouter un if sur Mouse.IsButtonDown, un truc du genre :

Code:
function on_event (EventType event, int data) {
  GUIControl *theControl = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  if(event == eEventGUIMouseDown && theControl == MaFenetreInventaire && Mouse.IsButtonDown(eMouseLeft)) {
    blablabla();
  }
}

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMar 1 Fév 2022 - 17:08

Certes. Merci.
En fait j'ai un curseur de type Sierra, et dans mon inventaire ça me gave un peu qu'il soit bloqué sur une seule possibilité...

Mais à quoi correspond ce blablabla exactement ?

J'ai l'impression que quelque chose m'échappe là

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMar 1 Fév 2022 - 20:45

Ça correspond à ce que tu veux en fait. Par exemple si tu remplaces blablabla(); par Display("Rien ici"); alors, lorsque le joueur clique sur une zone de la fenêtre d'inventaire où ne se trouve aucun objet, tu verras le message "Rien ici" à l'écran

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMar 1 Fév 2022 - 23:41

Merci encore, mais y'a rien à faire... Je ne comprends pas ces lignes de codes, et ne comprends pas non plus quoi conserver tel quel (ou pas), et: je ne sais pas non plus où les placer dans le scirpt... triste

C'est une fonction personnalisée non ?

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 2 Fév 2022 - 6:45

Kitai a écrit:
Ça correspond à ce que tu veux en fait.

Je précise par ailleurs que j'ai bien compris ce que tu me dis, avec l'exemple du display et tout, mais en réalité je ne sais pas scripter "ce que je veux"... qui serait tout simplement "utiliser les fonctions classiques de la souris" (du moins celle du template empty) lorsque je suis dans l’inventaire.

Merci encore.

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
Revenir en haut Aller en bas
filoulefilou
Cliqueur Amateur
Cliqueur Amateur
filoulefilou


Nombre de messages : 359

Date d'inscription : 24/05/2010


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 2 Fév 2022 - 10:23

Coucou,
Alors, ce que j'ai proposé date un peu mais je pense me souvenir.
Le problème qui se posait à moi c'est que je n'arrivais pas à cliquer sur mes objets dans mon inventaire, tout comme je voulais garder la possibilité de cliquer sur une case vide de mon inventaire pour annuler mon précédant clique. Je voulais en cliquant dans ma fenêtre d'inventaire démarrer un script particulier ( mon idée était de faire un inventaire à la minecraft et donc je voulais par exemple cliquer sur un morceau de bois, qui était l'objet de mon inventaire, et ce faisant, que ça transforme mon curseur en morceau de bois pour plus de visibilité, que ça retire temporairement 1 morceau de bois à mon total de bois, pour ainsi, faire glisser un morceau de bois et le cas échéant, que ça craft un nouvel objet, détruise mon bois initial. Je voulais aussi garder la possibilité de cliquer ailleurs, comme sur un autre objet ou sur une case vide, pour réinitialiser mon stock de bois, changer à nouveau mon curseur, etc... )
J'ai remarqué que les fonctions du clique qui fonctionnent sur tous les objets type bouton, ne fonctionnaient pas sur une fenêtre d'inventaire pour je ne sais quelle raison.
Alors j'ai proposé ce script .

Code:
function on_event (EventType event, int data) {
  GUIControl *theControl = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
 
 
  if((event == eEventGUIMouseDown) && ((theControl == MaFenetreInventaire){
 
    blablabla();
 
  }

Si je devais le traduire, ça donnerait :

La fonction function on_event (EventType event, int date) est une fonction du jeu qu'il suffit d'ajouter dans le global script de ton jeu. Cette fonction veut dire, si j'ai bien tout compris ... Lorsqu'il se passe tel évènement précis, en sachant que le logiciel connait plusieurs types d'évènements, notamment l'évènement event == eEventGUIMouseDown, qui veut dire, quand je clique sur un GUI.

Ensuite, j'ai proposé que mon évènement concerne un L'objet GUI en particulier, c'est à dire, celui qui est actuellement positionné où se trouve mon curseur.
GUIControl *theControl = GUIControl.GetAtScreenXY(mouse.x, mouse.y);

Ensuite, comme dans mon jeu j'ai plusieurs fenêtres d'inventaires qui ont toutes des fonctionnalités différentes, je précise donc
if((event == eEventGUIMouseDown) && ((theControl == MaFenetreInventaire)
Ce qui veut dire, si mon évènement est le clique sur un GUI et que le GUI_fenetre_inventaire actuellement sous ma souris, là où je clique, est nommé par exemple InventaireDeBois , alors ça déclenche le script gestion_du_bois(), qui est un script que j'ai développé ailleurs, qui grossomodo donnait un truc du genre

gestion_du_bois(InventoryItem*IT){
if(IT == "bois")
{

curseur = Bois_sprite;
stock_bois --;
memory_stock_bois = stock_bois + 1;
}
if (IT == null)
{
curseur = clic_sprite;
stock_bois = memory_stock_bois;
}
etc...
}
Voilà, ainsi j'ai reussi à faire en sorte de pouvoir démarrer un script en cliquant sur un objet situé dans un inventaire précis, mais j'ai aussi réussi à faire en sorte que si l'on clique sur une case vide (null), alors ça déclenche une autre partie du script.

C'est plus clair ?

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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 2 Fév 2022 - 10:37

Oui je comprends, merci sourire, mais surtout je constate que c'était quand même très spécifique à ton cas, avec tes multiples inventaires.

En fait je bloque sur un truc, c'est juste l'astérisque avant theControl... Je ne comprends pas des masses ce que cela signifie quand c'est dans un script.
Et je n'arrive plus à trouver la page où j'avais trouvé que c'était mieux expliqué qu'ailleurs confus

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 2 Fév 2022 - 16:23

Ravaillac a écrit:
je ne sais pas non plus où les placer dans le scirpt... triste

C'est une fonction personnalisée non ?

C'est un cas un peu particulier : on_event est une fonction prédéfinie du script global, c'est-à-dire que si tu as function on_event (EventType evenement, int DATA) { dans ton script global, alors AGS se chargera d'exécuter le code que tu mets dans cette fonction lorsque l'événement correspondant se déclenche. Si tu ne mets pas cette fonction dans le script global, alors AGS ne fera rien de spécial lorsque les événements en question se produisent.

En ce qui concerne où la mettre, tu peux simplement ouvrir GlobalScript.asc (si je me souviens bien du nom du fichier script) et coller le bout de code tout en bas, ou tout en haut, comme tu veux (du moment que c'est pas imbriqué entre deux { } ou deux ( ) qui correspondent à d'autres fonctions dans ton script).

Ravaillac a écrit:
En fait je bloque sur un truc, c'est juste l'astérisque avant theControl... Je ne comprends pas des masses ce que cela signifie quand c'est dans un script.
Franchement c'est vraiment pas nécessaire de comprendre pour pouvoir l'utiliser : tout ce qu'il faut savoir c'est que lorsque tu crées une variable de type GUIControl, tu dois te rappeler d'utiliser l'astérisque.

Techniquement, l'astérisque permet de traiter la variable comme un pointeur. De base tu as des variables de type entier (int : 0, 1, 2, 3, etc.) ou booléen (bool : true ou false) et ces variables là valent 0, 1, 2, ..., true ou false. Et lorsque tu passes ces variables comme argument à des fonctions, par exemple si tu as des variables de type int coord_x et coord_y et que tu tapes player.Walk(coord_x,coord_y), eh bien la fonction Walk reçoit directement des nombres.
Par contre, y'a pas de variable qui "vaut" directement un contrôle de GUI. Pour pouvoir y faire référence, il faut utiliser un pointeur (avec l'astérisque, donc). Dans la machine, cette variable pointeur va en réalité représenter une adresse qui pointe vers le contrôle de GUI en mémoire. De cette façon, lorsque tu passes la variable pointeur comme argument à une fonction, c'est en réalité une adresse que reçoit cette fonction, de façon à ce qu'elle puisse elle-même (la fonction) consulter la mémoire au bon endroit pour faire des trucs avec le contrôle de GUI.

Il y a pas vraiment de façon parfaitement systématique de savoir quels types de variables doivent être traités comme des pointeurs ou non, c'est un peu un truc à apprendre par coeur. Mais comme je disais, les types de base int et bool, mais aussi char, short, float et String, n'utilisent pas de pointeurs. Tous les autres types (à quelques exceptions près, comme EventType par exemple, qui en réalité est un simple int de façon sous-jacente) utilisent des pointeurs.
Pour illustrer le côté relativement arbitraire d'utiliser ou non un pointeur, AGS traite le type String comme un type de base qui n'utilise pas de pointeur, mais de façon sous-jacente, le langage dans lequel a été écrit AGS traite ces données avec des pointeurs, justement (parce que les String peuvent avoir très peu ou beaucoup de caractères, et donc utiliser plus ou moins d'espace en mémoire, ce qui fait qu'il faut manipuler leur adresse en mémoire : on peut pas simplement réserver un emplacement prédéfini en mémoire et manipuler la valeur à cet emplacement, comme on le fait avec une bool par exemple, qui utilise un seul emplacement qu'elle vaille true ou false)

En ce qui concerne où utiliser l'astérisque devant le nom, et où l'omettre, la règle c'est ça : lorsque tu crées la variable (à gauche du signe = typiquement) il faut utiliser l'astérisque; tu peux soit le coller au type, comme dans GUIControl* theControl, soit le coller au nom de la variable, comme dans GUIControl *theControl, c'est comme tu préfères. Pareil lorsque tu définis une fonction qui prend des paramètres : par exemple, si tu définis une fonction maFonction à laquelle tu veux pouvoir passer une variable de type GUIControl, il va falloir faire function maFonction(GUIControl* monControl) {. Toutes les autres occurrences de ta variable se font sans l'astérisque

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 2 Fév 2022 - 17:46

C'est un peu plus clair, merci encore pour le temps passé à rédiger le truc clin d'oeil

Par contre ça me soûle je me sens trop nul... Je comprends tout en théorie mais en pratique c'est vraiment galère.

Je suis vraiment perdu sur quoi mettre dans mon global script pour demander au logiciel de continuer avec les fonctions habituelles de ma souris, et ce même quand je suis dans l'inventaire...

Je pense qu'il y a des mots clés que je ne connais pas...
D'ailleurs encore merci pour ce petit lien en milieu de tartine sourire


_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 2:40

Alors Alors...

En relisant tout très attentivement, j'ai vraiment compris compris cette fois !... Le problème, apparemment, venait du fait que je ne plaçais pas le bousin dans la function on_event...

Cependant, lorsque je clique droit pour passer le mode de ma souris (en mode choper l'item), AGS semble utiliser mon mode "regarder" par défaut, donc problème persistant: La souris passe effectivement sur le bon mode en clic droit, (et heureusement au sein même de l'inventaire sélectionne bien mon item si clic gauche, en prenant son image en curseur comme il le faut, et tout...), mais au moment même ou je clic droit... Bah ça me fait quand même ce qu'il est sensé faire en mode regarder (décrire l'objet). Ce que je ne souhaite pas. Voici ce que donne mon script:

Code:
       

function on_event (EventType event, int data)
{
  GUIControl *gcontrol = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
 
  if ((event == eEventGUIMouseDown && gcontrol != null)&& Mouse.IsButtonDown(eMouseRight))
  
  {
    mouse.SelectNextMode();
  }
}

J'magine donc qu'il est incomplet et que je dois probablement en rajouter, mais je n'ai aucune idée de quoi mettre avant ce next mode...

Si vous avez une solution, je suis bien evidemment preneur ! clin d'oeil

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 16:32

Tu as probablement un autre bout de code ailleurs qui s'occupe de lancer l'interaction du mode "regarder" lors d'un clic droit. Surtout si tu dis que tu as réussi à implémenter le clic gauche qui prend l'image de l'objet d'inventaire comme curseur, c'est que tu as une autre fonction on_event quelque part dans ton script il me semble

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 17:17

Il est possible que ça vienne de cette fonction...

Code:
function gestion_inventaire ()

{
  GUIControl *gcontrol = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
 
  if ((eMouseRight)&&(player.ActiveInventory != null))
  {
    player.ActiveInventory = null;
  }
 
  if ((mouse.IsModeEnabled(eModeRegarder))&&(gcontrol != null && gcontrol.AsInvWindow != null)&&(eMouseLeftInv))
  {
    inventory[game.inv_activated].RunInteraction(eModeRegarder);
  } 
  else if ((mouse.IsModeEnabled(eModeMain))&&(gcontrol != null && gcontrol.AsInvWindow != null)&&(eMouseLeftInv))
  {
    inventory[game.inv_activated].RunInteraction(eModeUseinv);
  } 
  else if ((gcontrol != null && gcontrol.AsInvWindow != null)&&(eMouseRightInv))
  {
    mouse.SelectNextMode();
  }
}
Par contre je ne m'y retrouve plus dans ce bazar confus
Je m'y perds un peu avec ces clic multiples et ces zones actives ou inactives...

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 17:57

La question principale c'est : où est exécutée cette fonction gestion_inventaire ? Probablement dans un on_event, j'imagine

Dans cette fonction gestion_inventaire, tu as plusieurs tests du style (eMouseRight), (eMouseLeftInv) ou (eMouseRightInv) : ces tests seront toujours validés car, en l'état, ils expriment "est-ce que cette valeur (eMouseRight/eMouseLeftInv/eMouseRightInv) est différente de 0 ?". En effet, les valeurs eMouse* (de type MouseButton) sont, de façon sous-jacente, des valeurs de type int (nombres entiers) qui sont chacune différente de 0. Lorsque tu formules un test qui consiste simplement en une valeur entière, AGS teste si cette valeur est différente de 0. Par exemple, le test formulé (player.GetProperty("valeur")) est équivalent à (player.GetProperty("valeur")!=0). De la même façon, le test formulé simplement (eMouseRight) est équivalent à (eMouseRight!=0)

Si tu regardes les codes des messages plus haut, tu verras que les tests qui font intervenir eMouse* soit comparent cette valeur à la valeur d'une autre variable int, comme dans (button == eMouseLeft), soit passent cette valeur comme argument à une autre fonction, comme dans Mouse.IsButtonDown(eMouseLeft) qui retournera true si le bouton gauche de la souris est enfoncé au moment où le test est effectué.

Je pense que c'est ça que tu avais en tête, en fait : utiliser Mouse.IsButtonDown. Remarque, par contre, que eMouseLeftInv et eMouseRightInv retourneront toujours false pour cette fonction, il faut toujours utiliser eMouseLeft et eMouseRight à la place. Les valeurs eMouseLeftInv et eMouseRightInv ne sont pertinentes que dans la fonction on_mouse_click lorsqu'elles sont testées en comparaison à son argument de type MouseButton

Le code de ta fonction devient donc :

Code:
function gestion_inventaire ()  
{
  GUIControl *gcontrol = GUIControl.GetAtScreenXY(mouse.x, mouse.y);
  
  if ((Mouse.IsButtonDown(eMouseRight))&&(player.ActiveInventory != null))
  {
    player.ActiveInventory = null;
  }
  if ((mouse.IsModeEnabled(eModeRegarder))&&(gcontrol != null && gcontrol.AsInvWindow != null)&&(Mouse.IsButtonDown(eMouseLeft)))
  {
    inventory[game.inv_activated].RunInteraction(eModeRegarder);
  }
  else if ((mouse.IsModeEnabled(eModeMain))&&(gcontrol != null && gcontrol.AsInvWindow != null)&&(Mouse.IsButtonDown(eMouseLeft)))
  {
    inventory[game.inv_activated].RunInteraction(eModeUseinv);
  }
  else if ((gcontrol != null && gcontrol.AsInvWindow != null)&&(Mouse.IsButtonDown(eMouseRight)))
  {
    mouse.SelectNextMode();
  }
}

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 18:24

Mais le truc qui soule c'est qu'il y a cette histoire de souris par défaut (ou pas) dans le General Settings
Click non fonctionnel sur la fenêtre d'un inventaire. Etyr

Je le mets sur True ou sur False du coup ?

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 19:48

En l'occurrence, oui, si tu appelles gestion_inventaire dans on_mouse_click dans le but de gérer (entre autres) les clics dans la fenêtre d'inventaire, tu veux effectivement que ces clics appellent on_mouse_click, donc tu as besoin de mettre ça sur true

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 20:32

Merci, c'est bien ce qui me semblait...

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 22:53

Bon bah rien à faire, j'ai pourtant tout nettoyé du mieux que j'ai pu, retourné le truc dans tous les sens, trifouillé à fond dans le template BASS pour voir ce qu'il en était...
Mais toujours le même problème. uh

Je crois qu'AGS n'accepte tout simplement pas de changer de mode en clic droit lorsqu'il est dans l'inventaire.
Voila mon code au complet, si quelqu'un a la patience ou le temps de s'y pencher dessus...
Code:

// main global script file
AudioChannel* Sifflet;
// called when the game starts, before the first room is loaded
function game_start()
{
  Mouse.SetPosition(456, 772);
  Game.MinimumTextDisplayTimeMs = 2800;
  game.lipsync_speed = 10;
  gInventaire.Visible = false;
  aFroggy.Play();
}

function btnInvdroite_OnClick(GUIControl *control, MouseButton button)
{
Invcadre.ScrollDown();
}

function btnInvgauche_OnClick(GUIControl *control, MouseButton button)
{
Invcadre.ScrollUp();
}

function iSifflet_Look()
{
player.Say("Ça, c'est mon sifflet à moi.");
}


function BtnBille_OnClick(GUIControl *control, MouseButton button)
{
  {  
  if (gInventaire.Visible == false) {
  aInv.Play();
  gInventaire.Visible = true;
  }
  else
  {
  aClac.Play();
  gInventaire.Visible = false;  
  }
}}

function dialog_options_get_dimensions(DialogOptionsRenderingInfo *info)
{
  // Crée une zone de dimensions 200x200 à la position (50,100) pour les options
  info.X = 320;
  info.Y = 890;
  info.Width = 1280;
  info.Height = 400;
  // Place l'analyseur de texte (parser) tout en bas (s'il est activé)
  info.ParserTextBoxX = 0;
  info.ParserTextBoxY = 800;
  info.ParserTextBoxWidth = 0;
}

function dialog_options_render(DialogOptionsRenderingInfo *info)
{
  // Remplit la zone en jaune
  info.Surface.Clear(0);
  int i = 1,  ypos = 8;
  // Affiche toutes les options disponibles
  while (i <= info.DialogToRender.OptionCount)
  {
    if (info.DialogToRender.GetOptionState(i) == eOptionOn)
    {
      if (info.ActiveOptionID == i) info.Surface.DrawingColor = 65522;
      else info.Surface.DrawingColor = 15615;
      info.Surface.DrawStringWrapped(30, ypos, info.Width - 120,
                         eFontFont0, eAlignLeft, info.DialogToRender.GetOptionText(i));
      ypos += GetTextHeight(info.DialogToRender.GetOptionText(i), eFontFont0, info.Width - 50);
    }
    i++;
  }
}

function dialog_options_get_active(DialogOptionsRenderingInfo *info)
{
  int i = 1,  ypos = 0;
  // Trouve l'option située où le joueur a cliqué
  while (i <= info.DialogToRender.OptionCount)
  {
    if (info.DialogToRender.GetOptionState(i) == eOptionOn)
    {
      ypos += GetTextHeight(info.DialogToRender.GetOptionText(i), eFontFont0, info.Width - 300);
      if ((mouse.y - info.Y) < ypos)
      {
        info.ActiveOptionID = i;
        return;
      }
    }
    i++;
  }
}


function gestion_curseur()
{
//__________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);    
  GUI* gsurvol = GUI.GetAtScreenXY (mouse.x,  mouse.y);
  InventoryItem* isurvol = InventoryItem.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(eModeMain))&&(csurvol.GetProperty("Persomain")== false))
    {
      mouse.ChangeModeGraphic(eModeMain,5);
    }
    else if ((mouse.IsModeEnabled(eModeMain))&&(csurvol.GetProperty("Persomain")== true))
    {
      mouse.ChangeModeGraphic(eModeMain,6);  
    }
    if (mouse.IsModeEnabled(eModeParler))
    {
      mouse.ChangeModeGraphic(eModeParler,cool;
    }
  }
// gestion INVENTAIRE

if ((isurvol != null)||(gsurvol != null))
{  
    mouse.DisableMode(eModeAller);
    mouse.DisableMode(eModeParler);
}
else
    mouse.EnableMode(eModeAller);
    mouse.EnableMode(eModeParler);
    
}     
     

function unhandled_event(int what, int type) {
{
}}

// called on every game cycle, except when the game is blocked
function repeatedly_execute()
{
if (IsGamePaused() == 1) return;
  
  gestion_curseur();
}


// called on every game cycle, even when the game is blocked
function repeatedly_execute_always()
{
}

// called when a key is pressed
function on_key_press(eKeyCode keycode)
{
  if (IsGamePaused())
  {
    // game paused, so don't react to any keypresses
    keycode = 0;
  }
  else if (keycode == eKeyEscape)
  {
    // Ctrl-Q will quit the game
    QuitGame(1);
  }
  else if (keycode == eKeyF9)
  {
    // F9 will restart the game
    RestartGame();
  }
  else if (keycode == eKeyF12)
  {
    // F12 will save a screenshot to the save game folder
    SaveScreenShot("screenshot.pcx");
  }
  else if (keycode == eKeyCtrlS)
  {
    // Ctrl-S will give the player all defined inventory items
    Debug(0, 0);
  }
  else if (keycode == eKeyCtrlV)
  {
    // Ctrl-V will show game engine version and build date
    Debug(1, 0);
  }
  else if (keycode == eKeyCtrlA)
  {
    // Ctrl-A will show walkable areas
    Debug(2, 0);
  }
  else if (keycode == eKeyCtrlX)
  {
    // Ctrl-X will let the player teleport to any room
    Debug(3, 0);
  }
  else if (keycode == eKeyF1)
  {
    int alea=Random(5);
    if (alea==0) Sifflet = aSifflet01.Play();
    if (alea==1) Sifflet = aSifflet02.Play();
    if (alea==2) Sifflet = aSifflet03.Play();
    if (alea==3) Sifflet = aSifflet04.Play();
    if (alea==4) Sifflet = aSifflet05.Play();
    if (alea==5) Sifflet = aSifflet06.Play();
 
    int DureeClipCycles = Sifflet.LengthMs/(1000/GetGameSpeed()) + 1;
    Wait(DureeClipCycles);
  }
}
  
// called when a mouse button is clicked
function on_mouse_click(MouseButton button)
{
  GUI* gsurvol = GUI.GetAtScreenXY (mouse.x,  mouse.y);
  InventoryItem* isurvol = InventoryItem.GetAtScreenXY (mouse.x,  mouse.y);

  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
    player.ActiveInventory = null;
    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();
  }
  else if ((mouse.IsModeEnabled(eModeRegarder)&&(button == eMouseRightInv)))
  {
    mouse.EnableMode(eModeMain);
  }
  else if ((mouse.IsModeEnabled(eModeMain)&&(button == eMouseRightInv)))
  {
    mouse.EnableMode(eModeRegarder);
  }
    else if ((mouse.IsModeEnabled(eModeRegarder)&&(button == eMouseLeftInv)))
  {
    inventory[game.inv_activated].RunInteraction(eModeRegarder);
  }
  else if ((mouse.IsModeEnabled(eModeMain)&&(button == eMouseLeftInv)))
  {
    inventory[game.inv_activated].RunInteraction(eModeUseinv);
  }
}

function iPierrePrecieuse_Look()
{
player.Say("En terme de pierre ça a l'air quand même vachement précieux...");
}

function dialog_request(int param) {
}


function cPierre_UseInv()
{
if(player.ActiveInventory == iPierrePrecieuse)
{
 player.Say("Oups...");
}}

function cGarg_UseInv()
{
  if(player.ActiveInventory == iSifflet)
{  
    int alea=Random(5);
    if (alea==0) Sifflet = aSifflet01.Play();
    if (alea==1) Sifflet = aSifflet02.Play();
    if (alea==2) Sifflet = aSifflet03.Play();
    if (alea==3) Sifflet = aSifflet04.Play();
    if (alea==4) Sifflet = aSifflet05.Play();
    if (alea==5) Sifflet = aSifflet06.Play();
 
    int DureeClipCycles = Sifflet.LengthMs/(1000/GetGameSpeed()) + 1;
    Wait(DureeClipCycles);
  }

{
  if(player.ActiveInventory == iPierrePrecieuse)
  {  
    player.Say ("rien");
  }  
}
}

function cPierre_Talk()
{
player.FaceCharacter(cPierre);
dDialog1.Start();

}

function cGarg_Interact()
{
player.Say("La bienséance me l'inderdit.");
}

function cGarg_Talk()
{
player.Say("Je ne suis pas assez schizo pour parler tout seul.");
player.Say("Désolé.");
}

Par contre dans le General Settings j'ai mis False sinon rien ne fonctionne !

La biz.

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyMer 9 Fév 2022 - 23:39

Juste pour clarifier, étant donné que ça concerne exactement le point soulevé par le premier message de ce sujet :

Code:
  else if ((mouse.IsModeEnabled(eModeRegarder)&&(button == eMouseRightInv)))
  {
    mouse.EnableMode(eModeMain);
  }
  else if ((mouse.IsModeEnabled(eModeMain)&&(button == eMouseRightInv)))
  {
    mouse.EnableMode(eModeRegarder);
  }
  else if ((mouse.IsModeEnabled(eModeRegarder)&&(button == eMouseLeftInv)))
  {
    inventory[game.inv_activated].RunInteraction(eModeRegarder);
  }
  else if ((mouse.IsModeEnabled(eModeMain)&&(button == eMouseLeftInv)))
  {
    inventory[game.inv_activated].RunInteraction(eModeUseinv);
  }

Cette partie-là s'applique uniquement à des clics sur des objets d'inventaire : tout clic dans une zone d'inventaire en dehors d'un objet d'inventaire n'est pas détecté par on_mouse_click. Ça veut dire, en particulier, que ces lignes :

Code:
  else if ((mouse.IsModeEnabled(eModeRegarder)&&(button == eMouseRightInv)))
  {
    mouse.EnableMode(eModeMain);
  }
  else if ((mouse.IsModeEnabled(eModeMain)&&(button == eMouseRightInv)))
  {
    mouse.EnableMode(eModeRegarder);
  }

ont pour effet d'activer le mode eModeMain lorsque tu fais un clic droit sur un objet d'inventaire si le mode eModeRegarder est activé, et d'activer le mode eModeRegarder lors d'un clic droit sur un objet d'inventaire si le mode eModeMain est activé

Autre chose que je pense être nécessaire de clarifier : les fonctions mouse.EnableMode et compagnie concernent le statut activé/disponible des modes de curseur en question, pas le statut actuellement actif des modes de curseur. Pour vérifier ou changer le mode de curseur actif, il faut directement utiliser mouse.Mode. Par exemple, si tu veux changer les modes de curseur plutôt que les (ré)activer dans le bout de code plus haut, il faudrait faire ça :

Code:
  else if ((mouse.Mode==eModeRegarder)&&(button == eMouseRightInv))
  {
    mouse.Mode = eModeMain;
  }
  else if ((mouse.Mode==eModeMain)&&(button == eMouseRightInv))
  {
    mouse.Mode = eModeRegarder;
  }

(Note, comme je l'ai dit plus haut, que ça ne marchera que lors de clics sur des objets d'inventaire)

_________________
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 !
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


Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. EmptyJeu 10 Fév 2022 - 16:27

J'y suis presque !
Le clic droit passe cette fois correctement en mode main, cependant le clic gauche reste comme bloqué en mode regarder.
Je suis dubitatif, je ne comprends toujours pas d'où ça peut venir.
J'ai changé le code depuis la dernière fois... Le voici...
Code:


// main global script file
AudioChannel* Sifflet;
// called when the game starts, before the first room is loaded
function game_start()
{
  Mouse.SetPosition(456, 772);
  Game.MinimumTextDisplayTimeMs = 2800;
  game.lipsync_speed = 10;
  gInventaire.Visible = false;
  aFroggy.Play();
}

function btnInvdroite_OnClick(GUIControl *control, MouseButton button)
{
Invcadre.ScrollDown();
}

function btnInvgauche_OnClick(GUIControl *control, MouseButton button)
{
Invcadre.ScrollUp();
}

function iSifflet_Look()
{
player.Say("Ça, c'est mon sifflet à moi.");
}


function BtnBille_OnClick(GUIControl *control, MouseButton button)
{
  {  
  if (gInventaire.Visible == false) {
  aInv.Play();
  gInventaire.Visible = true;
  }
  else
  {
  aClac.Play();
  gInventaire.Visible = false;  
  }
}}

function dialog_options_get_dimensions(DialogOptionsRenderingInfo *info)
{
  // Crée une zone de dimensions 200x200 à la position (50,100) pour les options
  info.X = 320;
  info.Y = 890;
  info.Width = 1280;
  info.Height = 400;
  // Place l'analyseur de texte (parser) tout en bas (s'il est activé)
  info.ParserTextBoxX = 0;
  info.ParserTextBoxY = 800;
  info.ParserTextBoxWidth = 0;
}

function dialog_options_render(DialogOptionsRenderingInfo *info)
{
  // Remplit la zone en jaune
  info.Surface.Clear(0);
  int i = 1,  ypos = 8;
  // Affiche toutes les options disponibles
  while (i <= info.DialogToRender.OptionCount)
  {
    if (info.DialogToRender.GetOptionState(i) == eOptionOn)
    {
      if (info.ActiveOptionID == i) info.Surface.DrawingColor = 65522;
      else info.Surface.DrawingColor = 15615;
      info.Surface.DrawStringWrapped(30, ypos, info.Width - 120,
                         eFontFont0, eAlignLeft, info.DialogToRender.GetOptionText(i));
      ypos += GetTextHeight(info.DialogToRender.GetOptionText(i), eFontFont0, info.Width - 50);
    }
    i++;
  }
}

function dialog_options_get_active(DialogOptionsRenderingInfo *info)
{
  int i = 1,  ypos = 0;
  // Trouve l'option située où le joueur a cliqué
  while (i <= info.DialogToRender.OptionCount)
  {
    if (info.DialogToRender.GetOptionState(i) == eOptionOn)
    {
      ypos += GetTextHeight(info.DialogToRender.GetOptionText(i), eFontFont0, info.Width - 300);
      if ((mouse.y - info.Y) < ypos)
      {
        info.ActiveOptionID = i;
        return;
      }
    }
    i++;
  }
}


function gestion_curseur()
{
//__________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);    
  GUI* gsurvol = GUI.GetAtScreenXY (mouse.x,  mouse.y);
  InventoryItem* isurvol = InventoryItem.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(eModeMain))&&(csurvol.GetProperty("Persomain")== false))
    {
      mouse.ChangeModeGraphic(eModeMain,5);
    }
    else if ((mouse.IsModeEnabled(eModeMain))&&(csurvol.GetProperty("Persomain")== true))
    {
      mouse.ChangeModeGraphic(eModeMain,6);  
    }
    if (mouse.IsModeEnabled(eModeParler))
    {
      mouse.ChangeModeGraphic(eModeParler,cool;
    }
  }
// gestion INVENTAIRE

if ((isurvol != null)||(gsurvol != null))
  {  
    mouse.DisableMode(eModeAller);
    mouse.DisableMode(eModeParler);
  }
else
    mouse.EnableMode(eModeParler);
    mouse.EnableMode(eModeAller);  
    
if ((mouse.IsModeEnabled(eModeRegarder)&&(isurvol != null)))
  {
    mouse.ChangeModeGraphic(eModeRegarder,4);
  }
if ((mouse.IsModeEnabled(eModeMain)&&(isurvol != null)))
  {
    mouse.ChangeModeGraphic(eModeMain,6);  
  }
}        

function unhandled_event(int what, int type) {
{
}}

// called on every game cycle, except when the game is blocked
function repeatedly_execute()
{
if (IsGamePaused() == 1) return;
  
  gestion_curseur();
}


// called on every game cycle, even when the game is blocked
function repeatedly_execute_always()
{
}

// called when a key is pressed
function on_key_press(eKeyCode keycode)
{
  if (IsGamePaused())
  {
    // game paused, so don't react to any keypresses
    keycode = 0;
  }
  else if (keycode == eKeyEscape)
  {
    // Ctrl-Q will quit the game
    QuitGame(1);
  }
  else if (keycode == eKeyF9)
  {
    // F9 will restart the game
    RestartGame();
  }
  else if (keycode == eKeyF12)
  {
    // F12 will save a screenshot to the save game folder
    SaveScreenShot("screenshot.pcx");
  }
  else if (keycode == eKeyCtrlS)
  {
    // Ctrl-S will give the player all defined inventory items
    Debug(0, 0);
  }
  else if (keycode == eKeyCtrlV)
  {
    // Ctrl-V will show game engine version and build date
    Debug(1, 0);
  }
  else if (keycode == eKeyCtrlA)
  {
    // Ctrl-A will show walkable areas
    Debug(2, 0);
  }
  else if (keycode == eKeyCtrlX)
  {
    // Ctrl-X will let the player teleport to any room
    Debug(3, 0);
  }
  else if (keycode == eKeyF1)
  {
    int alea=Random(5);
    if (alea==0) Sifflet = aSifflet01.Play();
    if (alea==1) Sifflet = aSifflet02.Play();
    if (alea==2) Sifflet = aSifflet03.Play();
    if (alea==3) Sifflet = aSifflet04.Play();
    if (alea==4) Sifflet = aSifflet05.Play();
    if (alea==5) Sifflet = aSifflet06.Play();
 
    int DureeClipCycles = Sifflet.LengthMs/(1000/GetGameSpeed()) + 1;
    Wait(DureeClipCycles);
  }
}
  
// called when a mouse button is clicked
function on_mouse_click(MouseButton button)
{
  GUI* gsurvol = GUI.GetAtScreenXY (mouse.x,  mouse.y);
  InventoryItem* isurvol = InventoryItem.GetAtScreenXY (mouse.x,  mouse.y);

  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
    player.ActiveInventory = null;
    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();
  }
  else if ((mouse.Mode==eModeRegarder)&&(button == eMouseRightInv))
  {
    mouse.Mode = eModeMain;
  }
  else if ((mouse.Mode==eModeMain)&&(button == eMouseRightInv))
  {
    mouse.Mode = eModeRegarder;
  }
  else if ((mouse.IsModeEnabled(eModeRegarder)&&(button == eMouseLeftInv)))
  {
    inventory[game.inv_activated].RunInteraction(eModeRegarder);
  }
  else if ((mouse.IsModeEnabled(eModeMain)&&(button == eMouseLeftInv)))
  {
    inventory[game.inv_activated].RunInteraction(eModeUseinv);
  }
}

function iPierrePrecieuse_Look()
{
player.Say("En terme de pierre ça a l'air quand même vachement précieux...");
}

function dialog_request(int param) {
}


function cPierre_UseInv()
{
if(player.ActiveInventory == iPierrePrecieuse)
{
 player.Say("Oups...");
}}

function cGarg_UseInv()
{
  if(player.ActiveInventory == iSifflet)
{  
    int alea=Random(5);
    if (alea==0) Sifflet = aSifflet01.Play();
    if (alea==1) Sifflet = aSifflet02.Play();
    if (alea==2) Sifflet = aSifflet03.Play();
    if (alea==3) Sifflet = aSifflet04.Play();
    if (alea==4) Sifflet = aSifflet05.Play();
    if (alea==5) Sifflet = aSifflet06.Play();
 
    int DureeClipCycles = Sifflet.LengthMs/(1000/GetGameSpeed()) + 1;
    Wait(DureeClipCycles);
  }

{
  if(player.ActiveInventory == iPierrePrecieuse)
  {  
    player.Say ("rien");
  }  
}
}

function cPierre_Talk()
{
player.FaceCharacter(cPierre);
dDialog1.Start();

}

function cGarg_Interact()
{
player.Say("La bienséance me l'inderdit.");
}

function cGarg_Talk()
{
player.Say("Je ne suis pas assez schizo pour parler tout seul.");
player.Say("Désolé.");
}

_________________
L' est si forte à la course qu'elle en sort de la phrase.  autruche
Revenir en haut Aller en bas
Contenu sponsorisé





Click non fonctionnel sur la fenêtre d'un inventaire. Empty
MessageSujet: Re: Click non fonctionnel sur la fenêtre d'un inventaire.   Click non fonctionnel sur la fenêtre d'un inventaire. Empty

Revenir en haut Aller en bas
 
Click non fonctionnel sur la fenêtre d'un inventaire.
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» [Résolu] click non actif sur gui inventaire et après interraction hotspot
» Question existentielle sur le click gauche et le click droit ! :)
» Bouton de fenetre
» [Résolu]Fenêtre de confirmation Quitter
» Fenêtre de Texte de la fonction Display

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: