Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le deal à ne pas rater :
SSD interne Crucial BX500 2,5″ SATA – 500 Go à 29,99€
29.99 €
Voir le deal

 

 [Résolu] Changer de curseur selon ce qu'il survole

Aller en bas 
4 participants
AuteurMessage
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue



Nombre de messages : 1791

Date d'inscription : 01/08/2011


[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 EmptyVen 5 Aoû 2011 - 16:08

Merci beaucoup ! J'étais bloqué là dessus et quand j'ai un problème que je ne parviens pas à résoudre, je n'arrive jamais à me lancer dans autre chose en attendant.

Mon problème est réglé et maintenant que je connais l'outil "propriétés personnalisées" cela va surement beaucoup m'aider ! J'avais suspecté que cet outil pourrait m'aider mais je ne savait pas comment il marchait.

Il y avait juste une ou deux erreurs je donne la correction au cas où ça en intéresserait d'autres :

Code:
 Hotspot* hsurvol = Hotspot.GetAtScreenXY(mouse.x, mouse.y); // Le hotspot éventuellement survolé
  Object* osurvol = Object.GetAtScreenXY(mouse.x, mouse.y); // L'objet éventuellement survolé

//


Il fallait juste rajouter "XY" derrière "GetAtScreen"


Code:
 // ... et si ce hotspot doit être en mode LookAt seulement :
    if (hsurvol.GetProperty("LookAt") == true)  mouse.Mode = eModeLookat;
    // sinon
    else mouse.Mode = eModeInteract;

"eModeLookat" et non "eModeLookAt" (c'est quand même con un ordi !)


EDIT : Il y avait une autre erreur à cette ligne là :

Code:
 if (osurvol.GetProperty("LookAt") == true) mouse.Mode == eModeLookAt;

"PE04 : Parse error at 'mouse' "
Je l'ai retapé à l'identique (enfin c'est ce que je croyais), et ça a marché. En fait, je viens juste de comprendre en faisant le c/c qu'il fallait juste mettre '=' au lieu de '=='



Merci beaucoup, je progresse doucement mais sûrement. J'espère d'ici quelques semaines pouvoir vous faire part de mon projet (j'ai l'impression que le forum manque un peu de projets 'actifs', je me trompe ? sourire )

EDIT : Juste un truc que je n'ai pas compris, c'est la signification de "(hsurvol != hotspot[0])", "(osurvol != null)", et la différence entre les deux (pourquoi null pour les objets et pas pour les hotspots ?)


Revenir en haut Aller en bas
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue



Nombre de messages : 1791

Date d'inscription : 01/08/2011


[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 EmptyVen 5 Aoû 2011 - 19:06

Un problème en engendre souvent un autre, j'en ai réglé pas mal depuis tout à l'heure, mais maintenant quand je passe sur un objet de l'inventaire en mode interact, avec ce nouveau code, le personnage ne prend plus la clef (normalement la clef doit apparaître à coté du curseur et on doit par exemple pouvoir la montrer à un personnage ou autre, là ce n'est pas le cas, ça lâche la clé en une micro fraction de seconde)


Je ne sais pas comment régler ça pleure

EDIT : Je précise que j'ai appliqué les codes que l'on a vu précédemment quand les GUI sont visibles, ainsi que quand on survole un objet de l'inventaire
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


[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 EmptySam 6 Aoû 2011 - 0:37

Fiou alors j'ai pas perdu ma soirée, à force de chercher de fouiller et d'expérimenter, j'ai fini par réussir (enfin pour l'instant...).
Je me permets de vous expliquer comment j'ai résolu le problème, d'une part au cas où d'autres auraient un problème similaire (rien de pire de voir que quelqu'un d'autre à eu le même problème que soi sans savoir comment il l'a résolu), et d'autre part, parce que ça me permet de récapituler les choses dans ma tête...

Le problème était que les codes de la fonction repeatedly_execute se répètent en boucle (comme son nom l'indique). J'ai mis le code suivant pour gérer les curseurs dans les GUIs :

Code:
 
else if (isurvol != null) mouse.Mode = eModeInteract;
// si le curseur survole un objet de l'inventaire, il passe en mode Interact

else if ((gInventory.Visible == true) || (gIconbar.Visible == true) || (gPanel.Visible == true) || (gRestartYN.Visible == true) || (gSaveGame.Visible == true) || (gRestoreGame.Visible == true)) mouse.Mode = eModePointer; 
// si le curseur passe sur un de ces GUI (je n'ai pas trouvé de code qui s'appliquerait à tous les GUIs), il passe en mode pointeur

A partir de là, si je cliquais sur un objet de l'inventaire pour le séléctionner, le curseur passait en mode "UseInv" que pendant 1/40eme de seconde car il survolait toujours l'objet, et revenait donc aussitôt au mode Interact.

La solution (pour l'instant ça marche) :

Code:

if (mouse.Mode == eModeUseinv) {
 
Mouse.DisableMode(eModeInteract);
Mouse.DisableMode(eModeTalkto);
Mouse.DisableMode(eModeWalkto);

//Aussitôt que le curseur passe en mode "Use Inv", tout le reste est désactivé. De cette manière, le curseur ne peut pas repasser dans un autre mode.
}


Ensuite j'ai rajouté le code suivant dans la fonction on_mouse_click :
Code:

if (button == eMouseRight || button == eMouseWheelSouth){
   
    if (player.ActiveInventory!=null) {
player.ActiveInventory = null;
Mouse.EnableMode(eModeInteract);
Mouse.EnableMode(eModeTalkto);
Mouse.EnableMode(eModeWalkto);
    }
    else ProcessClick(mouse.x, mouse.y, eModeLookat);
  }
// Si on fait un clic droit alors qu'on a un objet d'inventaire en main, on range l'objet dans l'inventaire et on réactive tous les modes. Sinon, on simule un clic en mode Lookat comme d'habitude.

Il me reste plus qu'à faire en sorte que tous les modes soient réactivés également si on utilise l'objet (ce que j'avais oublié) mais je devrais (j'espère) m'en sortir.

Finalement, programmer un jeu d'aventure c'est comme y jouer, on est souvent bloqué, mais quand on trouve la solution, surtout par soi-même, on a encore plus envie de continuer !

Je devrais mettre ça en signature ! sourire

_________________
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


[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 EmptySam 6 Aoû 2011 - 15:40

valoulef a écrit:
EDIT : Juste un truc que je n'ai pas compris, c'est la signification de "(hsurvol != hotspot[0])", "(osurvol != null)", et la différence entre les deux (pourquoi null pour les objets et pas pour les hotspots ?)
Tout d'abord, rappelons que hsurvol contient le hotspot éventuellement survolé par la souris, et que osurvol contient l'objet éventuellement survolé par la souris. Mais que se passe-t-il si la souris n'en survole aucun ? Que valent ces variables ? Eh bien hsurvol vaudra hotspot[0] et osurvol vaudra null.
La différence est un peu arbitraire... Si tu regardes la définition de la fonction GetAtScreenXY pour les hotpots, tu vois le texte suivant :
Citation :
S'il n'y a aucun hotspot à cet endroit, ou si des coordonnées invalides ont été spécifiées, la variable Hotspot* représentant le hotspot 0 sera retourné.
D'un autre côté, si tu regardes la description de la même fonction pour les objets, tu vois ça :
Citation :
Retourne l'objet s'il y en a un, ou null s'il n'y en a pas.
Chris Jones (le développeur d'AGS) aurait aussi bien pu choisir de retourner null pour les hotspots ou object[0] pour les objets. Tout ce qu'il faut savoir, c'est que hotspot[0] correspond aux zones de l'écran où tu n'as placé aucun hotspot, et que Object.GetAtScreenXY retourne null s'il n'y a aucun objet à (X,Y).


Maintenant, ton nouveau problème.
Tout d'abord, réponse à cette question :
valoulef a écrit:
// si le curseur passe sur un de ces GUI (je n'ai pas trouvé de code qui s'appliquerait à tous les GUIs), il passe en mode pointeur
Déjà, littéralement parlant, ce que ton code signifie c'est "si tel GUI est visible, ou si tel autre est visible, ou si tel autre est visbile..." et non pas "si la souris survole tel GUI, ou si la souris survole tel autre, ou si elle survole tel autre...". Dans ton cas ça ne fait pas vraiment de différence il me semble, puisque ces GUIs ne sont pas visibles si la souris ne les survole pas (si je ne me trompe).
Ensuite, le code qui s'appliquerait à tous les GUIs pour le survol, ça serait encore une fois la fonction GetAtScreenXY, mais concernant les GUIs cette fois :
Code:
GUI* gsurvol = GUI.GetAtScreenXY(mouse.x, mouse.y);
if (gsurvol != null) // Si la souris survole présentement un GUI (n'importe lequel)...
Plus d'infos sur cette fonction ici.

Enfin, ta solution est comme la fois précédente : louable mais un peu drastique. Réfléchis : si j'ai bien compris ton problème, tout ce que tu veux c'est que le code qu'on vient de rajouter ne s'applique plus dès lors que le joueur a un objet d'inventaire de sélectionné. Ce qu'il faudrait donc faire, c'est entourer ce bloc de code d'un if qui vérifie si le joueur a sélectionné un objet d'inventaire ou non. Et comme AGS est super bien prévu, cette fonction existe ! Elle s'appelle Character.ActiveInventory (j'avoue qu'elle est pas facile à trouver celle-là).

EDIT : Oups ! J'avais pas lu ton code très attentivement, je vois que tu utilises déjà cette propriété ^^
En fait tu te compliques juste un peu la vie clin d'oeil


Tu pourras donc entourer le code qu'on a placé dans repeatedly_execute de la façon suivante :
Code:
function repeatedly_execute() {

  // Si le joueur n'a aucun objet d'inventaire de sélectionné...
  if (player.ActiveInventory == null) {

    // ... Le bloc de code pour gérer les curseurs

  }
  // Fin du bloc if

}
Voilà, je sais pas si c'est tout à fait ce que tu voulais. Essaye et dis-moi si ça fonctionne clin d'oeil

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


[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 EmptyLun 15 Aoû 2011 - 13:47

Evidemment, vu comme ça ça paraît logique (cela concerne l'ensemble du message). C'est vrai que quand on découvre tout en même temps, il y a certains trucs simple auxquels on ne pense pas. A vrai dire ma technique marche pas mal, mais c'est un peu le bordel pour réactiver le mode Interact au bon moment (en fait, je n'avais que celui-ci à désactiver apparemment)

J'essaierai ce que tu me dis dès que j'aurais un moment, en ce moment, je n'ai pas beaucoup le temps de passer sur mon ordi.

Merci beaucoup encore une fois sourire

_________________
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
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue
Billbis


Nombre de messages : 1346

Date d'inscription : 10/05/2012


[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 EmptyJeu 10 Mai 2012 - 20:34

Bonjour,

j'avais les mêmes objectifs et problèmes que valoulef, et grace à ce forum et Kitai, je pense les avoir résolus.
Voici ma solution complète, pour faire un gameplay moderne sous AGS (clic gauche, action, clic droit regarder). N'hésiter pas à la commenter !
Quand je serais grand, j'en ferais peut-être un template...

Dans le GlobalScript.asc, fonction repeatedly_execute() :

Code:
function repeatedly_execute()
{
    //Si le curseur passe sur un hotspot ou un objet, il passe en mode interagir
  if (player.ActiveInventory == null){
   
      if((GetLocationType(mouse.x, mouse.y)==eLocationHotspot)||(GetLocationType(mouse.x, mouse.y)==eLocationObject))
      mouse.Mode = eModeInteract;
 
      if(GetLocationType(mouse.x, mouse.y)==eLocationNothing)
      mouse.Mode = eModeWalkto;
 
      if(GetLocationType(mouse.x, mouse.y)==eLocationCharacter)
      mouse.Mode = eModeTalkto;
   
      if (InventoryItem.GetAtScreenXY(mouse.x, mouse.y)!= null)
      mouse.Mode = eModeInteract;
    }
   
  //Gui visible en haut
  if (mouse.y <= 50) {
    if (gGui1.Y < 0) gGui1.Y+=10;
  }
  if (mouse.y > 150) {
    if (gGui1.Y > -100) gGui1.Y-=10;
  }

}

et dans le on_mouse_click() :
Code:

function on_mouse_click(MouseButton button) // called when a mouse button is clicked. button is either LEFT or RIGHT
{
  if (IsGamePaused() == 1) // Game is paused, so do nothing (ie. don't allow mouse click)
  {
  }
  else if (button == eMouseLeft)
  {
    ProcessClick(mouse.x,mouse.y, mouse.Mode);
  }
  else // right-click, so cycle cursor
  { 
    if (player.ActiveInventory != null)
    player.ActiveInventory = null;
    else
    ProcessClick(mouse.x, mouse.y, eModeLookat);
  }
}

Voilà ! J’espère que ça pourras en aider certains. Prochaine étape : le double clic pour courire / se téléporter. grand sourire
Revenir en haut Aller en bas
http://nothingaboutthedog.blogspot.fr/
Contenu sponsorisé





[Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty
MessageSujet: Re: [Résolu] Changer de curseur selon ce qu'il survole   [Résolu] Changer de curseur selon ce qu'il survole - Page 2 Empty

Revenir en haut Aller en bas
 
[Résolu] Changer de curseur selon ce qu'il survole
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [résolu] Changer mode et graphic du curseur au survole d'un hotspot spécifique
» [résolu]changer de room automatiquement
» [résolu]curseur wait
» [résolu]Un seul curseur unique
» [résolu]Curseur "ActiveInventory" en surbrillance

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: