Forum d'entraide à la création de jeux d'aventure
 
PortailAccueilFAQRechercherS'enregistrerMembresConnexion
anipassion.com
Partagez | 
 

 [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Jeu 18 Juil 2013 - 15:58

Bon j'aurai bien aimé m'en sortir tout seul pour une fois (ça ne doit pas être bien compliqué) mais je suis encore un peu juste.

Comme l'indique le titre, je voudrais vérifier si une zone a déjà été cliqué (en mode interact par exemple). Je pourrais créer une variable pour chaque hotspot (pour prendre l'exemple des hotspots) mais d'une, c'est un peu laborieux, et de deux, je voudrais pouvoir vérifier l'information à partir du Repeatedly_execute sans connaître à l'avance le hotspot concerné. Pour que ce soit plus clair, à la base je voulais faire ça :

Code:
Hotspot* zoneSurvolee = Hotspot.GetAtScreenXY(mouse.x,mouse.y);
if (zoneSurvolee.GetProperty("DéjàCliqué") == true)
//etc...

Et pour définir la propriété "DéjàCliqué" sur true, je comptais passer par le script de la room, en ajoutant une ligne sur les Events concernés.

Mais comme je le craignais, on ne peut pas modifier la valeur des propriétés personnalisées depuis le script (c'est d'ailleurs bien dommage) et il m'est donc impossible de procéder de cette manière.

Je comptais donc faire une fonction qui me permette de faire quelque chose comme ça :
Code:
if zoneSurvolée.DejaClique(Interact) == true

Mais même avec le super tuto de Billbis je ne sais pas trop comment m'y prendre. Pour commencer je ne sais pas exactement comment vérifier qu'un clic à lieu dans un certain mode à un moment donné.

Je compte donc (une fois de plus) sur vos conseils éclairés !

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.


Dernière édition par valoulef le Ven 19 Juil 2013 - 22:29, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Jeu 18 Juil 2013 - 17:17

Coucou valoulef,
l'idéal serait que tu nous décrive ton objectif final, qu'on puisse voir s'il n'y a pas une solution alternative plus simple permettant de faire le même chose.

Si je comprend bien, tu voudrais pourvoir vérifier si le joueur a déjà cliqué au moins une fois sur l'objet / hotspot / personnage lors du survol de la souris, pour tout les objets / hotspots / personnages ? Pour faire quoi (tant pis si tu nous spoil...)?
Je serai moi aussi parti avec les custom properties. Malheureusement elles ne sont pas encore modifiables en cours de jeu (mais dans AGS 3.4.0 alpha, si !). Tu peux regarder du coté de ce module de monkey_05_06 qui permet des propriétés personnalisables pendant le jeu. tu peux aussi recoder des arrays de bool pour chaque objet / hotspot (une par room) / personnage (une pour tout le jeu), mais c'est un peu lourd à mettre en place...

valoulef a écrit:
Pour commencer je ne sais pas exactement comment vérifier qu'un clic à lieu dans un certain mode à un moment donné.
Tu peux soit coder quelque chose dans le on_mouse_click , ou le coder dans chacune de tes interactions (en utilisant par exemple DoOnceOnly).

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2431

Date d'inscription : 01/08/2006


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Jeu 18 Juil 2013 - 17:52

Attention : les codes donnés dans ce message n'ont pas été testés.

valoulef a écrit:
Bon j'aurai bien aimé m'en sortir tout seul pour une fois (ça ne doit pas être bien compliqué) mais je suis encore un peu juste.
En fait ce problème est plus compliqué qu'il n'y paraît. Comme le remarque Billbis, les zones interactives et les objets sont propres à chaque pièce, contrairement aux personnages :
Billbis a écrit:
tu peux aussi recoder des arrays de bool pour chaque objet / hotspot (une par room) / personnage (une pour tout le jeu)

Billbis suggère aussi une autre possibilité, que je me propose de te présenter plus en détails :
Billbis a écrit:
tu peux aussi recoder des arrays de bool pour chaque objet / hotspot (une par room) / personnage (une pour tout le jeu), mais c'est un peu lourd à mettre en place...

Les tableaux (dynamiques en l'occurrence, pour avoir un maximum d'adaptabilité) vont nous permettre d'arriver à nos fins.

Pour les personnages, ça va être facile : on va faire un simple tableau de variables booléennes où chaque entrée correspondant à l'index du personnage contiendra l'information si le joueur a déjà ou non cliqué dessus. Ça donne quelque chose comme ça :
Code:
// Haut du script global
bool persoDejaClique[]; // Le tableau

// Au début du jeu, on dimensionne le tableau selon le nombre de personnages
function game_start() {
  // Par défaut, toutes les entrées prennent la valeur FALSE
  persoDejaClique = new bool[Game.CharacterCount];
}

// Lors d'un clic sur un personnage, on passe l'entrée correspondant à son index à TRUE
function on_mouse_click(MouseButton bouton) {
  if (bouton == eMouseLeft) { // Clic gauche
    // S'il y a un personnage sous la souris
    if (GetLocationType(mouse.x, mouse.y) == eLocationCharacter) {
      // On récupère ce personnage
      Character* survol = Character.GetAtScreenXY(mouse.x, mouse.y);
      // Et on modifie la valeur de l'entrée correspondante
      persoDejaClique[survol.ID] = true;
    }
  }
}
Ensuite, pour vérifier dans ton repeatedly_execute, tu fais simplement ça :
Code:
Character* persoSurvole = Character.GetAtScreenXY(mouse.x, mouse.y);
if (persoSurvole != null && persoDejaClique[persoSurvole.ID] == true) // ...

Là où ça se corse, c'est pour les objets et les zones interactives. On ne peut pas faire la même chose que pour les personnages vu qu'il ne sont pas globaux. Ceci a deux effets :

  1. Il n'y a pas de propriété globale équivalente à CharacterCount
  2. Appliquer la méthode plus haut considérerait que le joueur a déjà cliqué sur l'objet 0 de la pièce 1 lorsqu'il aurait seulement cliqué sur l'objet 0 de la pièce 0

Quelle solution alors ? L'idéal serait de pouvoir avoir un tableau à deux dimensions : la première dimension renseignement la pièce, la seconde dimension l'objet/la zone interactive dans cette pièce.
Code:
hotspotDejaClique[player.Room][objetSurvole.ID] // Pseudo-code
Malheureusement AGS ne propose pas ce genre de choses et le code précédent crashera. Heureusement, il y a une façon de s'en sortir, au moins pour les variables booléennes. Il faut utiliser des chaînes de caractères. Car si on réfléchit bien, une chaîne de caractères n'est rien de plus qu'un tableau dynamique dont chaque entrée prend une valeur entre 0 et 255. Nous on a seulement besoin de 2 valeurs (l'équivalent de true et l'équivalent de false), donc on est plus que servis !
L'idée est donc la suivante : on va créer un tableau de chaînes pour les zones interactives et un tableau de chaînes pour les objets. On ajoutera une entrée à ces tableaux chaque fois que le joueur entre dans une pièce pour la première fois. La chaîne de chacune des entrées de ces tableaux aura une longueur du nombre d'objets dans la pièce et de 50 pour les zones interactives (maximum dans AGS 3.3 et inférieures).
On représentera la valeur true par le caractère numéro 2, false par le caractère numéro 1.
On obtient la chose suivante :
Code:
// Haut du script global
bool persoDejaClique[]; // Les personnages
String hotspotDejaClique[]; // Les zone interactives dans chaque pièce
String objetDejaClique[]; // Les zone interactives dans chaque pièce

int nombrePieces; // On va compter le nombre de pièces au fur et à mesure (il n'y a pas de propriété RoomCount)
int indicesPiece[]; // Puisqu'un jeu peut comporter uniquement deux pièces dont les numéros sont pourtant 30 et 350 par exemple, on va avoir besoin de les indexer nous-mêmes

int indicePieceActuelle; // L'indice dans le tableau de la pièce dans laquelle on se trouve

// Pour ajouter une entrée à un tableau d'entiers
int[] TableauAjouteInt(int tableau[], int taille, int valeur) {
  if (taille < 0) taille = 0;
  int tmp[] = new int[taille+1];
  int i = 0;
  while (i < taille) {
    tmp[i] = tableau[i];
    i++;
  }
  tmp[i] = valeur;
  return tmp;
}

// Pour ajouter une entrée à un tableau de chaînes
String[] TableauAjouteString(String tableau[], int taille, String valeur) {
  if (taille < 0) taille = 0;
  String tmp[] = new String[taille+1];
  int i = 0;
  while (i < taille) {
    tmp[i] = tableau[i];
    i++;
  }
  tmp[i] = valeur;
  return tmp;
}

// Au début du jeu, on dimensionne le tableau selon le nombre de personnages
function game_start() {
  // Par défaut, toutes les entrées prennent la valeur FALSE
  persoDejaClique = new bool[Game.CharacterCount];
}

// Lorsque le joueur entre dans une pièce
function on_event(EventType evenement, int data) {
  if (evenement == eEventEnterRoomBeforeFadein) {
    int i = 0;
    while (i < nombrePieces) {
      if (indicesPiece[i] == data) { // Si la pièce se trouve dans la liste
        indicePieceActuelle = i; // On définit l'indice
        return; // C'est tout
      i++;
    }
    // Si on est sorti de la boucle : on n'est jamais entré dans la pièce
      // On ajoute alors le numéro de la pièce au tableau
    indicesPiece = TableauAjouteInt(indicesPiece, nombrePieces, data);
      // On ajoute une entrée à chaque tableau
    hotspotDejaClique = TableauAjouteString(hotspotDejaClique, nombrePieces, "");
    objetDejaClique = TableauAjouteString(objetDejaClique, nombrePieces, "");
    // On place 50 caractères de valeur 1 pour les zones interactives
    i = 0;
    while (i < 50) {
      hotspotDejaClique[nombrePieces] = hotspotDejaClique[nombrePieces].AppendChar(1);
      i++;
    }
    // On place ObjectCount caractères de valeur 1 pour les zones interactives
    i = 0;
    while (i < Room.ObjectCount) {
      objetDejaClique[nombrePieces] = objetDejaClique[nombrePieces].AppendChar(1);
      i++;
    }
    // On redéfinit l'indice en cours
    indicePieceActuelle = nombrePieces;
    // On augmente le nombre de pièces
    nombrePieces++;
  }
}

// Lors d'un clic sur un personnage, on passe l'entrée correspondant à son index à TRUE
function on_mouse_click(MouseButton bouton) {
  if (bouton == eMouseLeft) { // Clic gauche
    LocationType type = GetLocationType(mouse.x, mouse.y)
    if (type == eLocationCharacter) {
      Character* survol = Character.GetAtScreenXY(mouse.x, mouse.y);
      persoDejaClique[survol.ID] = true;
    }
    else if (type == eLocationHotspot) {
      Hotspot* survol = Hotspot.GetAtScreenXY(mouse.x, mouse.y);
      // On remplace le caractère par 2 ("true")
      hotspotDejaClique[indicePieceActuelle].ReplaceCharAt(survol.ID, 2);
    }
    else if (type == eLocationObject) {
      Object* survol = Object.GetAtScreenXY(mouse.x, mouse.y);
      objetDejaClique[indicePieceActuelle].ReplaceCharAt(survol.ID, 2);
    }
  }
}

_________________
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
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Jeu 18 Juil 2013 - 20:21

Super malin, le coup de faire des matrices en utilisant des array de string !
Mais je reste curieux de savoir à quoi tout ça va servir... ?

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 1:03

Kitai a écrit:

En fait ce problème est plus compliqué qu'il n'y paraît.

Bon ben au moins, là, tu ne m'auras pas menti ! Je me répète mais merci encore de te donner autant de mal pour si peu...
L'avantage, c'est que j'ai encore du mal avec le concept de tableaux dynamiques, et que je pourrais encore apprendre beaucoup avec ça. Mais comme je ne m'attendais pas à ce que ce soit si gourmand j'en suis à me demander si ça ne serait pas plus simple de coder ça au cas par cas finalement... Tu me diras, tu m'as mâché l'essentiel du travail mais je ne veux pas implémenter du code sans chercher à le comprendre, ça me parait être la moindre des choses de faire l'effort de mon côté. Je vais donc me pencher sur la question...

Billbis a écrit:
Je serai moi aussi parti avec les custom properties. Malheureusement elles ne sont pas encore modifiables en cours de jeu (mais dans AGS 3.4.0 alpha, si !).

En voilà une bonne nouvelle ! Ce serait vraiment pas mal, en l'occurrence on passe d'une centaine de lignes de codes à une poignée seulement. Et il y a de nombreux cas pour lesquels ça pourrait servir. "Malheureusement" je me suis beaucoup attaché à la version française que l'on doit à un de nos membres mais je ne me rappelle plus qui et comme en plus il ne s'agit encore d'une version alpha, je pense que j'ai le temps de voir venir... Cela dit le module que tu cites me parait très intéressant, je vais me pencher dessus aussi, le problème restant encore une fois mes difficultés avec la langue de Shakespeare, mais bon, si créer un jeu peut m'aider en plus à améliorer mon anglais, ça ne sera pas du luxe !

Billbis a écrit:
Mais je reste curieux de savoir à quoi tout ça va servir... ?

Héhé, j'aurais dû m'en douter ! En fait c'est plus de la curiosité qu'une nécessité clin d\\\\'oeil

Cela dit si ça se trouve, quand je vous aurais dit ce qui suit vous allez me trouver une autre solution, qui sait ?

Bon, à la base, j'en ai ressenti le besoin sur une situation toute simple, mais je me suis rendu compte que ça pouvait servir à beaucoup de choses (que je n'ai d'ailleurs sûrement pas encore toutes en tête).

Alors déjà, il faut savoir que dans l'état actuel des choses (ce n'est pas encore complètement fixé), j'ai fait en sorte qu'au survol de tout élément interactif, l'interaction possible s'affiche en bas de l'écran, à la manière d'un Runaway, par exemple.
Concrètement, pour prendre l'exemple d'une clé à ramasser, au moment où tu passe sur celle-ci avec ton curseur, il s'affiche en bas de l'écran : "Prendre la clé". Si maintenant je survole la porte qui mène à la cuisine, cela marquera "Aller vers la cuisine".
Mais si je veux aller plus loin, je me dis que ni le joueur, ni le personnage contrôlé, qui découvrent en même temps les lieux, ne savent que la porte mène à la cuisine. Et par souci du détail ou maniaquerie - c'est selon - je souhaite respecter à la lettre ce synchronisme entre le joueur et le personnage, et faire donc en sorte que le joueur ne découvre les choses que quand il les voit. Et donc, avant d'avoir ouvert la porte une première fois, il faudrait afficher quelque chose comme "Aller vers la pièce adjacente", par exemple. Idem pour les personnages : il me parait complètement absurde d'écrire "Parler à Robert" si on ne sait pas encore que le personnage s'appelle Robert (c'est d'ailleurs comme ça qu'on écrit en théorie un scénario de cinéma, en ne donnant les informations que si le spectateur les connaît). Pour reprendre l'exemple des portes, en gros, on fait appel à une description générique si la porte n'a pas encore été ouverte, et à une description définie dans les propriétés personnalisées si elle l'a déjà été.

On peut trouver d'autres utilités. Par exemple, quand on survole quelque chose, le curseur passe automatiquement dans le mode voulu, Interact ou Look At par exemple. On peut très bien imaginer un objet qui ne soit d'abord qu'observable, mais que son observation déclenche une possibilité d'interaction. Cela dit dans ce cas assez spécifique, je pense qu'il serait plus simple de faire 2 hotspots pour une seule zone, un en mode "LookAt" et un en mode "Interact", et d'activer celui dont on a besoin au moment voulu, en désactivant l'autre.

Toujours est-il que je pense que la possibilité de vérifier si tel truc a été cliqué dans tel mode pourrait être utile dans bien des situations.

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2431

Date d'inscription : 01/08/2006


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 6:46

valoulef a écrit:
on fait appel à une description générique si la porte n'a pas encore été ouverte, et à une description définie dans les propriétés personnalisées si elle l'a déjà été.
Tu peux alors utiliser la propriété Name. Tu nommes par exemple tes éléments avec une description générique dans l'éditeur, et tu assignes une propriété personnalisée textuelle à chacun de ces éléments qui contiendra la description définie.
Ensuite, dans ta fonction on_mouse_click, tu fais la chose suivante :
Code:
function on_mouse_click(MouseButton bouton) {
  if (bouton == eMouseLeft) {
    LocationType type = GetLocationType(mouse.x, mouse.y)
    if (type == eLocationCharacter) {
      Character* survol = Character.GetAtScreenXY(mouse.x, mouse.y);
      survol.Name = survol.GetTextProperty("DescriptionDefinie");
    }
    else if (type == eLocationHotspot) {
      Hotspot* survol = Hotspot.GetAtScreenXY(mouse.x, mouse.y);
      survol.Name = survol.GetTextProperty("DescriptionDefinie");
    }
    else if (type == eLocationObject) {
      Object* survol = Object.GetAtScreenXY(mouse.x, mouse.y);
      survol.Name = survol.GetTextProperty("DescriptionDefinie");
    }
  }
}
Et bien sûr tu utilises la propriété Name de l'élément en question pour afficher la description au survol. Tout cela à condition de ne pas utiliser cette propriété ailleurs (encore que selon ton raisonnement, on ne devrait pas pouvoir utiliser le "nom" de l'élément tant qu'on ne l'a pas inspecté).

_________________
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
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 7:47

Je pensai bien que valoulef voulait faire quelque chose comme ça, et j'allai lui proposer la même méthode que Kitai, mais il a été plus rapide. ^^
Pour une fois, j'ai envie de rajouter un if au code de Kitai : je suppose que tout les objets n'ont pas besoin d'être inspectés une première fois pour découvrir leurs vrais noms. On peut donc ne changer leurs noms que quand la custom property n'est pas vide ou n'a pas la valeur par défaut :
Code:
// si la custom property n'est pas null
if (survol.GetTextProperty("DescriptionDefinie") != null) {
// ou bien, si tu lui assigne une valeur par défaut :
if (survol.GetTextProperty("DescriptionDefinie") != "Texte par défaut") {
Sentez vous cet irrésistible besoin de fermer ces accolades ouvertes ? Vous passerez toute la journée avec ce sentiment d'inachevé. Je suis machiavélique ! HA ! HA ! HA ! HA ! HA !
grand sourire
.

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 13:48

Ah mince  ! C'est effectivement  beaucoup plus simple vu comme ça ! Bon ben la prochaine fois que j'aurais un souci je penserai à expliquer ce que je veux faire exactement. Cela dit ta méthode avec les tableaux dynamiques restera un bon exemple pour mieux comprendre ceux-ci.

Merci beaucoup !

Ah, une dernière chose :
Code:
Character* survol = Character.GetAtScreenXY(mouse.x, mouse.y);
      survol.Name = survol.GetTextProperty("DescriptionDefinie");

Les variables de ce type, on peut y faire appel dans toutes les fonctions du script situées en dessous de la déclaration, c'est bien ça ? (edit : visiblement non, mais c'est pas grave)

Edit : Bon ben de manière très curieuse, j'apprends que si la variable "Name" des personnages est modifiable, celle des hotspot est en lecture seule. C'est fâcheux, car c'est surtout les hotspots qui m'intéressent dans un premier temps. Cela dit il y a peut-être moyen de déclarer une variable de même type avec une valeur égale à Name par défaut et de la modifier ensuite ? Je vais voir ça...

Edit 2 : Visiblement non... Grrr ! En même temps je m'en doutais un peu, parce que si on avait pu créer une variable relatif à un Hotspot (comme Name), ça aurait réglé tout le problème depuis le début.

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 16:35

valoulef a écrit:
Edit : Bon ben de manière très curieuse, j'apprends que si la variable "Name" des personnages est modifiable, celle des hotspot est en lecture seule.
peur 
Tant pis pour la solution simple, alors...

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 17:02

Billbis a écrit:

Tant pis pour la solution simple, alors...

Faut voir. J'essaie d'utiliser le module que tu m'as soumis pour créer des propriétés personnalisées dont la valeur est modifiable via le script.

Un seul hic : je n'arrive pas à m'en servir grand sourire 
J'utilise la commande pour créer la propriété, puis celle pour modifier sa valeur, seulement quand je vérifie l'existence de cette propriété, je me heurte à une réponse négative... Je ne sais pas pourquoi, je dois probablement mal m'y prendre.

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 17:06

Worse_Username a écrit:
Apparently, MaxProperties being set to 1 by default was causing it. After setting it to a higher value everything started working.
Vérifies si MaxProperties n'est pas à 1. Je n'ai malheureusement pas testé le module moi même...

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 17:16

Billbis a écrit:
[
Vérifies si MaxProperties n'est pas à 1. Je n'ai malheureusement pas testé le module moi même...

Moi je l'ai testé. J'ai passé peut être deux heures à le faire marcher. Toi tu ne l'as pas testé... En deux secondes tu me trouve la solution... Cherchez l'erreur perplexe 

Bon en tout cas ça marche c'est super, merci grand sourire 

C'est vraiment trollesque de créer un module qu'on ne peut pas faire fonctionner par défaut, non ?

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 17:29

valoulef a écrit:
Toi tu ne l'as pas testé... En deux secondes tu me trouve la solution... Cherchez l'erreur
Bin, c'est juste que moi je comprends à peu prés l'anglais. ^^
valoulef a écrit:
C'est vraiment trollesque de créer un module qu'on ne peut pas faire fonctionner par défaut, non ?
C'est un peu ce qu'on lui a fait remarquer, mais il n'a pas encore corrigé ça...

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Ven 19 Juil 2013 - 19:03

Je vais devenir fou ! La deuxième fois que le script modifiant la valeur de la propriété est appelé, celle ci retombe toujours à zéro ! En gros ça fonctionne une fois sur deux et une fois sur 2 la valeur revient à zéro... Et ce quelque soit ce que j'entre comme nouvelle valeur (1, 4, +1...) Et le pompon c'est que le jeu finit par crasher à cause de cette ligne...

Code:
return String.Format("%s%s%s", this.Substring(0, is), value, this.Substring(0, ie));

... qui finit par produire une chaîne de caractères excédant la limite tolérée par AGS qui est (edit) de... 3000 caractères !

Bon je sais que vous ne pouvez pas beaucoup m'aider sur ce module, mais il fallait que je partage...


EDIT : Du coup je pense que je vais utiliser DoOnceOnly comme tu me le suggérais, mais c'est dommage et bizarre de ne pas pouvoir modifier la valeur de la propriété plusieurs fois...

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.


Dernière édition par valoulef le Dim 21 Juil 2013 - 23:41, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2431

Date d'inscription : 01/08/2006


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Dim 21 Juil 2013 - 21:03

valoulef a écrit:
... qui finit par produire une chaîne de caractères excédant la limite tolérée par AGS de... 3000 caractères !
C'est assez étrange ça... La ligne que tu as donnée a un rapport avec le module de monkey ? Une des variables (is, ie ou même this) est-elle déterminée par rapport à ces propriétés personnalisées ?

En somme, je veux bien voir le code moi.

_________________
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
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Dim 21 Juil 2013 - 22:53

Oui ça fait partie du module. En fait c'est une variable qui intervient au moment où l'on redéfinit la valeur d'une propriété :

Code:
String SetVectorValue(this String*, String format, int index, String value) {
  if ((String.IsNullOrEmpty(format)) || (format.IndexOf("%d") == -1)) return this;
  format = String.Format(format, index);
  int is = this.IndexOf(format);
  if (is == -1) {
    String s = this.Append(String.Format("%s%s%s", format, value, format));
    return s;
  }
  String s = this.Substring(is + format.Length, this.Length);
  int ie = s.IndexOf(format);
  if (ie == -1) return this;
  ie += is;
  return String.Format("%s%s%s", this.Substring(0, is), value, this.Substring(0, ie));
}

Mais je ne sais pas exactement à quoi elle sert exactement. Si je supprime les 3 dernières lignes ça fonctionne toujours et le jeu ne crash plus (mais la valeur est toujours réinitialisée à la deuxième mise à jour). Cette variable est appelée plus loin dans les fonctions "SetCustomProperties" servant comme leur nom l'indique à redéfinir la valeur des propriétés personnalisées. En l'occurrence :

Code:
void SetCustomProperty(this Hotspot*, String property, int value, int roomID) {
  int pID = Properties_GetID(property);
  if ((pID == -1) || ((Properties_IsText[pID]) && (eProperties_ObeyPropertyType))) return;
  if ((roomID <= 0) || (roomID >= eProperties_MaxRooms)) roomID = player.Room;
  if (roomID >= eProperties_MaxRooms) return;
  pID = ((roomID * eProperties_MaxProperties) + pID);
  if (Properties_Hotspots[pID] == null) Properties_Hotspots[pID] = "";
  Properties_Hotspots[pID] = Properties_Hotspots[pID].SetVectorValue(Properties_HotspotFormat, this.ID, String.Format("%d", value));
}

Personnellement je n'ai pas pu aller très loin dans l'analyse du code de ce module qui dépasse allègrement mes compétences.

Dans mon GlobalScript, j'ai fait ça, je ne pense pas faire d'erreur dans ma façon d'utiliser les fonctions du module :
Code:

function on_mouse_click(MouseButton button) {
  // called when a mouse button is clicked. button is either LEFT or RIGHT
  if (IsGamePaused() == 1) {
    
      }
  else if (button == eMouseLeft) {
  
 ProcessClick(mouse.x, mouse.y, mouse.Mode );
  LocationType type = GetLocationType(mouse.x, mouse.y);
  Hotspot* survol = Hotspot.GetAtScreenXY(mouse.x, mouse.y);
  if (type == eLocationHotspot) {
    if (Game.DoOnceOnly("Déjà cliqué")) survol.SetCustomProperty("DejaClique", 1);
    mouse.Mode = eModeWait;
  }

A préciser que j'ai utilisé "DoOnceOnly" pour contrer le bug (ce qui fonctionne), comme je l'ai dit dans mon post précédent. A la base je me disais que je pourrais très bien profiter du module pour comptabiliser le nombre de clics sur chaque élément, ce qui pourrait avoir une utilité dans certaines situations, mais bon...

Kitai a écrit:

En somme, je veux bien voir le code moi.

Je ne sais pas si ça te suffira, mais ne t'embête pas trop pour ça, ce n'est pas très grave (même si je sens que c'est surtout ta curiosité qui est attisée ^^).

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue


Nombre de messages : 1275

Date d'inscription : 10/05/2012


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Mar 23 Juil 2013 - 18:29

Coucou.
Où en es-tu, finalement ?
A mon avis, le Game.DoOnceOnly ne doit pas tout corriger : pour bien faire, tu es sensé le mettre dans le code de chaque hotspots, pas dans le on_mouse_click (ce qui, du coup, perd de son intérêt...), en mettant un texte différent à chaque fois. Là, il ne s’exécute qu'une seule fois, au 1er clique sur un hotspot...
Juste par sécurité, tu peux aussi préciser la room dans le SetCustomProperty :
Code:
survol.SetCustomProperty("DejaClique", 1, player.Room);
mais à mon avis, ca ne changera à rien : j'ai télécharger le module, bien changé eProperties_MaxProperties à 10000 et eProperties_MaxRooms à 6 (nombre de room dans mon projet), et exécuté ce code :
Code:
function room_Load()
{
  Properties.Create("test", 0);
}

function hKumTree_Look()
{
    int i = hKumTree.GetCustomProperty("test", player.Room);
    int j = i+1;
    hKumTree.SetCustomProperty("test", j, player.Room);
    int k = hKumTree.GetCustomProperty("test", player.Room);
    player.Say("%d -> %d -> %d", i,  j, k);
}
Et le personnage dit : "0 -> 1 -> 0" à chaque fois que je regarde le hotspot... perplexe 
Donc soit j'utilise mal le module, soit il ne fonctionne pas du tout comme prévu...
Du coup, valoulef, je te conseils plutôt d'essayer d'implémenter la solution de Kitai...
Si j'ai le courage, je demanderai à l'auteur du module pourquoi ça ne fonctionne pas...
Pour info, le manuel du module est aussi disponible en ligne.
Je ne comprend pas bien le sens de la note affiché à SetCustomProperty :
monkey_05_06 a écrit:
NOTE: Hotspot and Object functions operate on the item's ID, not a specific instance.

_________________
Mon petit DevBlog
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nothingaboutthedog.blogspot.fr/
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Mar 23 Juil 2013 - 18:45

Ben en fait je me suis rendu compte que ça ne marchait pas correctement en passant par On_mouse_click en agissant sur un hotspot non déterminé. Donc j'ai fait comme tu dis, dans l'event du hotspot concerné, j'ai ajouté ça :

Code:
if (Game.DoOnceOnly("Pentréecouloir deja cliqué")) hPcouloir.SetCustomProperty("DejaClique", 1);

Et le reste se passe dans mon repeteadly_execute. Pour l'instant ça me suffit, car le nombre d'éléments concernés ne sera pas énorme. Après je ne sais pas encore si ça fonctionnera bien si plusieurs hotspot sont concernés par cette propriété, mais je m'adapterai comme je peux.

J'avais trouvé le manuel en ligne, qui m'a bien aidé. Le module m'a l'air très mal codé, ce qui m'étonne car si je ne m'abuse son auteur est administrateur du forum officiel ? Enfin ça dépanne bien si on s'adapte.

Je ne comprends pas vraiment le sens de cette note non plus, mais il y avait peu de chances pour que ce soit le cas, tu l'aurais comprise avant moi ^^

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Mar 22 Oct 2013 - 23:47

Tiens, je viens par hasard de découvrir la fonction HasPlayerBeenInRoom qui ne règle pas tout ce qui est évoqué dans le topic, mais qui répond à une de mes idées de bases. Je la rapporte ici, on sait jamais ça peut servir...

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 2431

Date d'inscription : 01/08/2006


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Mer 23 Oct 2013 - 6:26

Billbis a écrit:
Je ne comprend pas bien le sens de la note affiché à SetCustomProperty :
monkey_05_06 a écrit:
NOTE: Hotspot and Object functions operate on the item's ID, not a specific instance.
valoulef a écrit:
Je ne comprends pas vraiment le sens de cette note non plus, mais il y avait peu de chances pour que ce soit le cas, tu l'aurais comprise avant moi ^^
Les objets et les zones interactives (je persiste dans ma francophonie) n'ont pas d'instance Object* ou Hotspot* propre : chaque fois qu'on change de pièce, les tableaux object[] et hotspot[] sont repeuplés avec les éléments propres à la pièce.
Du coup le module stocke et récupère les propriétés personnalisées en fonction du numéro de l'objet et de la zone interactive, ce qui évite des pointeurs vides lors d'un changement de pièce. Après à savoir si cela signifie que les propriétés personnalisées des objets et des zones interactives sont perdues lors d'un changement de pièce... (il faudrait regarder le code).

Merci pour le HasPlayerBeenInRoom valoulef, comme tu dis ça peut servir.

_________________
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
Voir le profil de l'utilisateur http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue


Nombre de messages : 1278

Age : 27

Localisation : Condate

Date d'inscription : 01/08/2011


MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Mer 23 Oct 2013 - 9:17

Ah non je précise que les propriétés personnalisées ne sont pas perdues (et heureusement !) au changement de la pièce. A condition de modifier leur valeur une seule fois (ce qui peut être éventuellement embêtant dans certaines situations mais pour l'instant ça me va), elles fonctionnent assez bien.

_________________
"Je pense que la Terre tourne autour du soleil à une vitesse de 30 kilomètres par seconde et que je suis là, accroché à ce bolide de feu qui fonce d'un infini à un autre, accroché à une table, suspendu dans le vide, pendant que, sérieusement, drogué, abruti, inconscient, j'affirme que nous sommes désolés d'apprendre la perte d'un colis expédié le 4 et que nous ferons l'impossible pour réparer cet incident."

L'Employé, Jacques Sternberg.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué   Aujourd'hui à 8:02

Revenir en haut Aller en bas
 
[résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [résolu]Vérifier si un objet/hotspot/personnage a déjà été cliqué
» [Résolu] Faire apparaitre/disparaitre un objet ?
» objet ou personnage
» Condition [Si objet possédé] & Walk to hotSpot ?!
» [Résolu] Zone + objet de récupération de santé amélioré ?

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: