|
| [résolu]Curseur "ActiveInventory" en surbrillance | |
| | |
Auteur | Message |
---|
valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Date d'inscription : 01/08/2011
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Mer 13 Mar 2013 - 14:06 | |
| Ca marche effectivement, bravo ! Pfiouuu, j'aurais eu bien du mal à trouver ça tout seul moi ! J'ai encore beaucoup à apprendre... Mais bon, faut avouer qu'il y a pas mal de notions subtiles là dedans. Du coup je pense utiliser ça plutôt qu'une teinte, ça sera beaucoup mieux (en espérant que ça ne crée pas de bugs par la suite mais ça devrait aller...) Merci infiniment, tu devrais être rémunéré par le ministère de la culture pour le mal que tu te donnes EDIT : Du coup si on veut modifier l'épaisseur du contour, il faut multiplier les dessins de la silhouette à la fin (au lieu de 8 il faudrait en faire plein) ? |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Mer 13 Mar 2013 - 17:21 | |
| - valoulef a écrit:
- EDIT : Du coup si on veut modifier l'épaisseur du contour, il faut multiplier les dessins de la silhouette à la fin (au lieu de 8 il faudrait en faire plein) ?
Eh oui, j'ai bien peur qu'il n'y ait pas d'autre solution. En même temps, si ça reste raisonnable (genre une épaisseur de 2, voire 3 pixels), ça reste rapide sur une image qui dépasse rarement 64x64px. Et comme on l'a vu, tu as la possibilité de générer ces contours au démarrage du jeu. La solution la plus rapide reste tout de même d'intégrer directement les images avec contour comme ressources de base, mais ça rend le jeu légèrement plus lourd (et ça demande d'ouvrir ton logiciel graphique préféré pour faire la manip) et ça n'est pas une solution adaptative (pour le cas où ton curseur serait à la base une image dynamique). |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Sam 28 Sep 2013 - 20:37 | |
| Bon, vu qu'on ne peut pas modifier le Inventory item cursor marker sprite, je m'attaque au contour dynamique des objets d'inventaires. Ce topic (et les posts de Kitai en particulier) me furent d'une aide faramineuse, et j'ai maintenant un joli système en place, qui me fait des beaux contours bien quand je veux. Enfin, beau, tant que mon objet d'inventaire n'a pas de pixels semi-transparents en bordures, car dans ces conditions AGS me rajoute un peu de "rose magique" au bord : Comme j'ai surtout recopié vos codes, je ne suis pas bien sûr de savoir d'où sa peut venir. Est-ce un bug d'AGS déjà signalé ici (et peut-être en cour de résolution) ? Dans ce cas, je n'ai rien à faire, et rien à me reprocher. Ou bien est-ce mon code qui est bancal pour la gestion du canal alpha ? Je vous met mon code, car sinon vous aurez du mal à deviner : - Code:
-
//Variable declaration DynamicSprite* final;
// some functions function ContourInvItem() { DynamicSprite* silhouette; InventoryItem* item = player.ActiveInventory; silhouette = DynamicSprite.CreateFromExistingSprite(item.CursorGraphic, false); DrawingSurface* surf_silhouette = silhouette.GetDrawingSurface(); surf_silhouette.Clear(Game.GetColorFromRGB(255, 255, 255)); surf_silhouette.Release(); silhouette.CopyTransparencyMask(item.CursorGraphic); final = DynamicSprite.Create(silhouette.Width+4, silhouette.Height+4, false); DrawingSurface* surf_final = final.GetDrawingSurface(); surf_final.DrawImage(1, 1, silhouette.Graphic); surf_final.DrawImage(1, 2, silhouette.Graphic); surf_final.DrawImage(1, 3, silhouette.Graphic); surf_final.DrawImage(2, 1, silhouette.Graphic); surf_final.DrawImage(2, 3, silhouette.Graphic); surf_final.DrawImage(3, 1, silhouette.Graphic); surf_final.DrawImage(3, 2, silhouette.Graphic); surf_final.DrawImage(3, 3, silhouette.Graphic); surf_final.DrawImage(0, 2, silhouette.Graphic); surf_final.DrawImage(4, 2, silhouette.Graphic); surf_final.DrawImage(2, 0, silhouette.Graphic); surf_final.DrawImage(2, 4, silhouette.Graphic); surf_final.DrawImage(2, 2, item.CursorGraphic); surf_final.Release(); silhouette.Delete(); item.CursorGraphic = final.Graphic; }
//Dans le repeatidly_execute //... } else { //if player.ActiveInventory != null if (GetLocationType(x, y) != eLocationNothing) { if (player.ActiveInventory.CursorGraphic == player.ActiveInventory.Graphic) { ContourInvItem(); } } else { if (player.ActiveInventory.CursorGraphic != player.ActiveInventory.Graphic) { player.ActiveInventory.CursorGraphic = player.ActiveInventory.Graphic; final.Delete(); } } } //...
J'ai vu que les bools des lignes 9 et 14 codé justement les préservation des canaux alpha, mais je crois que j'ai essayé les quatre combinaisons : le bool de la ligne 9 semble ne servir à rien, mais quand le bool de la ligne 14 est vrai, tout le sprite disparait (ou est 100% transparent ?) ! |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Dim 29 Sep 2013 - 10:54 | |
| Alors là tu me poses une colle... Moi comme ça je dirais qu'il faut passer true à CreateFromExistingSprite aussi bien qu'à Create puisqu'après tout tu te bases sur une image qui a un canal alpha, mais d'après tes dires l'image finale ne contient rien... Ce qui est vraiment étrange. Si tu veux déboguer, tu peux essayer d'afficher les images étape par étape et voir à partir de quand l'image "disparaît". Quoi qu'il en soit, le bug que rapporte Calin Leafshade me semble plutôt bien correspondre à ton cas : lorsque tu passes true à Create à la ligne 14 , tu obtiens une sprite 32-bits avec canal alpha, puis de 16 à 28 tu dessines des images qui, si tu as passé true à 9, ont des pixels semi-transparents. C'est bien la situation décrite. En revanche j'ai plus de mal à comprendre ce qui se passe lorsque tu passes false à au moins une des deux images... _________________ 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: [résolu]Curseur "ActiveInventory" en surbrillance Ven 18 Oct 2013 - 16:31 | |
| Avec AGS 3.3.0 (beta 8 ), ça fonctionne bien ! Il faut bien conserver le canal alpha en mettant true partout : - Code:
-
function ContourInvItem() { DynamicSprite* silhouette; InventoryItem* item = player.ActiveInventory; silhouette = DynamicSprite.CreateFromExistingSprite(item.CursorGraphic, true); DrawingSurface* surf_silhouette = silhouette.GetDrawingSurface(); surf_silhouette.Clear(Game.GetColorFromRGB(255, 255, 255)); surf_silhouette.Release(); silhouette.CopyTransparencyMask(item.CursorGraphic); final = DynamicSprite.Create(silhouette.Width+4, silhouette.Height+4, true); DrawingSurface* surf_final = final.GetDrawingSurface(); surf_final.DrawImage(1, 1, silhouette.Graphic); surf_final.DrawImage(1, 3, silhouette.Graphic); surf_final.DrawImage(3, 1, silhouette.Graphic); surf_final.DrawImage(3, 3, silhouette.Graphic); surf_final.DrawImage(0, 2, silhouette.Graphic); surf_final.DrawImage(4, 2, silhouette.Graphic); surf_final.DrawImage(2, 0, silhouette.Graphic); surf_final.DrawImage(2, 4, silhouette.Graphic); surf_final.DrawImage(2, 2, item.CursorGraphic); surf_final.Release(); silhouette.Delete(); item.CursorGraphic = final.Graphic; } Et dans le general setting dans la section Visual, il faut mettre l'option Sprite alpha rendering style sur Proper Alpha Blending. Et tant qu'a faire, mettez aussi l'option GUI alpha rendering style sur Multiplied Translucence, Blend Source Color. |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Ven 18 Oct 2013 - 21:28 | |
| Merci du conseil Billbis, et aussi de faire vivre un peu le forum durant cette traversée du désert (qui commence à s'éterniser) !
Espérons que la 3.3 verra le jour dans pas trop longtemps, et dans de bonnes conditions (ceux qui suivent l'actualité sur le forum anglophone comprendront l'allusion). _________________ 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 ! |
| | | valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Dim 20 Oct 2013 - 19:20 | |
| - Kitai a écrit:
- Merci du conseil Billbis, et aussi de faire vivre un peu le forum durant cette traversée du désert (qui commence à s'éterniser) !
Je me sens un peu visé et à raison (même si je ne suis pas le seul à ne pas être là !), mais sachez que je devrais être plus présent prochainement. Je posterai bientôt sur le topic d'Aspirox avec un peu plus de détails Ah et pour ne pas être hors-sujet, sur mon pc je trouve que l'opération est quand-même un peu lente pour dessiner un contour (le curseur rame un peu au survol de la zone), alors je pense que je vais opter pour une simple teinte qui parait plus efficace, même si la gestion des teintes et un peu bizarre à utiliser. ...ou peut-être utiliser cette solution qui reste envisageable : - Kitai a écrit:
- La solution la plus rapide reste tout de même d'intégrer directement les images avec contour comme ressources de base
_________________ 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.
|
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Lun 21 Oct 2013 - 16:59 | |
| - valoulef a écrit:
- Ah et pour ne pas être hors-sujet, sur mon pc je trouve que l'opération est quand-même un peu lente pour dessiner un contour (le curseur rame un peu au survol de la zone)
Tu peux aussi générer tous les curseurs au début du jeu, par exemple (chargement allongé, occupation de la RAM plus importante), de façon à ce que tu aies les ressources sous la main une fois pour toute. Quelque chose dans cette idée-là : - Code:
-
DynamicSprite* curseurs[];
DynamicSprite* ContourInvItem(InventoryItem item) { DynamicSprite* silhouette = DynamicSprite.CreateFromExistingSprite(item.CursorGraphic, true), final = DynamicSprite.Create(silhouette.Width+4, silhouette.Height+4, true); DrawingSurface* surf_silhouette = silhouette.GetDrawingSurface(), surf_final = final.GetDrawingSurface(); surf_silhouette.Clear(Game.GetColorFromRGB(255, 255, 255)); surf_silhouette.Release(); silhouette.CopyTransparencyMask(item.CursorGraphic); surf_final.DrawImage(1, 1, silhouette.Graphic); surf_final.DrawImage(1, 3, silhouette.Graphic); surf_final.DrawImage(3, 1, silhouette.Graphic); surf_final.DrawImage(3, 3, silhouette.Graphic); surf_final.DrawImage(0, 2, silhouette.Graphic); surf_final.DrawImage(4, 2, silhouette.Graphic); surf_final.DrawImage(2, 0, silhouette.Graphic); surf_final.DrawImage(2, 4, silhouette.Graphic); surf_final.DrawImage(2, 2, item.CursorGraphic); surf_final.Release(); silhouette.Delete(); return final; }
function game_start() { curseurs = new DynamicSprite[Game.InventoryItemCount]; int i = 0; while (i < Game.InventoryItemCount) { curseurs[i] = ContourInvItem(inventory[i]); i++; } } Un compromis serait de charger une sprite correspondant à l'objet d'inventaire entouré dès que le joueur change d'objet d'inventaire et de la garder en mémoire tant qu'il n'en change pas (afin d'éviter d'appeler à nouveau la fonction à chaque fois que le joueur revient sur une zone interactive sans avoir changé d'objet d'inventaire entre-temps). Note à moi-même : il faudrait que je mette inventory dans la liste des mots-clés d'AGS. _________________ 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: [résolu]Curseur "ActiveInventory" en surbrillance Lun 21 Oct 2013 - 17:47 | |
| - valoulef a écrit:
- sur mon pc je trouve que l'opération est quand-même un peu lente pour dessiner un contour (le curseur rame un peu au survol de la zone)
Normalement, tu ne doit appeler la fonction qu'à l'entrée dans une zone interactive, et réinitialiser l'image qu'à la sortie de la zone interactive. Alors le léger lag devient casi imperceptible. Si ça rame tant que tu est dans la zone interactive, c'est que tu appelle la fonction de dessin des contours à chaque cycle du jeu tant que le curseur survol une zone interactive, ce qui est lourd (et inutile). Cela dit, j'ai eu un crash qui est peut-être liè à ce genre d'impact sur les performances : - AGSdump a écrit:
- ---------------------------
Illegal exception --------------------------- An exception 0xC0000005 occurred in ACWIN.EXE at EIP = 0x004522A6 ; program pointer is +72, ACI version 3.3.0.1144, gtags (3,3)
AGS cannot continue, this exception was fatal. Please note down the numbers above, remember what you were doing at the time and post the details on the AGS Technical Forum.
Most versions of Windows allow you to press Ctrl+C now to copy this entire message to the clipboard for easy reporting.
An error file CrashInfo.dmp has been created. You may be asked to upload this file when reporting this problem on the AGS Forums. (code 0) --------------------------- OK ---------------------------
Je pense que c'est liè à la disparition du player.ActiveInventory pendant le dessin, du coup je l'ai stocké dans un pointeur en espérant que ça sauve le truc. Au final, mon code ressemble à ça : - Code:
-
DynamicSprite* final;
function ContourInvItem(InventoryItem *item) { DynamicSprite* silhouette; silhouette = DynamicSprite.CreateFromExistingSprite(item.CursorGraphic, true); DrawingSurface* surf_silhouette = silhouette.GetDrawingSurface(); surf_silhouette.Clear(Game.GetColorFromRGB(255, 255, 255)); // Couleur du contour surf_silhouette.Release(); silhouette.CopyTransparencyMask(item.CursorGraphic); final = DynamicSprite.Create(silhouette.Width+4, silhouette.Height+4, true); DrawingSurface* surf_final = final.GetDrawingSurface(); surf_final.DrawImage(1, 1, silhouette.Graphic); // Trait de deux pixels d’épaisseurs, dessin en diamant surf_final.DrawImage(1, 3, silhouette.Graphic); surf_final.DrawImage(3, 1, silhouette.Graphic); surf_final.DrawImage(3, 3, silhouette.Graphic); surf_final.DrawImage(0, 2, silhouette.Graphic); surf_final.DrawImage(4, 2, silhouette.Graphic); surf_final.DrawImage(2, 0, silhouette.Graphic); surf_final.DrawImage(2, 4, silhouette.Graphic); surf_final.DrawImage(2, 2, item.CursorGraphic); surf_final.Release(); silhouette.Delete(); item.CursorGraphic = final.Graphic; }
// Dans le repeatidly execute : if (player.ActiveInventory == null) { // du code top secret ici } else { // if player.ActiveInventory != null InventoryItem *item = player.ActiveInventory; // Pour essayer d'éviter l'erreur si dessus. if (GetLocationType(x, y) != eLocationNothing) { if (item.CursorGraphic == item.Graphic) { // Mon CursorGraphic et mon Graphic sont identique au début ContourInvItem(item); // Modifie le CursorGraphic à l'entrée d'une zone interactive } } else { // si on survol rien d'interessant if (item.CursorGraphic != item.Graphic) { // si le CursorGraphic est encore différent du Graphic (si le contour est toujours déssiné) item.CursorGraphic = item.Graphic; // On enléve le contour à la sortie de chaque zone Wait(1); // petit wait de sécurité pour éviter l'erreur si dessus. final.Delete(); } } }
(tiens, l'analyseur de code à un problème avec les commentaires ?) Et sur mon PC (un i7 860 tout de même), aucun lag perceptible à l'entrée de la zone.
Dernière édition par Kitai le Lun 21 Oct 2013 - 19:32, édité 1 fois (Raison : Prévention du bug de l'analyseur) |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Lun 21 Oct 2013 - 19:39 | |
| - Billbis a écrit:
- Cela dit, j'ai eu un crash qui est peut-être liè à ce genre d'impact sur les performances :
- AGSdump a écrit:
- ---------------------------
Illegal exception --------------------------- An exception 0xC0000005 occurred in ACWIN.EXE at EIP = 0x004522A6 ; program pointer is +72, ACI version 3.3.0.1144, gtags (3,3)
AGS cannot continue, this exception was fatal. Please note down the numbers above, remember what you were doing at the time and post the details on the AGS Technical Forum.
Most versions of Windows allow you to press Ctrl+C now to copy this entire message to the clipboard for easy reporting.
An error file CrashInfo.dmp has been created. You may be asked to upload this file when reporting this problem on the AGS Forums. (code 0) --------------------------- OK ---------------------------
Je pense que ce que dit le message, c'est qu'AGS tente d'accéder à l'image de l'emplacement 72. L'emplacement étant probablement vide (dû à la suppression d'une image dynamique), le pointeur pointe vers une case vide, d'où le crash. Le Wait que tu as placé sauve peut-être la chose : durant le cycle exécuté, l'image du curseur dont tu viens de changer l'objet associé est peut-être mise à jour avant d'exécuter le Delete sur final, alors qu'en l'absence de ce cycle, il est possible que l'image ne soit pas mise à jour de suite et qu'AGS tente alors d'accéder à l'image de final, qui vient d'être enlevée de la mémoire. - Billbis a écrit:
- (tiens, l'analyseur de code à un problème avec les commentaires ?)
J'ai pris la liberté d'éditer ton message pour mettre un espace entre les "//" et ce qui suit (reste à voir pourquoi coller le commentaire aux slash d'échappement provoque ce bug...) EDIT : Bon, le problème vient de ForumActif (ou autre ?), qui considère que lorsqu'on a un texte de la forme //blabla (comme vous pouvez le voir, éditez/citez mon message pour vous en rendre compte), on a tapé un lien vers une page web, et ce même dans la balise CODE... Je verrai plus tard si je peux y faire quelque chose, mais je doute que ça soit très simple._________________ 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 Lun 21 Oct 2013 - 19:58, édité 2 fois (Raison : Source du bug identifiée) |
| | | valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Lun 21 Oct 2013 - 20:40 | |
| - Billbis a écrit:
Et sur mon PC (un i7 860 tout de même), aucun lag perceptible à l'entrée de la zone.
Ah ouais faut dire que si ton jeu ramait sur un I7 il serait sacrément mal optimisé L'avantage de développer sur un pc portable de 2008 c'est que je sais que mon jeu tournera correctement sur de basses config... Enfin pour un point & clic amateur en 1024*768 l'inverse serait dommage tu me diras... Sinon j'ai été bête (mais on a l'habitude) j'avais pas trouvé la combine pour que ça ne fasse appel à la fonction qu'à l'entrée du curseur sur la zone (et à la sortie). Merci pour ça, je sais pas encore ce que je vais faire, il me semble qu'on ne peut pas changer la luminosité d'un sprite dynamique ou d'un curseur d'inventaire ? En tout cas je n'ai pas trouvé (tint ne fait qu'office de filtre) _________________ 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.
|
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Lun 21 Oct 2013 - 21:04 | |
| Bon, j'ai eu à nouveau le crash en question (il n'est pas systématique, le coquin. Je déteste les bugs mal reproductibles !). A priori le problème était ailleurs (dans le code de l' event en question, car en fait, il a l'air event spécifique. J'espère que cette fois c'est bon.). Mais mes "optimisations" présentées plus haut ne peuvent pas faire de mal. - Kitai a écrit:
- J'ai pris la liberté d'éditer ton message pour mettre un espace entre les "//" et ce qui suit (reste à voir pourquoi coller le commentaire aux slash d'échappement provoque ce bug...)
EDIT : Bon, le problème vient de ForumActif (ou autre ?), qui considère que lorsqu'on a un texte de la forme http://blabla (comme vous pouvez le voir, éditez/citez mon message pour vous en rendre compte), on a tapé un lien vers une page web, et ce même dans la balise CODE... Je verrai plus tard si je peux y faire quelque chose, mais je doute que ça soit très simple. Tu as bien fait, je les rajouterai moi même la prochaine fois. Te casses pas trop la tête avec ça, rajouter un espace devant les commentaires me semble faisable. - valoulef a écrit:
- il me semble qu'on ne peut pas changer la luminosité d'un sprite dynamique
Le paramètre luminosité de Tint ne fonctionne pas ? Sinon tu teinte en blanc avec une faible saturation. Ça devrai le faire. |
| | | valoulef Délégué de la tasse bleue
Nombre de messages : 1791
Age : 35
Localisation : Condate
Date d'inscription : 01/08/2011
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance Lun 21 Oct 2013 - 21:42 | |
| - Billbis a écrit:
- Le paramètre luminosité de Tint ne fonctionne pas ? Sinon tu teinte en blanc avec une faible saturation. Ça devrai le faire.
En fait le paramètre luminosité de Tint agit sur la teinte (logique) et pas sur l'image de base. Je n'avais pas réussi a faire exactement ce que je voulais mais peut-être que je m'y prenais mal. Actuellement, mes curseurs d'inventaire sont proche du noir et blanc quand ils ne survolent rien, ce qui ne me convient pas à 100%, mais je me repencherai là-dessus le moment venu. _________________ 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.
|
| | | Contenu sponsorisé
| Sujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance | |
| |
| | | | [résolu]Curseur "ActiveInventory" en surbrillance | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |