|
| Fonction "bouton survolé", conflit avec les paramètres de base... | |
| | Auteur | Message |
---|
Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Fonction "bouton survolé", conflit avec les paramètres de base... Ven 28 Oct 2022 - 6:54 | |
| Bien le bonjour à tous !! Cela fait maintenant plusieurs jours que je me prends la tête sur mon système-de-sauvegarde-et-de-chargement-avec-vignettes. Pour la bonne nouvelle, c'est que celui-ci fonctionne et je n'ai pas vraiment de question sur le "mécanisme" de celui-ci car j'ai (a priori) plutôt bien compris l'approche à adopter avec les pointeurs (pour prendre une capture de ma partie et l'afficher ensuite en vignette) et toultoutim. Voici, basiquement, comment ça fonctionne: -En haut de mon globalscript il y a ceci: - Code:
-
DynamicSprite* tempsprite1; DynamicSprite* tempsprite2; DynamicSprite* tempsprite3; DynamicSprite* tempsprite4; DynamicSprite* tempsprite5; DynamicSprite* tempsprite6; DynamicSprite* tempsprite7; DynamicSprite* tempsprite8; DynamicSprite* tempsprite9; DynamicSprite* tempsprite10; DynamicSprite* tempsprite11; DynamicSprite* tempsprite12; int modeLoadSave; int SelPic;
- Ensuite, la fonction relative à l'affichage de mon GUI gSpritedyn (fond transparent contenant des boutons qui sont, si j'ai tout bien compris, des sprites dynamiques). Ce GUI est commun au menu load et save : - Code:
-
function affichage_loadsave() { //survol_loadsave();
if (modeLoadSave == 2) // Si c'est en mode "Sauvegarder" { gOptions.Visible = false; gSpritedyn.Visible = true; gLoad.Visible = false; gSave.Visible = true;}
if (Game.GetSaveSlotDescription (1) == null) // Si le slot 1 est vide... { SelPic = 1; fPic1.Visible = true; // f comme "fond", fPic1 est un sprite permettant d'afficher soit l'emplacement vide tout noir, soit la vignette capturée cPic1.Visible = true; // c comme "cadre", cPic1 étant un cadre qui affiche une sorte de surbrillance. fPic1.Enabled = false; fPic1.NormalGraphic = 152; // Le slot est tout noir fPic1.Clickable = true; fPic1.ZOrder = 0; cPic1.MouseOverGraphic = 153; // Sprite "surbrillance" apparaît si survol cPic1.Enabled = true ; cPic1.Clickable = true; cPic1.ZOrder = 1; } else if (Game.GetSaveSlotDescription (1) !=null) // Si le slot 1 contient quelque chose { SelPic = 1; tempsprite1 = DynamicSprite.CreateFromSaveGame(1,289,167); // Crée une vignette 1 fPic1.NormalGraphic = tempsprite1.Graphic; // Le slot noir affiche cette fois la vignette 1 cPic1.Visible = true; cPic1.MouseOverGraphic =153; fPic1.NormalGraphic = tempsprite1.Graphic; cPic1.Enabled = true ; cPic1.Clickable = true; cPic1.ZOrder = 1; }
if (modeLoadSave == 1) // Si c'est en mode "Charger" { gOptions.Visible = false; gSpritedyn.Visible = true; gSave.Visible = false; gLoad.Visible = true; }} -Après, il y a les fonctions basiques pour l'affichage du menu load ou save: - Code:
-
function bSave_OnClick(GUIControl *control, MouseButton button) //si on clique sur SAUVEGARDER dans le menu gOptions { modeLoadSave = 2; affichage_loadsave();}
function bLoad_OnClick(GUIControl *control, MouseButton button) // idem mais clic sur CHARGER { modeLoadSave = 1; affichage_loadsave();}
-Et enfin, la fonction dont je parle au tout début, celle ou tout fonctionne (dont je suis très fier) et qui fait toute la tambouille question save ou load: - Code:
-
function cPic1_OnClick(GUIControl *control, MouseButton button) // Appelé si on clique sur cPic1 { if (modeLoadSave == 2) { SelPic = 1; tempsprite1 = DynamicSprite.CreateFromSaveGame(1,289,167); fPic1.Visible = true; fPic1.NormalGraphic = 152; gSpritedyn.Visible = false; gSave.Visible = false; fermeOptions(); Wait(85); SaveGameSlot(1, "SAVE"); // Sauvegarde dans le slot1 Display ("Partie sauvegardée dans: \n- SLOT N°1"); } if ((modeLoadSave == 1)&&(Game.GetSaveSlotDescription (1) != null)){ SelPic = 1; gSpritedyn.Visible = false; gLoad.Visible = false; gGui2.Visible = true; Wait(23); Button8.Animate (21, 0, 0, eOnce); Wait(75); fermeOptions (); Display ("Partie en cours: \n- SLOT N°1"); RestoreGameSlot(1); // Chargement slot 1 }} Là où le bât blesse, c'est sur le fonctionnement des sprites qui apparaissent/disparaissent pour les diverses sélections de slot, en effet j'aimerais complexifier le truc avec un bouton "supprimer", qui n'apparaitrait que lorsque certaines conditions "d'ordre graphique" sont remplies. Seulement voilà, je ne sais pas comment faire ça... Lors de mes différents tests, on dirait que mon code entre sans cesse en conflit avec les paramètres de base des boutons d'AGS, et je ne m'en sors absolument pas entre les "visible", "clickable", "clipimage", "enable"" etc... de cesdits paramètres et les " pic.MouseOverGraphic" , " pic.NormalGraphic" etc... de ce que je dois entrer tapuscritement parlant dans le script. Ajoutons à cela la complication non négligeable de si le jeu est ouvert pour la première fois ou pas (dans le dossier local SaveGames). Enfin, je n'ai pas bien compris ce qu'il est sensé se passer si je tape SelPic = 0. Ainsi, j'aimerais que lorsque cPic1/fPic1 est survolé, un sprite petite croix (que j'ai déjà dessiné/préparé dans le Sprite Manager) apparaisse, et qu'un sprite "supprimer" soit également affiché sur le slot. Et que si on appuie sur la croix, bah ça supprime le tempsprite et que ça se remette à fonctionner comme avant. J'ai bien tenté un (if cPic1.MouseOverGraphic == true), mais sans succès... Une petite image étant équivalente, voire mieux que 10 000 explications, voici le visuel de mes boutons: De gauche à droite, nous avons le fPic1 noir qui est tout dynamique, puis le cPic1 qui fait office de surbrillance, le bouton croix (que je souhaite afficher ou pas selon présence ou absence de parties dans le slot), et le sprite supprimer (qui apparait si on survole la croix). Voilà voilà, je suis perdu, et par ailleurs ça a été super galère d'expliquer mon problème, bref je ne sais plus quoi faire... Est-ce que je dois créer de nouvelles fonctions ? Si oui lesquelles ? Merci. _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Lun 31 Oct 2022 - 23:05 | |
| Je pense que le plus efficace serait, pour chaque case, d'avoir un bouton séparé pour la vignette elle-même d'un côté et pour la croix de suppression de l'autre (donc tu aurais 12 paires de bouton, c'est-à-dire un total de 24 boutons). Par défaut, tu règles les bouton-croix comme pas visibles. Lorsqu'un bouton-vignette est survolé, tu lui superimposes le cadre jaune et tu rends le bouton-croix correspondant visible. Ensuite, lorsqu'un bouton-croix est survolé, tu superimposes "Supprimer" sur la vignette correspondante; histoire de s'assurer une transition douce, assure-toi que chaque bouton-croix touche (voire chevauche) le bouton-vignette correspondant, autrement lorsque la souris quittera le bouton-vignette pour atteindre le bouton-croix tout ira à vau-l'eau Pour simplifier, imaginons que t'aies une seule paire vignette-croix à gérer, ça donnerait un truc du genre dans le Global Script: - Code:
-
DynamicSprite* tempsprite;
function dessineFond() { if (Game.GetSaveSlotDescription (1) == null) tempsprite = DynamicSprite.CreateFromExistingSprite(152,true); // 152 = bloc de l'image fond noir else tempsprite = DynamicSprite.CreateFromSaveGame(1,289,167); } function activeSurbrillance() { dessineFond(); DrawingSurface* surface = tempsprite.GetDrawingSurface(); surface.DrawImage(0,0,153); // 153 = bloc de l'image cadre jaune surface.Release(); bCroix.Visible = true; } function desactiveSurbrillance() { dessineFond(); bCroix.Visible = false; } function dessineSupprimer() { DrawingSurface* surface = tempsprite.GetDrawingSurface(); surface.DrawImage(0,0,154); // Je suppose l'image "Supprimer" en bloc 154 surface.Release(); } function repeatedly_execute() { int survolID = -1; GUIControl* survol = GUIControl.GetAtScreenXY(mouse.x,mouse.y); if (survol != null) survolID = survol.ID; if (survolID != bVignette.ID && survolID != bCroix.ID) desactiveSurbrillance(); else { activeSurbrillance(); if (survol.ID == bCroix.ID) dessineSupprimer(); } bVignette.NormalGraphic = tempsprite.Graphic; } Pour gérer 12 paires cette fois, tu peux garder la même logique mais lister les GUIControl dans des tableaux, un tableau pour les vignettes, un tableau pour les croix, où l'idée c'est que chaque entrée de l'un est associée à l'entrée de l'autre, c'est-à-dire que le premier élément dans le tableau des croix correspondra à la vignette listée en première dans le tableau des vignettes : - Code:
-
#define NOMBRE_PAIRES 12 // 12 paires DynamicSprite *tempsprites[NOMBRE_PAIRES];
Button *vignettes[NOMBRE_PAIRES]; Button *croix[NOMBRE_PAIRES];
function game_start(){ vignettes[0] = bVignette1; croix[0] = bCroix1; vignettes[1] = bVignette2; croix[1] = bCroix2; // etc. }
function dessineFond(int slot) { if (Game.GetSaveSlotDescription(slot+1) == null) tempsprites[slot] = DynamicSprite.CreateFromExistingSprite(152,true); // 152 = bloc de l'image fond noir else tempsprites[slot] = DynamicSprite.CreateFromSaveGame(slot+1,289,167); } function activeSurbrillance(int slot) { dessineFond(slot); DrawingSurface* surface = tempsprites[slot].GetDrawingSurface(); surface.DrawImage(0,0,153); // 153 = bloc de l'image cadre jaune surface.Release(); croix[slot].Visible = true; } function desactiveSurbrillance(int slot) { dessineFond(slot); croix[slot].Visible = false; } function dessineSupprimer(int slot) { DrawingSurface* surface = tempsprites[slot].GetDrawingSurface(); surface.DrawImage(0,0,154); // Je suppose l'image "Supprimer" en bloc 154 surface.Release(); } function repeatedly_execute() { int survolID = -1; GUIControl* survol = GUIControl.GetAtScreenXY(mouse.x,mouse.y); if (survol != null) survolID = survol.ID; int i = 0; while (i < NOMBRE_PAIRES) { if (survolID != vignettes[i].ID && survolID != croix[i].ID) desactiveSurbrillance(i); else { activeSurbrillance(i); if (survol.ID == croix[i].ID) dessineSupprimer(i); } vignettes[i].NormalGraphic = tempsprites[i].Graphic; i++; } }
_________________ 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 !
Dernière édition par Kitai le Dim 6 Nov 2022 - 20:23, édité 5 fois (Raison : Mise à jour de dessineFond pour pointer vers slot+1 plutôt que slot (sauvegardes commencent à 1, pas à 0)) |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Mer 2 Nov 2022 - 4:57 | |
| Salut ! Merci beaucoup @Kitai d'avoir pris le temps de me répondre... Seulement, je ne m'en sors toujours pas car je découvre à peine le principe des tableaux et je ne comprends pas bien de quoi il s'agit là. Je vais mieux regarder dans le manuel , en effet je ne pensais pas en avoir besoin un jour, j'avais un peu fait l'impasse sur ça. De plus, je ne comprends pas bien où vraiment placer ces deux scripts que tu proposes comme je ne comprends pas si je dois utiliser l'un ou l'autre, ou les deux en même temps... Enfin, est-ce que pour que tout soit fonctionnel je dois me débarrasser de mon script initial que j'ai posté plus haut ? Si oui que faire alors de ce int modeloadsave et de ce intSelPic que j'avais placés en bas de mes *DynamicSprites ? Merci encore. EDIT = Que signifie int slot dans le code que tu me suggères ? _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Mer 2 Nov 2022 - 17:30 | |
| Salut - Jorkz a écrit:
- je ne comprends pas bien où vraiment placer ces deux scripts que tu proposes
Je propose d'ajouter du code dans le Global Script. C'est pas très important si ça se trouve tout en bas ou tout en haut, mais tu dois t'assurer que tu redéfinis pas une fonction qui est déjà déclarée ailleurs. Par exemple, si tu as déjà repeatedly_execute dans ton Global Script, faut pas en ajouter une nouvelle, mais plutôt modifier celle qui existe déjà pour y ajouter du code - Jorkz a écrit:
- je ne comprends pas si je dois utiliser l'un ou l'autre
Le premier script c'est pour illustrer la logique avec une seule paire de boutons vignette+croix : ce script-là a donc pas besoin d'utiliser des tableaux, ce qui simplifie un peu l'exposé. Mais en vrai, tu veux utiliser 12 paires, donc je propose le deuxième script (celui à implémenter, donc) qui généralise la logique à l'aide de tableaux. Les tableaux sont juste là pour éviter d'avoir à répéter certaines lignes 12 fois où les seules variations seraient les références aux boutons : à la place, tu remplis les tableaux une fois pour toute avec toutes les références aux boutons que tu utilises (dans game_start dans mon deuxième script) et comme ça ensuite tu parcours les tableaux pour exécuter les mêmes lignes de code sur chaque référence (boucle while dans repeatedly_execute) - Jorkz a écrit:
- Enfin, est-ce que pour que tout soit fonctionnel je dois me débarrasser de mon script initial que j'ai posté plus haut ? Si oui que faire alors de ce int modeloadsave et de ce intSelPic que j'avais placés en bas de mes *DynamicSprites ?
Il y a des parties que le script remplace, d'autres non. Comme tu le vois le script définit tempsprites, donc toutes les lignes qui font référence à tempsprite1, tempsprite2, etc. dans ton script tu peux les enlever. Pareil, évidemment, pour toutes les références à cPic ou fPic. Par contre mon script fait aucune référence aux GUIs, donc toutes les lignes gLoad, gSave et compagnie tu les gardes, histoire de gérér l'affichage de l'interface - Jorkz a écrit:
- EDIT = Que signifie int slot dans le code que tu me suggères ?
Ça déclare une variable de type entier nommée slot. Lorsque ce genre de déclaration se trouve elle-même dans les parenthèses d'une déclaration de fonction, comme dans mon code, ça veut dire que lorsque la fonction en question est utilisée, il faut lui passer un entier comme argument. Ainsi, lorsque tu références slot dans le corps de la fonction, ça représente la valeur qui est passée comme argument à la fonction. Par exemple, si tu utilises dessineFond(0); alors la fonction va regarder s'il y a une description de sauvegarde dans le bloc de sauvegarde 0 (le premier) et si non, alors elle va assigner à la première entrée (= index 0) du tableau tempsprites une DynamicSprite créée à partir de la sauvegarde numéro 0, mais s'il y a pas de description, ce sera une DyanmicSprite créée à partir de l'image numéro 152. Si tu utilises dessineFond(1); il se passe la même chose, mais en remplaçant tous les 0 par 1 (deuxième bloc de sauvegarde, deuxième entrée du tableau, etc.) _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Jeu 3 Nov 2022 - 4:49 | |
| Yeah !! Tout est plus clair maintenant, merci encore, j'y suis presque ! Le mécanisme que tu me suggères est très efficace en effet, mais... Étrange comportement des images lors du survol : le cadre de surbrillance et/ou l'image "supprimer" se surimpressionnent en transparence, mais par dessus la vignette : C'est très chelou et j'ai beau parcourir le code (ainsi que les propriétés), je ne vois pas d'où ça peut venir... _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Jeu 3 Nov 2022 - 16:51 | |
| Hmm, essaye d'enlever true dans DynamicSprite.CreateFromExistingSprite(152,true) peut-être
Aussi, vérifie comment tu as importé les images cadre/supprimer, si le jaune y est pas défini comme couleur de transparence _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Jeu 3 Nov 2022 - 18:46 | |
| - Kitai a écrit:
- Hmm, essaye d'enlever true dans DynamicSprite.CreateFromExistingSprite(152,true)
Ahah oui c'était bien ça !! Cimer !! _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Ven 4 Nov 2022 - 7:13 | |
| Arf ! Arf ! Désolé de revenir encore à la charge avec mon histoire de menu sauvegarde, mais du coup comme tout a changé et que je ne suis pas très à l'aise avec cette histoire de tableau, mon système initial (dont j'étais si fier) devient inutilisable tel quel... Le revoici: - Code:
-
function cPic1_OnClick(GUIControl *control, MouseButton button) // Appelé si on clique sur cPic1 { if (modeLoadSave == 2) { SelPic = 1; tempsprite1 = DynamicSprite.CreateFromSaveGame(1,289,167); fPic1.Visible = true; fPic1.NormalGraphic = 152; gSpritedyn.Visible = false; gSave.Visible = false; fermeOptions(); Wait(85); SaveGameSlot(1, "SAVE"); // Sauvegarde dans le slot1 Display ("Partie sauvegardée dans: \n- SLOT N°1"); } if ((modeLoadSave == 1)&&(Game.GetSaveSlotDescription (1) != null)){ SelPic = 1; gSpritedyn.Visible = false; gLoad.Visible = false; gGui2.Visible = true; Wait(23); Button8.Animate (21, 0, 0, eOnce); Wait(75); fermeOptions (); Display ("Partie en cours: \n- SLOT N°1"); RestoreGameSlot(1); // Chargement slot 1 }}
Déjà, premier obstacle rencontré, que mettre dans la fonction vu que cPic1 n'existe plus (et qu'a priori il a été remplacé par une image "encadrement" qui ne fait plus vraiment partie du GUI)... Deuxièmement, que faire de mon fameux SelPic qui me servait à désigner les slots concerné ?... Je le vire ? Et enfin, troisièmement, Comment changer le Display selon ces fameux slots ? En vous remerciant par avance !! _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Ven 4 Nov 2022 - 16:06 | |
| EDIT : à la relecture de ton message, je viens de comprendre que tu n'as plus du tout de bouton nommé cPic1, donc la fonction cPic1_OnClick n'est plus associée à rien. Mais tu as quand même des boutons-vignettes dans ton GUI (ceux que tu as associés à vignettes[0], vignettes[1], etc.). Tu peux créer des fonctions OnClick pour chacun de ces boutons si tu veux gérer ce qui se passe lorsqu'on clique dessus séparément pour chaque bouton - Jorkz a écrit:
- que mettre dans la fonction vu que cPic1 n'existe plus (et qu'a priori il a été remplacé par une image "encadrement" qui ne fait plus vraiment partie du GUI)...
Rien, puisque tout est géré dans repeatedly_execute - Jorkz a écrit:
- Deuxièmement, que faire de mon fameux SelPic qui me servait à désigner les slots concerné ?... Je le vire ?
J'avoue que je me rappelle plus du tout comment tu utilises cette variable, mais ce qui est sûr c'est que garder SelPic = 1; ici causera aucun crash, donc pas d'inquiétude - Jorkz a écrit:
- Et enfin, troisièmement, Comment changer le Display selon ces fameux slots ?
Je suis pas sûr de comprendre : tu nous montres la fonction associée à un clic sur le bouton cPic1, que j'imagine être ta première vignette (donc si c'est bien ça, dans game_start tu devrais avoir vignettes[0]=cPic1l;) et donc je vois pas le souci avec le Display que tu as dans cette fonction _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Sam 5 Nov 2022 - 4:13 | |
| - Citation :
- Mais tu as quand même des boutons-vignettes dans ton GUI (ceux que tu as associés à vignettes[0], vignettes[1], etc.). Tu peux créer des fonctions OnClick pour chacun de ces boutons si tu veux gérer ce qui se passe lorsqu'on clique dessus séparément pour chaque bouton
Oui, c'est évident... Tu penses bien que j'ai déjà opté pour cette solution, mais c'est ce que j'expliquais (mal) plus haut: le On click n'est pas reconnu sur ces vignettes-là, car d'après mes tests il semblerait qu'AGS considère que s'il y a un clic à cet endroit, c'est en fait lors du survol, et donc sur le cadre surbrillance que j'appuie (bien qu'il soit transparent), ce cadre-là qui s'affiche par dessus la vignette puisqu'on lui a dit de faire ainsi MAIS qui ne fait plus partie du GUI comme bouton à proprement parler... Par conséquent je ne vois pas comment associer ce dernier à une fonction vu qu'il n'a pas de panneau propriétés et qu'il est impossible de passer son clickable en false, ou de l'appeler via la petite icône éclair habituelle... J'ai dû rater un truc En ce qui concerne les Display, qui sont sensés afficher un message différent selon les slots, je me demandais juste s'il était possible de coder un truc plus simple que le dernier script que j'ai posté, sans obligatoirement taper ce truc relativement long pour chacune de mes 12 vignettes. Vu qu'un tableau a été créé, j'imaginais que c'était justement pour faciliter ce genre de manip. EDIT: par ailleurs je me demande si, quand bien même ce clic serait pris en compte, est-ce qu'un SaveGameSlot(1, "SAVE"); suffirait à mettre en route une sauvegarde, vu que la manip a changé et que j'ai remplacé par ce système de tableau ? Ou là pour le coup ça ne change rien ? _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Dim 6 Nov 2022 - 20:15 | |
| - Jorkz a écrit:
- il semblerait qu'AGS considère que s'il y a un clic à cet endroit, c'est en fait lors du survol, et donc sur le cadre surbrillance que j'appuie (bien qu'il soit transparent), ce cadre-là qui s'affiche par dessus la vignette puisqu'on lui a dit de faire ainsi MAIS qui ne fait plus partie du GUI comme bouton à proprement parler...
Le code que j'ai proposé dessine une image sur le graphique du bouton-vignette, c'est-à-dire que pratiquement parlant, il y a juste remplacement de la couleurs de certains pixels sur l'image du bouton-vignette. Le bouton-vignette, lui, n'est aucunement désactivé et aucunement couvert par quoi que ce soit : lorsque la souris le survole, le bouton-vignette est bien l'élément qui se trouve directement sous le curseur, et rien d'autre À moins que tu aies créé tes boutons-croix à une dimension égale voire supérieure à celles de boutons-vignettes, dont l'image serait principalement transparente et contiendrait uniquement une petite croix jaune dans le coin en bas à droite, et que tu places ces boutons-croix par-dessus les boutons-vignettes. C'est pas comme ça que j'imaginais les choses, mais j'avoue que j'étais pas clair : - Kitai a écrit:
- assure-toi que chaque bouton-croix touche (voire chevauche) le bouton-vignette correspondant, autrement lorsque la souris quittera le bouton-vignette pour atteindre le bouton-croix tout ira à vau-l'eau
Par "chevauche" je voulais dire "chevauche légèrement" dans le sens où y'aurait une bande de quelques pixels seulement du bouton-croix qui se trouvent par-dessus les pixels du bas du bouton-vignette, histoire d'éviter que y'ait un espace vide entre le bouton-vignette et le bouton-croix, car survoler un tel espace avec le curseur ferait disparaître le bouton-croix (puisque ce dernier n'est visible que lorsque le curseur survole soit le bouton-vignette associé, soit le bouton-croix lui-même) - Jorkz a écrit:
- En ce qui concerne les Display, qui sont sensés afficher un message différent selon les slots, je me demandais juste s'il était possible de coder un truc plus simple que le dernier script que j'ai posté, sans obligatoirement taper ce truc relativement long pour chacune de mes 12 vignettes. Vu qu'un tableau a été créé, j'imaginais que c'était justement pour faciliter ce genre de manip.
Oui, tu peux associer la même et unique fonction à tous tes boutons-vignette et regarder à quel indice se trouve le bouton dans le tableau, et utiliser cet indice plus un (puisque les tableaux commencent à 0, mais les blocs de sauvegarde commencent à 1---j'ai d'ailleurs mis à jour mon code plus haut pour prendre ça en compte) comme référence aux blocs de sauvegarde. Par exemple, tu pourrais créer une fonction appelée cliqueVignette dans le Global Script, comme suit, et la référencer dans les "Events > on click" dans la grille de propriété de chaque bouton-vignette : - Code:
-
function cliqueVignette(GUIControl *control, MouseButton button) { int indice = -1; int n = 0; while (n < NOMBRE_PAIRES) { if (vignettes[n].ID==control.ID) indice = n+1; n++; } if (indice < 0) return; if (modeLoadSave == 2) { SelPic = indice; tempsprite1 = DynamicSprite.CreateFromSaveGame(indice,289,167); gSpritedyn.Visible = false; gSave.Visible = false; fermeOptions(); Wait(85); SaveGameSlot(indice, "SAVE"); // Sauvegarde dans le slot INDICE Display("Partie sauvegardée dans: \n- SLOT N°%d", indice); } if ((modeLoadSave == 1)&&(Game.GetSaveSlotDescription (1) != null)){ SelPic = indice; gSpritedyn.Visible = false; gLoad.Visible = false; gGui2.Visible = true; Wait(23); // Button8.Animate(21, 0, 0, eOnce); // Ca je suis pas sur a quoi ca fait reference Wait(75); fermeOptions (); Display ("Partie en cours: \n- SLOT N°%d", indice); RestoreGameSlot(indice); // Chargement slot INDICE } } - Jorkz a écrit:
- EDIT: par ailleurs je me demande si, quand bien même ce clic serait pris en compte, est-ce qu'un SaveGameSlot(1, "SAVE"); suffirait à mettre en route une sauvegarde, vu que la manip a changé et que j'ai remplacé par ce système de tableau ? Ou là pour le coup ça ne change rien ?
Je vois pas trop pourquoi ça changerait quoi que ce soit : les tableaux référencent des boutons, pas des blocs de sauvegarde. Quand tu utilises SaveGameSlot(1, "SAVE") où que ce soit dans n'importe quel script, ça aura toujours le même effet, quel que soit le code que tu as inséré ailleurs : ça sauvegardera toujours la partie en cours dans le premier bloc de sauvegarde avec la description "SAVE" _________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Lun 7 Nov 2022 - 5:16 | |
| Alors alors... Tout cela est, on va dire "semi-infructueux" chez moi... Cependant, j'ai un peu identifié le problème: A priori, pour que l'event OnClick de mon bouton-vignette fonctionne, il faut passer ledit bouton en clickable et enabled soit dans les propriétés, soit via le code lui-même (sauf erreur de ma part les deux solutions fonctionnent), mais il faut également que le mouseover de ce bouton soit à 0, sinon quoi la surbrillance ne s'effectue pas lors du survol de la souris, en plus d'arrêter subitement la minicapture d'ecran et d'afficher toujours le rectangle noir (et laisser pourtant la croix visible) Comportement étrange je trouve, mais bon ça fonctionne c'est l'essentiel. La sauvegarde m'a tout l'air de bien marcher comme il faut en revanche, même si je suis obligé de lui dire d'aller dans le slot 0. Si je lui dis 1 la minicapture opère mais se cale en lieu et place du bVignette2 d'à côté. Cela vient sans doute du décalage image/slot dont tu parlais... Mais je ne vois pas comment remédier à cela. Le chargement, en revanche, ne marche plus (mais affiche tout de même la capture comme il se doit)... D'ailleurs j'en profite au passage pour signaler que, malgré tes explications @Kitai, je n'ai décidément pas compris comment fonctionne ce système de slot, je pense que si je pigeais un peu plus le principe je serais un peu moins là à galérer... En fait, "par défaut", comment et à quel moment AGS attribue-t-il les slots ? Est-ce que mes SelPic= kekchose sont vraiment toujours utiles ? Et si oui alors... pourquoi, quand et comment les utiliser ? Merci @Kitai pour le script que tu as posté, mais bien que je l'aie testé vitefait (et que j'ai eu à faire face à divers messages d'erreur) je n'ai pour l'instant pas creusé dans cette direction... Je souhaiterais déjà régler le problème initial plutôt que de rajouter des trucs que je ne comprends pas trop, bref, ce serait un peu bête de complexifier sur une base qui est déjà bancale (pour l'instant). C'est pourquoi je ne fais pour l'instant tous mes tests actuels sur une seule vignette. Si ça peut aider, voici le script au tout début de mon global, mon petit doigt me dit que justement, je fais déjà erreur à ce moment-là : - Code:
-
int modeLoadSave; // 1 = charger / 2 = enregistrer int SelPic;
#define NOMBRE_PAIRES 6 // 12 paires DynamicSprite *tempsprites[NOMBRE_PAIRES]; Button *vignettes[NOMBRE_PAIRES]; Button *croix[NOMBRE_PAIRES];
// called when the game starts, before the first room is loaded ============== //============================================================================ //============================================================================
function game_start() { vignettes[0] = bVignette1; croix[0] = bCroix1; vignettes[1] = bVignette2; croix[1] = bCroix2; vignettes[2] = bVignette3; croix[2] = bCroix3; vignettes[3] = bVignette4; croix[3] = bCroix4; vignettes[4] = bVignette5; croix[4] = bCroix5; vignettes[5] = bVignette6; croix[5] = bCroix6; //... etc etc...
Et bien sûr, merci encore !!... EDIT = Juste au cas où, voici également à quoi mon script ressemble dans le repeatedly - Code:
-
function repeatedly_execute() { { int survolID = -1; GUIControl* survol = GUIControl.GetAtScreenXY(mouse.x,mouse.y); if (survol != null) survolID = survol.ID; int i = 0; while (i < NOMBRE_PAIRES) { if (survolID != vignettes[i].ID && survolID != croix[i].ID) desactiveSurbrillance(i); else { activeSurbrillance(i); if (survol.ID == croix[i].ID) dessineSupprimer(i); } vignettes[i].NormalGraphic = tempsprites[i].Graphic; i++; } } // etc... _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Lun 7 Nov 2022 - 15:05 | |
| - Jorkz a écrit:
- il faut passer ledit bouton en clickable et enabled soit dans les propriétés, soit via le code lui-même (sauf erreur de ma part les deux solutions fonctionnent)
Oui, si un bouton n'est pas activé (enabled) ou pas cliquable, alors les clics dessus n'auront aucun effet. Il me semblait que les boutons étaient et activés, et cliquables par défaut dans AGS - Jorkz a écrit:
- il faut également que le mouseover de ce bouton soit à 0, sinon quoi la surbrillance ne s'effectue pas lors du survol de la souris, en plus d'arrêter subitement la minicapture d'ecran et d'afficher toujours le rectangle noir
Donner à la propriété MouseOverGraphic la valeur d'un bloc d'image a pour but d'utiliser ladite image au survol du bouton par la souris. Mon code change la propriété NormalGraphic du bouton, donc si AGS trouve un numéro d'image valide pour MouseOverGraphic, il va utiliser cette image-là en priorité lors du survol du bouton. Là encore, je pensais que par défaut la valeur était -1 - Jorkz a écrit:
- je suis obligé de lui dire d'aller dans le slot 0. Si je lui dis 1 la minicapture opère mais se cale en lieu et place du bVignette2 d'à côté.
Cela vient sans doute du décalage image/slot dont tu parlais... Mais je ne vois pas comment remédier à cela. Oui c'est ce que j'expliquais : les tableaux commencent à 0, les sauvegardes commencent à 1. C'est pour ça que la fonction unique que je propose assigne la valeur n+1 (et non pas seulement n) à la variable indice. En quoi c'est un problème auquel il faudrait remédier ? - Jorkz a écrit:
- je n'ai décidément pas compris comment fonctionne ce système de slot, je pense que si je pigeais un peu plus le principe je serais un peu moins là à galérer
Malheureusement j'ai pas le temps là tout de suite d'expliquer le principe en détails, je verrai si j'ai davantage de temps plus tard - Jorkz a écrit:
- "par défaut", comment et à quel moment AGS attribue-t-il les slots ?
Par défaut, jamais. C'est pour ça que tu as mis du code dans la fonction game_start, où tu assignes vignettes[0] = bVignette1, croix[0] = bCroix1, etc. - Jorkz a écrit:
- Est-ce que mes SelPic= kekchose sont vraiment toujours utiles ? Et si oui alors... pourquoi, quand et comment les utiliser ?
Comme je disais plus tot, je sais pas à quoi sert SelPic, tout ce que je sais c'est que le code que j'ai proposé n'en a pas besoin. À priori ça a pas l'air rédhibitoire, libre à toi d'essayer de commenter les lignes et voir si ça fait planter les choses ou non : si y'a aucune changement, sens-toi libre de complètement supprimer ces lignes - Jorkz a écrit:
- voici le script au tout début de mon global, mon petit doigt me dit que justement, je fais déjà erreur à ce moment-là
Je vois aucun souci dans cette partie du script - Jorkz a écrit:
- voici également à quoi mon script ressemble dans le repeatedly
Pareil, je vois aucun souci ici non plus En même temps, ce serait bizarre que t'aies des soucis dans ces parties-là du script étant donné que tu dis que l'affichage des captures d'écran, du cadre de survol et de la croix fonctionnent (une fois que MouseOverGraphic est à -1) et que c'est justement ce dont se charge ce code Si la seule chose qui marche pas c'est le chargement, alors le problème vient du code lié au chargement, qui se trouve dans la fonction OnClick_________________ Ga is Ga Vous pouvez consulter l' aide d'AGS 3.2 en français et contribuer à la traduction et à l'amélioration si le cœur vous en dit ! |
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Dim 13 Nov 2022 - 4:41 | |
| Rhâlala !! Merci encore pour ton aide, ça m'a permis de me focaliser principalement sur la fonction concernée... Au bout de presque semaine à y revenir plusieurs fois, j'ai (ENFIN !!) réussi à faire marcher ce petit coquin de chargement... Mon erreur, apparemment, venait tout bêtement que j'utilisais if (modeLoadsave == 1), et il ne se passait absolument rien. Va savoir pourquoi, alors que sur mes scripts précédents cela suffisait, il a fallu que je remplace cette condition par un else if pour débloquer le truc... Là encore j'ai dû louper quelque chose... Mais bon maintenant ça marche, c'est le principal. Désolé d'avoir mis tant de temps à répondre, mais je voulais régler le problème avant de raconter encore des inepties. Va maintenant falloir m'attaquer au fonctionnement du bousin plus en profondeur, avec un message qui s'affiche "Êtes-vous sûr d'écraser la sauvegarde ?", mettre en place la suppression des slots etc... Je sens que ce tout aussi coquin système de sauvegarde ne sera pas prêt pour tout de suite. _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Jorkz Cliqueur Emérite
Nombre de messages : 666
Age : 40
Localisation : Montpellier
Date d'inscription : 16/07/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Sam 26 Nov 2022 - 4:28 | |
| Bien bien bien... Après environ deux semaines, j'ai décidé de revenir à mon système de sauvegarde, qui n'est pas tout à fait opérationnel et qui m'empêche de continuer vraiment l'élaboration de mon jeu , car c'est idiot mais ça me tracasse et me bloque dans ma création... Et du coup j'avance pas plus tant que ce n'est pas réglé. Bref... Désolé, mais j'ai encore des questions... Jusqu'à présent j'arrivais à peu près à m'en sortir car sauvegarde et chargement fonctionnaient de manière "basique" avec un seul et même slot mais là, tout se complique énormément pour moi car je dois maintenant prendre en compte les autres slots avec un système d'écrasement de l'un sur l'autre etc... Par conséquent: 1) Comment fait-on pour, tout bêtement, supprimer une sauvegarde/slot ? Je l'ai su à un moment mais je ne retrouve plus comment faire... 2) Comment faire également pour mettre en place la sauvegarde "actuelle" sur un slot déjà occupé ? Je veux dire... après avoir cliqué sur "oui" (répondant à la question "voulez-vous écraser?) ? Je galère un peu, car bien que je sache plus ou moins comment obtenir le résultat, je ne sais pas du tout quoi mettre comme condition(s). En effet, car si je bascule sur un GUI "voulez vous supprimer" ou "voulez-vous écraser", je sors par conséquent des conditions liées au fonctionnement basique du seul slot, or il faudrait spécifier à AGS que la sauvegarde doit avoir lieu là où j'ai cliqué, mais ce AVANT l'apparition du GUI... Voilà, je sais pas si je me fais bien comprendre, n'hésitez pas à me demander des précisions si je ne suis pas clair. Merci par avance... _________________ L' est si forte à la course qu'elle en sort de la phrase. autruche
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... Mar 29 Nov 2022 - 18:40 | |
| Si je reprends la fonction cliqueVignette de mon message plus haut, je vois que SelPic se voit assigner la valeur de indice, qui est le numéro de slot ensuite passé à SaveGameSlotTu demandais à quoi servait SelPic, et je sais pas à quoi ça serv ait, mais désormais ça peut clairement servir à mémoriser quel slot a été sélectionné pour y faire référence plus tard, une fois que le GUI de confirmation d'écrasement est ouvert Quant à comment écraser une sauvegarde, il suffit d'utiliser ladite fonction SaveGameSlot : - Citation :
- Soyez prudent en utilisant cette fonction, car vous pourriez écraser une des parties sauvées par le joueur par mégarde.
_________________ 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 ! |
| | | Contenu sponsorisé
| Sujet: Re: Fonction "bouton survolé", conflit avec les paramètres de base... | |
| |
| | | | Fonction "bouton survolé", conflit avec les paramètres de base... | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |