|
| [Module] ShowInteractiveAreas | |
| | Auteur | Message |
---|
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: [Module] ShowInteractiveAreas Ven 23 Nov 2012 - 20:40 | |
| Comme j'ai du mal à dessiner une barque, je me suis dit que j'allais plutôt rééquilibrer mon ratio modules / jeux postés sur se forum. Ce fut laborieux mais enrichissant. Voici donc : 05/07/2013 Nouvelle version : v1.3 : Tant qu'a faire, les hotspots non activés (Enabled) ne sont plus affichés non plus. 04/07/2013 Nouvelle version : v1.2 : Les objets non cliquables ne sont plus pris en compte. 20/03/2013 Nouvelle version : v1.1 : Le module fonctionne même lorsque le joueur se déplace. 30/11/2012 Nouvelle version : v1.0 : Amélioration de la détection des hotspots. 24/11/2012 Nouvelle version : beta 0.2 : Détermination automatiques des coordonnées des hotspots. -ShowInteractiveAreas : un module qui montre au joueur les Zones interactives -Installation et configurations -Protips -Appel aux testeurs volontaires -Édition alternative -Code des modules
ShowInteractiveAreas : un module qui montre au joueur les Zones interactivesImaginons un joueur débutant débutant un Point & Clic : - Joueur débutant a écrit:
- Oh non ! Mais où sont donc les zones interactives sur lesquels je doit cliquer pour progresser dans ce Point & Click ?
*appuie sur la barre d'espace* Tada ! Les zones interactives sont délicatement indiquées au joueur débutant par des discrets mais néanmoins jolis curseurs ! Une telle option qui facilite la chasse aux zones interactives est présente dans la plupart des Point & Click modernes, même si elle est critiquée par tout bon Hard Core Point & Clickeur qui se respecte. C'est cette option qui est codée dans le module ShowInteractiveAreas. Suite à une pression sur la barre d'espace, le module calcule la position des objets, des hotspots et des personnages de la pièce pour afficher dessus en tant que calque un curseur de la souris (par défaut, celui des eModeInteract et eModeTalkTo). Le module est publié sous une licence très permissive qui vous permet de faire à peu près n'importe quoi avec. Installation et configurationsDézippez ShowInteractiveAreas.zip Ouvrez votre projet AGS Faites un clic droit sur "Scripts" Cliquez sur "Import script..." Ouvrez "ShowInteractiveAreas.scm" Et voilà ! ProtipsQuelques conseils pour les plus bidouilleurs d'entre vous. Je serais bref mais je détaillerai avec joie chaque étape qui vous intéressera. -Vous pouvez rendre ce module optionnel via un booléen (sia_CheatEnable) en créant une option modifiant la valeur de ce booléen. -Vous pouvez désactiver ce module dans certaines pièces ou dans certaines situations via un booléen (sia_EnableHere). -Si vous voulez afficher un sprite spécifique et pas un curseur de souris, c'est tout à fait possible. -Vous pouvez aussi afficher un sprite différent en fonction de propriétés spécifiques de vos objets / hotspots / personnages. -Et bien sur, vous pouvez changer la touche déclencheur, qui est par défaut la barre d'espace. Appel aux testeurs volontairesC'est mon premier module. Il est toujours en phase de béta.Je serai ravi d'avoir vos retours concernant son utilité potentiel, mais aussi vos conseils quand à des optimisations possibles. En particulier, si un génie pouvait me dire comment obtenir les coordonnées d'un Hotspot facilement, je lui serai très reconnaissant. C'est résolu. Je l'ai testé avec succès sur ProjetPilote et sur mon projet secret. S'il fonctionne avec vos projets, je serai enchanté de l'apprendre. Si vous rencontrez un bug, n'hésitez pas à le signaler. Si vous remarquez des fautes d’orthographes dans les fichiers textes ou commentaires de module, idem. J'ai essayé de me conforter aux chartes disponible sur le forum anglophone. Particulièrement celle-ci et celle-ci, mais je les ai peut-être mal comprises, donc n'hésitez pas à me corriger. En fonction de vos retours je publierai ce module chez eux, où alors je le cacherai tout au fond d'une cave, sous un tapis.
Dernière édition par Billbis le Ven 6 Sep 2013 - 14:57, édité 16 fois |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Ven 23 Nov 2012 - 20:43 | |
| Show Interactive Areas *Édition Alternative*L'édition standard de ShowInteractiveAreas détermine automatiquement la position à laquelle les curseurs seront placés sur les hotspots. Si c'est une capacité super cool du module, elle vient avec deux défauts : -Comme la positon des hotspots est déterminé de façon approximative, les petits hotspots (<<< 1/1000éme de la surface de l'écran) ne seront pas toujours détectés du premier coup. -Si votre hostpot est fragmenté / troué, le curseur pourra parfois être placé dans une zone où il n'y a pas de hotspot ! L'édition alternative de Show Interactive Areas viens répondre à ces deux défaut, mais pour cela elle abandonne la détection automatique des hotspots. Vous devez alors rentrer manuellement les coordonnées voulues dans deux propriétés personnalisées ( Custom Property) pour chaque hotspot. Si l'installation et le mode de fonctionnement globale du module se passe majoritairement comme pour l'édition standard, vous devez en plus créer deux propriétés personnalisées. Pour cela, séléctionnez un hotspot dans l'éditeur AGS, en bas de sa fenêtre de paramêtres, cliquez sur " (Properties)", puis sur " Edit schema...", et enfin faîtes un clic droit sur la fenetre ainsi ouverte et cliquez sur " Add new property...". Il faut ensuite configurer deux propriétés comme cela : C'est a dire les nommer très exactement " sia_PropX" et " sia_PropY", leur donner une valeur numérique, par défaut de -1, et s'appliquant aux Personnages, Objets et Hotspots. Pour les hotspots, tant que vous laissez la valeur -1, aucun curseur ne sera dessiné. Rentrez la coordonnée x relative à la pièce dans sia_PropX et la coordonnée y relative à la pièce dans sia_PropY. * Astuce* Vous pouvez copier un couple de coordonnées depuis l'éditeur en faisant un clic centrale (molette) à l'endroit voulu de votre pièce. Pour les personnages et objets, si vous laissez la valeur par défaut, leurs coordonnées seront automatiquement calculées en temps réel. Si vous spécifiez un couple de coordonnées, ces coordonnées seront utilisées en priorité. Attention, il s'agit de coordonnées relative à la pièce.
Dernière édition par Billbis le Ven 6 Sep 2013 - 14:58, édité 7 fois |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Ven 23 Nov 2012 - 20:44 | |
| Code du module, édition standardShowInteractiveAreas.ash - Spoiler:
- Code:
-
// Script header for module 'ShowInteractiveAreas', v1.3 // // Author: Billbis // // Abstract: // // While Space Bar is pressed, this module displays a mouse cursor over each // interactive areas. This function is present in most modern Point & Click. It helps // players not to miss an object / hotspot / character. Ojects, characters and hotspots // coordinates are automtically determined. // // Dependencies: // // AGS version required: build for AGS 3.2.1, not sure if it works with older versions. // // AGS setting required: No particular configuration is needed. // // Configuration: // // Optional: // // sia_HOTSPOT_LIMIT might be leave as it is or be adjust to your highest Hotspot number // to optimize (a very little bit) calculation time. // // sia_SHOOTING_POINT_N is the number of points that will be randomly shot at screen to // determine hotspot coordinates. Empirically determined by me. Increasing this number will // improve accruacy, decreasing this number will improve calculation time. You may decrease // this number if your game resolution is smaller than 1024*768. // // Two bools are available, sia_CheatEnable and sia_EnableHere to set up this module // as optional and to deactivate it in certain rooms or situations. // // Other customizations are possible by editing ShowInteractiveArea.asc directly. // // Caveats: // // This module uses ONE overlay, which can perturb your game if you already use 20 // of them at some point in your game (20 Overlays max display at a same time, // AGS limitation). // // Due to probabilistic determination of hotspots coordinates, very small hotspots might not // be correctly detected. For sia_SHOOTING_POINT_N = 10000 and 1024*768 resolutions, hotspots // with a total area of 55 pixels will be miss half of the time on first key press. But only // one time over four on second key press, etc. No problems with small objects or characters. // // Fragmented areas or weird shapes of hotspots / objects / characters can lead to bad cursor // positionning. // // Revision history: // version 1.3: 07/04/2013 // Non-enabled hotspots won't be display anymore. // version 1.2: 07/04/2013 // Non-clickable objects won't be display anymore. // version 1.1: 03/20/2013 // The module now works when player is moving. // version 1.0: 11/30/2012 // Improve hotspot detection (algorythm now remember hotspots it previously found). // version beta 0.2: 11/24/2012 // *NEW* Automatic detections of hotspot coordinates. // version beta 0.1: 11/23/2012 // First release. // // Licence: // // ShowInteractiveAreas AGS script module is publish under the terms of the // Do What The Fuck You Want To Public License, Version 2 // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What The Fuck You Want // To Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/wtfpl/COPYING for more details. // // Thanks: // // Pidem and Kitai // // Defines #define sia_HOTSPOT_LIMIT 50 #define sia_SHOOTING_POINT_N 10000 // Imports import bool sia_CheatEnable, sia_EnableHere;
ShowInteractiveAreas.asc - Spoiler:
- Code:
-
// ShowInteractiveAreas script
//General definitions
// Three arrays that will be needed to calculate Hotspot center coordinates. int siaHotspotX[]; int siaHotspotY[]; int siaHotspotN[];
bool sia_CheatEnable = true; // Use this bool if you want to create an option to set this module optional. bool sia_EnableHere = true; // Use this bool in situations or rooms you do not want this module to be active.
function on_event(EventType siaevent, int siadata) { if (siaevent == eEventEnterRoomBeforeFadein) { siaHotspotX = new int[sia_HOTSPOT_LIMIT]; //Each time player change room, this erase old hotspot coordinates. siaHotspotY = new int[sia_HOTSPOT_LIMIT]; siaHotspotN = new int[sia_HOTSPOT_LIMIT]; } }
//When player hits SpaceBar function on_key_press(eKeyCode keycode) { if (keycode == eKeySpace){//Change eKeySpace by the key you want to use. if (sia_CheatEnable && sia_EnableHere && !IsGamePaused ()) { PauseGame(); //Screening for Hotspots. Hotspot *h; int index = 0; int x, y; while (index < sia_SHOOTING_POINT_N) { //We randomly shoot sia_SHOOTING_POINT_N points, and calculate the barycenter of each point that fall on the same Hotspot. x = Random(System.ViewportWidth - 1); y = Random(System.ViewportHeight - 1); h = Hotspot.GetAtScreenXY(x, y); if (h.ID > 0) { //Hotspot 0 is not a hotspot. siaHotspotX[h.ID] = (siaHotspotN[h.ID]*siaHotspotX[h.ID] + x + GetViewportX()) / (siaHotspotN[h.ID] + 1) + Random(1); //Barycenter calculation siaHotspotY[h.ID] = (siaHotspotN[h.ID]*siaHotspotY[h.ID] + y + GetViewportY()) / (siaHotspotN[h.ID] + 1) + Random(1); //Random(1) corrects AGS int rounding siaHotspotN[h.ID] = siaHotspotN[h.ID] + 1; } index++; } DynamicSprite *siasprite = DynamicSprite.Create(System.ViewportWidth, System.ViewportHeight); // Technical stuff to create a drawing surface DrawingSurface *siasurface = siasprite.GetDrawingSurface(); index = 1; //Hotspot 0 is not a hotspot. while (index < sia_HOTSPOT_LIMIT) { if (siaHotspotX[index] !=0 && siaHotspotY[index] !=0 && hotspot[index].Enabled) { //If an hotspot have coordinates, we draw a mouse cursor on it. //Alternatively, you can repalce // Mouse.GetModeGraphic(eModeInteract) //by // 42 //to use your favourite sprite number 42. siasurface.DrawImage(siaHotspotX[index] - GetViewportX(), siaHotspotY[index] - GetViewportY(), Mouse.GetModeGraphic(eModeInteract)); } index++; } //Calclucalting Objects positions and drawing cursors. if (Room.ObjectCount > 0) { int siaObjectX, siaObjectY; Object *o; index = 0; while (index < Room.ObjectCount) { o = object[index]; if (o.Visible && o.Clickable) { siaObjectX = o.X + Game.SpriteWidth[o.Graphic]/2; siaObjectY = o.Y - Game.SpriteHeight[o.Graphic]/2; //If an object is Visible, we draw a mouse cursor on it. //Alternatively, you can repalce // Mouse.GetModeGraphic(eModeInteract) //by // 42 //to use your favourite sprite number 42. siasurface.DrawImage(siaObjectX - GetViewportX(), siaObjectY - GetViewportY(), Mouse.GetModeGraphic(eModeInteract)); } index++; } } //Calclucalting Characters positions and drawing cursors. if (Game.CharacterCount > 0) { int siaCharacterX, siaCharacterY; Character *c; index = 0; while (index < Game.CharacterCount) { c = character[index]; if (c.Room == player.Room && c.Clickable) { ViewFrame *siacharcatervf = Game.GetViewFrame(c.View, c.Loop, c.Frame); siaCharacterX = c.x; siaCharacterY = c.y - Game.SpriteHeight[siacharcatervf.Graphic]*c.Scaling/2*100; //If a character is clickable, then we draw a mouse cursor on it //Alternatively, you can repalce // Mouse.GetModeGraphic(eModeTalkto) //by // 42 //to use your favourite sprite number 42. siasurface.DrawImage(siaCharacterX - GetViewportX(), siaCharacterY - GetViewportY(), Mouse.GetModeGraphic(eModeTalkto)); } index++; } } siasurface.Release(); // Technical stuff to display the beautiful overlay we have drawn. Overlay *siaoverlay = Overlay.CreateGraphical(0, 0, siasprite.Graphic, true); while (IsKeyPressed(eKeySpace)) Wait(1); //While Key is pressed, overlay is display. siaoverlay.Remove(); //Cleaning a little bit behind us. siasprite.Delete(); siaoverlay = null ; UnPauseGame(); } } }
export sia_CheatEnable, sia_EnableHere; //Do not forget to import these bools in global script header if you want to use them. Code du module, édition alternativeShowInteractiveAreas.ash - Spoiler:
- Code:
-
// Script header for module 'ShowInteractiveAreas', v1.3 *Alternative Edition* // // Author: Billbis // // Abstract: // // While Space Bar is pressed, this module displays a mouse cursor over each // interactive areas. This function is present in most modern Point & Click. It helps // players not to miss an object / hotspot / character. Ojects and characters coordinates // are automtically determined. Hotspot coordinates must be entered via two custom properties. // // Dependencies: // // AGS version required: build for AGS 3.2.1, not sure if it works with older versions. // // AGS setting required: You MUST creates two custom properties : sia_PropX and sia_PropY // that aplied to Objects, Characters and Hostpots, with a numeric default value of -1. // For each hotspot, you need to feed sia_PropX and sia_PropY with the room coordinates you want // the cursor to be drawn. // // Configuration: // // Optional: // // sia_HOTSPOT_LIMIT might be leave as it is or be adjust to your highest Hotspot number // to optimize (a very little bit) calculation time. // // Two bools are available, sia_CheatEnable and sia_EnableHere to set up this module // as optional and to deactivate it in certain rooms or situations. // // You can feed sia_PropX and sia_PropY with the room coordinates for (imobile) chracter and // object: cursor will be drawn at these positions in priority. If left to -1 (defalut value), // objects and characters coordinates will be automaticly determined. // // Other customizations are possible by editing ShowInteractiveArea.asc directly. // // Caveats: // // This module uses ONE overlay, which can perturb your game if you already use 20 // of them at some point in your game (20 Overlays max display at a same time, // AGS limitation). // // Fragmented areas or weird shapes of objects / characters can lead to bad cursor // positionning. // // Revision history: // version 1.3: 2013/07/04 // First release of SIA *alternative edition*. // // Licence: // // ShowInteractiveAreas AGS script module is publish under the terms of the // Do What The Fuck You Want To Public License, Version 2 // // This program is free software. It comes without any warranty, to // the extent permitted by applicable law. You can redistribute it // and/or modify it under the terms of the Do What The Fuck You Want // To Public License, Version 2, as published by Sam Hocevar. See // http://sam.zoy.org/wtfpl/COPYING for more details. // // Thanks: // // Pidem and Kitai // // Defines #define sia_HOTSPOT_LIMIT 50 // Imports import bool sia_CheatEnable, sia_EnableHere;
ShowInteractiveAreas.asc - Spoiler:
- Code:
-
// ShowInteractiveAreas script
//General definitions
bool sia_CheatEnable = true; // Use this bool if you want to create an option to set this module optional. bool sia_EnableHere = true; // Use this bool in situations or rooms you do not want this module to be active.
//When player hits SpaceBar function on_key_press(eKeyCode keycode) { if (keycode == eKeySpace){//Change eKeySpace by the key you want to use. if (sia_CheatEnable && sia_EnableHere && !IsGamePaused ()) { PauseGame(); DynamicSprite *siasprite = DynamicSprite.Create(System.ViewportWidth, System.ViewportHeight); // Technical stuff to create a drawing surface DrawingSurface *siasurface = siasprite.GetDrawingSurface(); Hotspot *h; int index = 1; //Hotspot 0 is not a hotspot. while (index < sia_HOTSPOT_LIMIT) { h = hotspot[index]; if (h.Enabled && h.GetProperty("sia_PropX") != -1 && h.GetProperty("sia_PropY") != -1) { //If an hotspot have non default coordinates, we draw a mouse cursor on it. //Alternatively, you can repalce // Mouse.GetModeGraphic(eModeInteract) //by // 42 //to use your favourite sprite number 42. siasurface.DrawImage(h.GetProperty("sia_PropX") - GetViewportX(), h.GetProperty("sia_PropY") - GetViewportY(), Mouse.GetModeGraphic(eModeInteract)); } index++; } //Calclucalting Objects positions and drawing cursors. if (Room.ObjectCount > 0) { int siaObjectX, siaObjectY; Object *o; index = 0; while (index < Room.ObjectCount) { o = object[index]; if (o.Visible && o.Clickable) { if (o.GetProperty("sia_PropX") != -1 && o.GetProperty("sia_PropY") != -1) { siaObjectX = o.GetProperty("sia_PropX"); siaObjectY = o.GetProperty("sia_PropY"); } else { siaObjectX = o.X + Game.SpriteWidth[o.Graphic]/2; siaObjectY = o.Y - Game.SpriteHeight[o.Graphic]/2; } //If an object is Visible, we draw a mouse cursor on it. //Alternatively, you can repalce // Mouse.GetModeGraphic(eModeInteract) //by // 42 //to use your favourite sprite number 42. siasurface.DrawImage(siaObjectX - GetViewportX(), siaObjectY - GetViewportY(), Mouse.GetModeGraphic(eModeInteract)); } index++; } } //Calclucalting Characters positions and drawing cursors. if (Game.CharacterCount > 0) { int siaCharacterX, siaCharacterY; Character *c; index = 0; while (index < Game.CharacterCount) { c = character[index]; if (c.Room == player.Room && c.Clickable) { if (c.GetProperty("sia_PropX") != -1 && c.GetProperty("sia_PropY") != -1) { siaCharacterX = c.GetProperty("sia_PropX"); siaCharacterY = c.GetProperty("sia_PropY"); } else { ViewFrame *siacharcatervf = Game.GetViewFrame(c.View, c.Loop, c.Frame); siaCharacterX = c.x; siaCharacterY = c.y - Game.SpriteHeight[siacharcatervf.Graphic]*c.Scaling/2*100; } //If a character is clickable, then we draw a mouse cursor on it //Alternatively, you can repalce // Mouse.GetModeGraphic(eModeTalkto) //by // 42 //to use your favourite sprite number 42. siasurface.DrawImage(siaCharacterX - GetViewportX(), siaCharacterY - GetViewportY(), Mouse.GetModeGraphic(eModeTalkto)); } index++; } } siasurface.Release(); // Technical stuff to display the beautiful overlay we have drawn. Overlay *siaoverlay = Overlay.CreateGraphical(0, 0, siasprite.Graphic, true); while (IsKeyPressed(eKeySpace)) Wait(1); //While Key is pressed, overlay is display. siaoverlay.Remove(); //Cleaning a little bit behind us. siasprite.Delete(); siaoverlay = null ; UnPauseGame(); } } }
export sia_CheatEnable, sia_EnableHere; //Do not forget to import these bools in global script header if you want to use them.
Dernière édition par Billbis le Ven 5 Juil 2013 - 19:52, édité 7 fois |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 12:20 | |
| Waoh, option essentielle s'il en est. Félicitations pour ce premier module qui semble assez... modulable ! En ce qui concerne le côté plus technique, ça semble assez propre. Quelques questions cependant : pourquoi utiliser des tableaux dynamiques pour les coordonnées des personnages et des objets, alors que les propriétés X et Y de chaque instance des tableaux pré-intégrés character et object te permettent de récupérer ces coordonnées ? - Billbis a écrit:
- En particulier, si un génie pouvait me dire comment obtenir les coordonnées d'un Hotspot facilement, je lui serai très reconnaissant.
Mazette, je ne serai pas ce génial génie. Le problème est que les zones interactives peuvent être dessinées de façon discontinue : tu peux avoir un bout à gauche, et un bout à droite (si à gauche et à droite de la pièce se trouvent deux objets identiques et qu'il n'y a donc pas besoin de dissocier leurs interactions). Alors évidemment, dans ce cas-là il sera tout aussi problématique de définir une seule paire de coordonnées (X,Y) pour ton module... Mais c'est une situation qu'il faut prendre en compte. En théorie rien n'empêche non plus le développeur d'un jeu d'utiliser une seule image représentant deux objets scindés pour un objet. Bref. Une éventuelle solution pas du tout économe pour détecter automatiquement les zones interactives serait de balayer l'écran avec la propriété GetAtScreenXY. Ça donnerait quelque chose comme ça : - Code:
-
Hotspot* zone; int x, y; int min_x[], min_y[], max_x[], max_y[]; min_x = new int[sia_HOTSPOT_LIMIT]; // La coordonnée la plus à gauche de la zone min_y = new int[sia_HOTSPOT_LIMIT]; // La coordonnée la plus en haut de la zone max_x = new int[sia_HOTSPOT_LIMIT]; // La coordonnée la plus à droite de la zone max_y = new int[sia_HOTSPOT_LIMIT]; // La coordonnée la plus en bas de la zone int i = 0; // Au départ, on suppose que les coordonnées minimales sont maximales while (i < sia_HOTPOST_LIMIT) { min_x[i] = SCREEN_W; min_y[i] = SCREEN_H; i++; } while (x < SCREEN_W) { // On va balayer X while (y < SCREEN_H) { // On va balayer Y zone = Hotspot.GetAtScreenXY(x, y); if (zone != null) { // S'il y a une zone à (X, Y) // Si X est plus à gauche que la coordonnée la plus à gauche // qu'on avait trouvée auparavant pour cette zone if (min_x[zone.ID] < x) min_x[zone.ID] = x; // Si Y est plus haut que la coordonnée la plus haute // qu'on avait trouvée auparavant pour cette zone if (min_y[zone.ID] < y) min_y[zone.ID] = y; // Si X est plus à droite que la coordonnée la plus à droite // qu'on avait trouvée auparavant pour cette zone if (max_x[zone.ID] > x) max_x[zone.ID] = x; // Si Y est plus bas que la coordonnée la plus basse // qu'on avait trouvée auparavant pour cette zone if (max_y[zone.ID] > y) max_y[zone.ID] = y; } y++; } x++; } i = 0; // On va calculer le centre de chaque paire while (i < sia_HOTSPOT_LIMIT) { siaHotspotX[i] = (min_x[i] + max_x[i]) / 2; siaHotspotY[i] = (min_y[i] + max_y[i]) / 2; i++; } min_x = null; // On supprime les tableaux dynamiques min_y = null; // pour libérer de la mémoire max_x = null; max_y = null; Je n'ai pas testé ce code mais je pense qu'il devrait fonctionner (modulo la définition de SCREEN_W et SCREEN_H bien sûr). _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 12:43 | |
| Remarque judicieuse concernant les tableaux -dynamiques ou non- qui sont en fait totalement inutiles et facilement remplaçable par des int touts simples. Je vais essayer de modifier ça. Ils datent d'une époque où je voulais séparer les while d'identifications et les while de dessin, mais comme on peu les pooler très simplement, ils n'ont plus lieu d'être. Concernant la solution de balayage de l'écran, je voulais à tout pris l'éviter de par sa lourdeur, surtout avec les grandes résolutions. Voir par exemple ce sujet en Anglais. Notons que pour une résolution importante, un tel script fera bugger AGS si on ne rajoute pas un noloopcheck (1024 * 768 >> 150 000). Cela dit, je ne l'ai pas testé pour savoir combien de temps elle met en pratique. Il faudra que j'essaye. Pour le balayage, on peut même envisager de ne screener qu'un pixel sur deux, ce qui divise le temps de calcul par 4 tout en ne perdant que très peu en précision dans le calcul du centre de l'objet. Reste que ça fait tout de même une solution dont le temps de calcul est extrêmement dépendant de la résolution, ce qui pour un module est assez inadapté. EDIT : Sinon, on peut aussi jeter au hasard 1000 ou 10000 points sur l'écran, prendre le barycentre des points qui tombent dans une même zone.ID. Il faut voir ce que ça donne pour trouver un bon nombre de points en fonction de la taille de l'écran et des zones interactives.
Dernière édition par Billbis le Sam 24 Nov 2012 - 21:14, édité 1 fois |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 14:12 | |
| - Billbis a écrit:
- Voir par exemple ce sujet en Anglais. Notons que pour une résolution importante, un tel script fera bugger AGS si on ne rajoute pas un noloopcheck (1024 * 768 >> 150 000).
Bien vu ! - Billbis a écrit:
- Reste que ça fait tout de même une solution dont le temps de calcul est extrêmement dépendant de la résolution, ce qui pour un module est assez inadapté.
Ça dépend : tu peux en effet non seulement réduire l'efficacité du scan en ne scrutant qu'un pixel sur deux, mais surtout ce n'est pas trop grave si ça prend du temps uniquement au chargement de la pièce (vous vous êtes jamais demandé pourquoi les jeux affichaient "chargement en cours" avant d'entrer dans les pièces ? ). Il suffit de placer ton balayage dans la fonction on_event. Évidemment vérifie quand même le temps que ça prend en 1024*780 parce que si ça prend genre plus de 2-3 secondes, ça va faire long le chargement de la pièce. EDIT : - Billbis a écrit:
- EDIT : Sinon, on peut aussi jeter au hasard 1000 ou 10000 points sur l'écran, prendre le barycentre des points qui tombent dans une même zone.ID. Il faut voir ce que ça donne pour trouver un bon nombre de points en fonction de la taille de l'écran et des zones interactives.
J'aime ! Je n'ai jamais cherché de méthodes inexactes optimales, c'est très judicieux comme procédé ce que tu proposes là. _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 15:01 | |
| Hihi, très bon conseil de faire le screening des Hotspots à l’entrée de la room, je n'y avait pas pensé. Superbe idée. Je pense que c'est ce que je vais faire pour la prochaine version du module. Je vais aussi voir ce que je peux faire pour les objets et personnages mobiles. Si ça marche, sa réhaussera grandement la valeur ajouté de ce module !
EDIT : décidément, je n'arriverai jamais à faire un poste du premier coup. Juste pour dire que si on appel la fonction de balayage dans le on_event RoomBeforeFadeIn, il faut balayer sur toute la pièce, et non sur tout l'écran. Ce qui alourdit d’autant plus le processus que la pièce est grande.
Re-EDIT : Pourquoi dans ton code tu définis min_x, min_y, max_i et max_y comme des dynamic arrays et pas comme des arrays tout cours ? |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 17:13 | |
| - Billbis a écrit:
- EDIT : décidément, je n'arriverai jamais à faire un poste du premier coup. Juste pour dire que si on appel la fonction de balayage dans le on_event RoomBeforeFadeIn, il faut balayer sur toute la pièce, et non sur tout l'écran. Ce qui alourdit d’autant plus le processus que la pièce est grande.
Ah oui j'avais pas pensé à ça... Bah, faut voir le temps que ça prend effectivement, mais sinon le coup de la propriété personnalisée ça marchait aussi pas mal - Billbis a écrit:
- Re-EDIT : Pourquoi dans ton code tu définis min_x, min_y, max_i et max_y comme des dynamic arrays et pas comme des arrays tout cours ?
En fait j'ai juste pas réfléchi. Puisque sia_HOTSPOT_LIMIT est défini directement comme un nombre, tu peux en effet en faire des tableaux non dynamiques. _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 17:33 | |
| Juste un petit mot pour dire que jeter 10000 points au hasard ça marche nickel, et c'est très rapide sur mon PC. Je fignole tout ça et je met à jour le module. Plus besoin de rentrer des coordonnées de hotspots en custom properties. Youpi ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Sam 24 Nov 2012 - 21:02 | |
| Je me permet un double post pour annoncer une nouvelle version de ce module. *NOUVEAU* Détermination automatique des coordonnées des hotspots. *NOUVEAU* Les trois premiers posts ont été mis à jour en conséquences. Les curieux remarquerons, en lisant le code disponible au troisième post, que j'ai opté pour une détermination probabiliste des coordonnées des hotspots. En gros, on jette 10 000 points au hasard sur l'écran, et on calcul le barycentre des points qui tombe sur un même hotspots. Ça fonctionne étonnement bien. Pour vous donner une idée, et si mes calculs sont justes, pour 10 000 lancés et une résolution de 1024 x 786, les hotspots de 55 pixels de surface (soit moins de 8 x 8 de cotés) sont détectés une fois sur deux. Mais honnêtement, qui fait des Hotspots si petits dans un jeu en 1024 x 786 ? |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Dim 25 Nov 2012 - 10:03 | |
| Puis-je te suggérer, malgré ta finalisation du module, de considérer d'utiliser la fonction IsInteractionAvailable pour vérifier que la zone interactive/l'objet/le personnage détecté déclencherait bien un événement dans le cas où le joueur clique dessus ? Je pense notamment à tous ces objets qu'on met dans les pièces sans pour autant leur associer d'interaction particulière. _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Dim 25 Nov 2012 - 10:18 | |
| Le module n'est pas finit, il est juste passé de la béta 0.1 à la béta 0.2 la nuit dernière. Ta remarque est judicieuse, une foi de plus. Pour les objets décoratifs, j’avais pensé faire une custom properties (j'aime bien les custom properties), mais vu que la fonction IsInteractionAvailable existe, autant s'en servir. Pour les personnages, la propriété clickable devrait suffire, et pour les hotspots -pourquoi créer un hotspot si aucune interaction n'est possible ?- la propriété Enable devrait suffire aussi. Je vais implémenter ça pour la 0.3. Je vais aussi essayer d'optimiser la détection de hotspot : l’algorithme gardera en mémoire les coordonnées précédentes tant que le joueur n'aura pas changé de pièce.
Dernière édition par Billbis le Lun 26 Nov 2012 - 16:32, édité 1 fois |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Dim 25 Nov 2012 - 10:41 | |
| - Billbis a écrit:
- Pour les personnages, la propriété clickable devrait suffire, et pour les hotspots -pourquoi créer un hotspot si aucune interaction n'est possible ?- la propriété Enable devrait suffire aussi.
Oui oui sans doute, mais n'est-ce pas plus pratique d'utiliser IsInteractionAvailable pour tout ? Un personnage peut être clickable sans pour autant avoir d'interaction associée (un PNJ non interactif par exemple) et un hotspot peut être utilisé de moult façons, sans pour autant que des interactions y soient associées, une fois qu'on met les mains dans le cambouis du script - Billbis a écrit:
- Je vais aussi essayer d'optimiser la détection de hotspot : l’algorithme gardera en mémoire les coordonnées précédentes tant que le joueur n'aura pas changé de pièce.
N'oublie pas que le joueur peut se déplacer dans la pièce et que le décalage à l'écran est donc variable. En l'état il me semble que ton code ne scanne que l'écran (ça marche vraiment d'ailleurs ces propriétés ScreenWidth/ScreenHeight ? Je croyais que ça n'avait pas de rapport direct avec la résolution du jeu). Si vraiment tu veux garder en mémoire des données, je réitère ma suggestion de placer la détection dans la fonction on_event. _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Dim 25 Nov 2012 - 15:06 | |
| IsInteractionAvailable n'est que moyennement pratique, vu qu'il faut spécifier le mode d'interaction en question... donc il faut screener tous les modes pour toutes les zones interactives identifiés, car si une seule interaction est possible ça vaut le coup de l'indiquer en zone interactive. J'ai peur que ça commence à faire lourd. - Kitai a écrit:
- un hotspot peut être utilisé de moult façons, sans pour autant que des interactions y soient associées, une fois qu'on met les mains dans le cambouis du script
Je ne doute pas que de telles personnes sauront tout à fait adapter mon module à leur usage. A ma grande surprise, et malgré ce blabla incompréhensible du manuel d'AGS : - Code:
-
cJ.Say("Game is running at: %d x %d, %d-bit colour", System.ScreenWidth, System.ScreenHeight, System.ColorDepth); Renvoi un très jolie : - J. a écrit:
- Game is running at: 1024 x 768, 32-bit colour
Ce n'est pas la première fois que l'aide d'AGS me semble un peu bancale... - Kitai a écrit:
- N'oublie pas que le joueur peut se déplacer dans la pièce et que le décalage à l'écran est donc variable.
En l'état il me semble que ton code ne scanne que l'écran Bien vu ! Soit je bidouille un truc avec le viewport, soit j’abandonne. Je crois que j'abandonne, car ça marche vraiment pas mal, là. - Kitai a écrit:
- Si vraiment tu veux garder en mémoire des données, je réitère ma suggestion de placer la détection dans la fonction on_event.
A ma grande honte, je n'ai pas réussit à coder un truc potable pour que le GetAtScreenXY fouille toute la pièce et pas juste l'écran. J'ai des progrès à faire, encore.
Dernière édition par Billbis le Lun 26 Nov 2012 - 16:37, édité 2 fois |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Dim 25 Nov 2012 - 16:03 | |
| - Billbis a écrit:
- IsInteractionAvailable n'est que moyennement pratique, vu qu'il faut spécifier le mode d'interaction en question... donc il faut screener tous les modes pour toutes les zones interactives identifiés, car si une seule interaction est possible ça vaut le coup de l'indiquer en zone interactive. J'ai peur que ça commence à faire lourd.
Je ne pense pas que ça alourdisse tant que ça l'exécution, d'autant moins si tu arrêtes d'explorer les modes dès que la fonction retourne 1 pour un mode (ce qui devrait être le cas pour la plupart des éléments interactifs). - Billbis a écrit:
- A ma grande surprise, et malgré ce blabla incompréhensible du manuel d'AGS :
- Code:
-
cJ.Say("Game is running at: %d x %d, %d-bit colour", System.ScreenWidth, System.ScreenHeight, System.ColorDepth); Renvoi un très jolie :
- J. a écrit:
- Game is running at: 1024 x 768d, 32-bit colour
Ce n'est pas la première fois que l'aide d'AGS me semble un peu bancale... Hm, je pense simplement que l'aide n'est pas à jour. Par "largeur/hauteur véritable", je pense que CJ voulait dire "pas en coordonnées de la pièce (basse résolution)". C'est bon à savoir en tout cas - Billbis a écrit:
- Bien vu ! Soit je bidouille un truc avec le viewport, soit j’abandonne. Je crois que j'abandonne, car ça marche vraiment pas mal, là.
- Billbis a écrit:
- A ma grande honte, je n'ai pas réussit à coder un truc potable pour que le GetAtScreenXY fouille toute la pièce et pas juste l'écran. J'ai des progrès à faire, encore.
Il me semble que ce n'est pas si compliqué que ça : plutôt que d'avoir un random sur ScreenWidth et ScreenHeight, tu en fais un d'après les dimensions de la surface (en résolution réelle) de fond de la pièce. Ensuite tu soustraies GetViewPortX ou GetViewPortY quand tu passes la coordonnée dans GetAtScreenXY. _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Mer 28 Nov 2012 - 18:18 | |
| - Kitai a écrit:
- Il me semble que ce n'est pas si compliqué que ça : plutôt que d'avoir un random sur ScreenWidth et ScreenHeight, tu en fais un d'après les dimensions de la surface (en résolution réelle) de fond de la pièce. Ensuite tu soustraies GetViewPortX ou GetViewPortY quand tu passes la coordonnée dans GetAtScreenXY.
Oui, c'était pas très compliqué. La prochaine version gardera en mémoire les hotspots précédemment trouvés tant que le joueur ne quitte pas la pièce. Donc, une fois qu'il aura trouvé un petit hotspot, l’algorithme l'affichera correctement toute les fois suivantes. Je vous ferai les calculs un peu plus tard, mais contrairement à avant, un (tout) petit hotspot aura de plus en plus de chance d'être détectés a chaque pression sur la barre d'espace. La détection continu a ne se faire que sur l'écran, et pas sur toute la room. Plus j'y pense, moins j'ai envie de faire une détection sur toute une room, que ce soit dans un on_event ou à chaque on_KeyPresse, car la surface des rooms peu facilement varier de 1 à 10 ou 20. Donc en fonction des rooms, la précision de la détection où le temps de calculs ne seront pas les mêmes, ce qui m’embête un peu. - Kitai a écrit:
- Billbis a écrit:
IsInteractionAvailable n'est que moyennement pratique, vu qu'il faut spécifier le mode d'interaction en question... donc il faut screener tous les modes pour toutes les zones interactives identifiés, car si une seule interaction est possible ça vaut le coup de l'indiquer en zone interactive. J'ai peur que ça commence à faire lourd. Je ne pense pas que ça alourdisse tant que ça l'exécution, d'autant moins si tu arrêtes d'explorer les modes dès que la fonction retourne 1 pour un mode (ce qui devrait être le cas pour la plupart des éléments interactifs). J'ai codé une petite fonction comme tu me l'as suggéré : - Code:
-
function siaIsAnInteractionAvailable (int x, int y) { if (IsInteractionAvailable(x, y, eModeInteract) != 0) return true; else if (IsInteractionAvailable(x, y, eModeLookat) != 0) return true; else if (IsInteractionAvailable(x, y, eModePickup) != 0) return true; else if (IsInteractionAvailable(x, y, eModeTalkto) != 0) return true; else if (IsInteractionAvailable(x, y, eModeUseinv) != 0) return true; else return false; }
Puis rajouté un petit : - Code:
-
if (siaIsAnInteractionAvailable(siaObjectX-GetViewportX(), siaObjectY-GetViewportY())) au bon endroit, et ça fonctionne bien. La preuve : Le magnifique Trou Noir, qui est un objet sans aucune interaction, n'est pas affiché comme interactif. En revanche, la barque, qui possède des interactions, est bien identifiée comme zone interactive (bon, vous me faite confiance, elle est hors champ). Par contre, ça fonctionne un peu trop comme attendu. Si Harris l'interactif passe devant le Trou Noir non interactif : Et bien ne voilà t'il pas que le Trou Noir est affiché comme interactif ! Logique, vu mon script... Du coup, cette vérification introduit quand même plus de problèmes qu'elle n'en résout. Il y a sans doute moyen de coder une usine à gaz pour faire tourner tout ça correctement, mais ça me tente moyen. Une custom propertie (j' les custom properties, elles sont so orienté objet) qui définie si un objet / personnage / hotspot doit ne pas être affiché me semble plus pratique. Sinon, je renouvelle mon appel aux testeurs, quelqu'un a t-il essayé ce module sur son projet ? Fonctionne t-il comme attendu ? Depuis la beta 0.2 il s'installe et se désinstalle en un tour de clic. |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Ven 30 Nov 2012 - 18:20 | |
| J'ai mis en ligne la nouvelle version, qui retient la position des hotspots déjà trouvés. Pour l'occasion, j'ai passé le module en v 1.0 et je vais prochainement le poster sur le forum anglophone. Cela dit, je reste ouvert à toutes propositions d'amélioration ou d'optimistation. Et si je les refuse, n'hésitez pas à proposer votre fork. De même, n'hésitez pas à héberger ce module sur votre serveur. |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Ven 30 Nov 2012 - 19:06 | |
| Enh l'autre eh, il veut se faire héberger son module à l’œil !
Il faudra que je le teste à l'occasion, mais je ne passe pas sous Windows ces temps-ci et j'ai peu de temps libre. Toutefois je pense que tu auras du retour de la part du forum anglophone, je pense que c'est une très bonne initiative (moi les conventions de modules m'ont chaque fois découragé à poster là-bas, alors que je pense que ces conventions sont inestimables...). Il faudrait que je me motive pour le faire un jour ou l'autre. _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Mer 20 Mar 2013 - 21:03 | |
| Nouvelle version du module. Les premiers postes ont été mise à jour en conséquence. Avant, le module ne fonctionnait pas lorsque le joueur se déplaçait, il fallait attendre la fin du mouvement pour que la barre d'espace ait un effet. Maintenant, tant que la barre d'espace est enfoncé, le jeu est mis en pause et du coup, le module fonctionne correctement même lors des mouvement du joueur. - Kitai a écrit:
- (ça marche vraiment d'ailleurs ces propriétés ScreenWidth/ScreenHeight ? Je croyais que ça n'avait pas de rapport direct avec la résolution du jeu).
Après re-lecture du manuel est quelques testes personnels, il apparait que system.ScreenWidth() renvoie la largeur de l’écran en tenant compte des bandes noirs latérales en mode plein écran. Du coup, et même si ça fonctionnait apparemment sans problèmes, je les ai changé en system.ViewportWidth(). C'est plus propre. Donc tu avais (une fois de plus) raison. |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Dim 26 Mai 2013 - 12:36 | |
| Le début de la gloire : Mon module est maintenant crédité dans au moins un jeux AGS : A Cat's Night 2 par WarioPunk / PuNKKoMmANDO77. Hé oui, je double poste à but purement égoïste, pour me vanter et flooder comme un gros troll. |
| | | Shai-la Ouvrière en Chef de la Grande Tasse Bleue
Nombre de messages : 6018
Age : 46
Localisation : Montpellier
Date d'inscription : 17/04/2006
| Sujet: Re: [Module] ShowInteractiveAreas Dim 26 Mai 2013 - 17:27 | |
| Bravo |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Module] ShowInteractiveAreas Dim 26 Mai 2013 - 17:40 | |
| Félicitations Billbis ! Grâce à toi, la communauté francophone continue de répandre sa toile petit à petit. Qui sait, tu sera peut-être bientôt le nouveau Monsieur OUXX ? _________________ 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 ! |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Jeu 4 Juil 2013 - 19:25 | |
| Petite mise à jour mineure (v 1.3). La principale modification est la non prise en compte des objets non cliquables (décoratifs) lors du dessin des curseurs. Je ne comprend pas bien pourquoi je ne l'ai pas fait dès les premières versions... mais c'est corrigé. Cette nouvelle version est rétrocompatible avec la précédente (qui elle même était rétrocompatible avec la v1.0). |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Module] ShowInteractiveAreas Ven 5 Juil 2013 - 19:57 | |
| Mise à jour du jour : -v1.3 : Tant qu'a faire, les hotspots non activés (Enabled) ne sont plus affichés non plus. Et en plus j'ai fait un léger toilettage du code. -v1.3 *Alternative Edition* : La détection automatique des coordonnées de hotspots disparait aux profits de coordonnées spécifiés manuellement par l'utilisateur, voir les premiers posts. A vous de choisir |
| | | Contenu sponsorisé
| Sujet: Re: [Module] ShowInteractiveAreas | |
| |
| | | | [Module] ShowInteractiveAreas | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |