Forum d'entraide à la création de jeux d'aventure
 
PortailPortail  AccueilAccueil  RechercherRechercher  S'enregistrerS'enregistrer  Connexion  
Le Deal du moment : -50%
-50% Baskets Nike Dunk Low
Voir le deal
64.99 €

 

 [résolu]Curseur "ActiveInventory" en surbrillance

Aller en bas 
3 participants
Aller à la page : 1, 2  Suivant
AuteurMessage
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyVen 8 Mar 2013 - 15:53

Comme dirait mon ami le Lieutenant Columbo : "Ah, j'oubliais ! Désolé de vous importuner mais j'ai encore une 'dernière' question" ^^

Dites moi, on peut animer les curseurs "normaux". Mais cette option n'est pas disponible pour les objets d'inventaire. Y'aurait-il un moyen pour qu'un objet d'inventaire passe en surbrillance lorsqu'il survole une zone interactive ? Autrement dit, peut-on demander à AGS de changer l'image d'un objet d'inventaire actif en tant que curseur selon une certaine condition, sans avoir à créer autant de curseurs que d'objets d'inventaire ?

"Ah, encore une chose !"

Bon si c'est pas possible c'est pas très grave mais ça serait pas mal quand même. Pour chaque curseur, on détermine un point d'interactivité. C'est le point qui détermine à quelle coordonnée précise est le curseur. Avec mon système, si ce point rencontre un hotspot, par exemple, le passe en mode "interact". N'y a-t-il aucun moyen pour que cela s'applique quelque soit la partie du curseur qui touche le hotspot ? Donc que la partie interactive du curseur soit l'ensemble du curseur lui même ? J'imagine que non parce que ça risquerait de créer des conflits, mais on ne sait jamais.


"Ah, j'oubliais !" ... Bon, bon d'accord, ce sera tout pour le moment sourire


Dernière édition par valoulef le Mar 12 Mar 2013 - 23:33, édité 1 fois
Revenir en haut Aller en bas
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue
Billbis


Nombre de messages : 1346

Date d'inscription : 10/05/2012


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyVen 8 Mar 2013 - 19:10

valoulef a écrit:
Y'aurait-il un moyen pour qu'un objet d'inventaire passe en surbrillance lorsqu'il survole une zone interactive ?

Oui c'est possible, mais il faut utiliser quelques astuces.


...
Quoi ?
Tu veux les détails ?
Ha...d'accord.
A mon avis, il faut que tu utilises InventoryItem.CursorGraphic dans le repeatedly_execute(), et si tu ne veux pas le faire un sprite par cursor, il va falloir t'attaquer au sprites dynamiques...

Bon courage !

valoulef a écrit:
J'imagine que non parce que ça risquerait de créer des conflits, mais on ne sait jamais.
Tu imagines bien. ^^
Revenir en haut Aller en bas
http://nothingaboutthedog.blogspot.fr/
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyVen 8 Mar 2013 - 19:37

Billbis a écrit:
et si tu ne veux pas le faire un sprite par cursor, il va falloir t'attaquer au sprites dynamiques...

Bon courage !
Bah, ce n'est pas si compliqué : dessiner des contours d'un objet ce n'est que dessiner la silhouette de cet objet à (X-1,Y-1), (X,Y-1), (X+1,Y-1), (X-1,Y), ... puis de redessiner l'objet en question à (X,Y) !

Billbis a écrit:
valoulef a écrit:
J'imagine que non parce que ça risquerait de créer des conflits, mais on ne sait jamais.
Tu imagines bien. ^^
Pas nécessairement, si ton algorithme donne la priorité exclusive à un élément de façon systématique (l'élément dont l'ID est le plus haut, par exemple, ce qui est généralement le cas quand on passe par une boucle while).
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 11 Mar 2013 - 20:01

Alors en fait c'est player.ActiveInventory.CursorGraphic qui faut utiliser. Sauf que la valeur retournée est un entier (int), incompatible avec DynamicSprite... Donc je ne peux pas faire "player.ActiveInventory.CursorGraphic = MonSpriteDynamique"

Une indication ? sourire
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 11 Mar 2013 - 22:15

valoulef a écrit:
Donc je ne peux pas faire "player.ActiveInventory.CursorGraphic = MonSpriteDynamique"

Une indication ? sourire
DynamicSprite.Graphic clin d'oeil


Bon, je vais en dire un peu plus. Tu peux redéfinir la propriété Graphic (et non CursorCraphic) d'un objet d'inventaire. L'entier retourné pointe sur l'image désirée, et dans le cas d'une sprite dynamique, sa propriété Graphic est également un entier qui pointe sur une image existant temporairement.
Le tout est donc de bien t'assurer de l'existence de cette image le temps que tu l'utilises (en déclarant la variable sprite dynamique en dehors de toute fonction), et surtout de redéfinir l'image de l'objet d'inventaire pour celle d'origine lorsque tu en as fini avec ta sprite dynamique.

Je n'en dis pas plus pour le moment, histoire de te laisser chercher par toi-même pour que tu aies la satisfaction d'avoir trouvé la solution clin d'oeil
Mais si tu coinces à certaines étapes, n'hésite pas.

EDIT : Ah et petite indication qui est plutôt difficile à trouver au début. Pour dessiner la silhouette d'une image, utilise la commande CopyTransparencyMask sur une sprite de mêmes dimensions remplie par la couleur avec laquelle tu désires dessiner la silhouette.
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMar 12 Mar 2013 - 21:22

Bon ben je croyais y arriver mais ça va pas, ce que je fais...

Pour l'instant, je ne me suis pas focalisé sur l'aspect du sprite, simplement sur le fait d'assigner un nouveau sprite au curseur (via CreateFromExistingSprite).

Voici mon code qui rend fou AGS :

Code:

 if (gInventory.Visible == false) {
  if (player.ActiveInventory == null) {
 
//[...]

    }
      else if (player.ActiveInventory != null) {
      DynamicSprite* CurseurInv = DynamicSprite.CreateFromExistingSprite(player.ActiveInventory.Graphic, false);
    if (hsurvol != hotspot[0]) {
      InventoryItem* Item = player.ActiveInventory;
      CurseurInv.Tint(150, 20, 20, 20, 50);
      player.ActiveInventory.CursorGraphic = CurseurInv.Graphic;
    }
  else {
  player.ActiveInventory.CursorGraphic = player.ActiveInventory.Graphic;
  CurseurInv.Delete();
  }
 }
}


Notez que la ligne "InventoryItem* Item = player.ActiveInventory;" est inutile, je m'en suis rendu compte après, je pensais en avoir besoin mais en fait non.

Et là, j'obtiens ce mignon petit message d'erreur :

[résolu]Curseur "ActiveInventory" en surbrillance 474109Sanstitre

Ensuite évidemment le jeu crash, mais pas AGS.

J'ai utilisé le debug mode pour savoir à quel moment le crash intervient. Et, chose curieuse, il intervient à la fin de la fonction repeatedly_execute_always (qui est vide).

Je précise que ça n'est pas lié à la dernière condition "else" car je l'ai ajoutée après.
AJOUT A POSTERIORI : Avec cette condition, je n'obtiens pas la même erreur, le jeu crash d'abord et ça me met ça :
[résolu]Curseur "ActiveInventory" en surbrillance 743081Sanstitre2

J'ai aussi essayé de remplacer "CursorGraphic" par "Graphic", ça fait la même chose.

Quand à définir la variable DynamicSprite* en dehors des fonctions, ça ne marche pas (et en fait c'est logique vu que la variable est associée à player.ActiveInventory et il faut donc vérifier qu'un objet soit actif pour qu'elle puisse fonctionner). Je copie quand même le message d'erreur obtenu dans ce cas dans le rapport : "GlobalScript.asc(3): Error (line 3): cannot assign initial value to global pointer".


Laissez-moi deviner, j'ai fait n'importe quoi ? ^^
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMar 12 Mar 2013 - 22:35

Alors la première erreur, je pense la comprendre : elle est liée à ce que j'ai dit à propos de définir la sprite en dehors des fonctions. Puisque ton code définit la sprite de façon locale, lorsque la fonction a fini d'être exécuté, l'image du curseur pointe vers du vide, d'où le bug (tu noteras le mot "pointer" dedans).
La seconde erreur est un peu bizarre, c'est comme si tu avais oublié une accolade ("Out of memory" suggère une surcharge mémoire). Après peut-être qu'en fait ça veut plutôt dire que le curseur cherche l'image dans un bloc de mémoire vide (pour dire les choses grossièrement) et du coup ça retomberait sur le même type d'erreur (mais alors pourquoi pas exactement le même message ? mystère).

Enfin le dernier message je le comprends bien mieux (l'explication que tu donnes est juste selon moi). En effet, je t'ai conseillé de déclarer la variable hors de la fonction, pas de la définir clin d'oeil(ouais en fait je suis pas certain qu'il y ait une différence, mais moi j'en fais une).
Déclarer la variable, c'est juste dire "je vais utiliser ce mot-là comme un nom de variable de tel type", sans pour autant dire quelle est la valeur de cette variable.

Donc ton code ressemblerait à quelque chose comme ça :
Code:
// Haut du script
DynamicSprite* CurseurInv; // Déclaration de la variable "CurseurInv" comme sprite dynamique

// à l'intérieur de ta fonction :
if (gInventory.Visible == false) {
  if (player.ActiveInventory == null) {
 
    //[...]

  }
  else if (player.ActiveInventory != null) {
    // Assignation d'une valeur à "CurseurInv"
    CurseurInv = DynamicSprite.CreateFromExistingSprite(player.ActiveInventory.Graphic, false);
    if (hsurvol != hotspot[0]) {
      InventoryItem* Item = player.ActiveInventory;
      CurseurInv.Tint(150, 20, 20, 20, 50);
      player.ActiveInventory.CursorGraphic = CurseurInv.Graphic;
    }
    else {
      player.ActiveInventory.CursorGraphic = player.ActiveInventory.Graphic;
      CurseurInv.Delete();
    }
  }
}

Ça marche-tu ?


Dernière édition par Kitai le Dim 22 Sep 2013 - 19:21, édité 1 fois (Raison : modification de l'indentation)
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMar 12 Mar 2013 - 23:31

Tu fais de la magie ! Ça marche niquel !

J'étais pas si loin en fait ^^

Merci, une fois encore !


EDIT : Je modifie le titre du topic pour plus de clarté, l'autre question n'étant que secondaire.

Ah et au fait, du coup on peut bien redéfinir la propriété CursorGraphic d'un objet d'inventaire ! Par contre du coup j'utilise une teinte ; ton idée d'ajouter un contour au curseur est très bonne, je ne me suis pas encore top penché sur la commande CopyTransparencyMask, mais selon l'aide elle est assez lente à exécuter donc je sais pas si c'est très adapté... ça vaut pas le coup de faire laguer le jeu pour ça. De toute façon une teinte devrait aussi faire mon affaire.
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 13 Mar 2013 - 9:49

valoulef a écrit:
Ah et au fait, du coup on peut bien redéfinir la propriété CursorGraphic d'un objet d'inventaire !
Ah bah merci bien ! En fait je pense que j'avais pas mis la section InventoryItem à jour dans le manuel ! (elle était restée à la version 3.0*)

valoulef a écrit:
je ne me suis pas encore top penché sur la commande CopyTransparencyMask, mais selon l'aide elle est assez lente à exécuter donc je sais pas si c'est très adapté... ça vaut pas le coup de faire laguer le jeu pour ça. De toute façon une teinte devrait aussi faire mon affaire.
Certes cette commande est un peu lente, mais faut pas exagérer non plus. Elle est d'autant moins lente que l'image est petite, et un curseur c'est très petit comme image. De plus tu ne l'utilises pas à chaque cycle de jeu. Enfin, je ne me souviens pas si on peut faire des tableaux dynamiques avec des variables DynamicSprite, mais si c'est le cas, alors tu peux générer les images "tourées" dans game_start (encore que l'intérêt de passer par une DynamicSprite est de "tourer" quel que soit le curseur actif, même si l'image provient elle-même d'une DynamicSprite).
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 13 Mar 2013 - 12:41

Bon, désolé mais y'a un truc qui m'échappe.

Chris Jones, traduit par les membres de la communauté francophone d'AGS a écrit:

CopyTransparencyMask

[...]

NOTE : Cette commande rend tous les pixels qui sont transparents dans la sprite source également transparents dans la sprite dynamique. Elle ne rend pas opaques les pixels de la sprite dynamique qui sont opaques dans la sprite source (il n'y aurait pas moyen de savoir quelle couleur leur donner).

Dès lors, je ne vois pas comment je peux utiliser cette commande pour faire un contour au sprite puisque cette commande ne fait que rendre tout ou partie du sprite transparent... J'ai beau chercher... j'vois pas !
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 13 Mar 2013 - 12:46

Peut-être que tu devrais relire mon message plus haut ^^
L'idée pour faire un contour, c'est de dessiner la silhouette 8 fois au moins (selon les décalages sur l'axe horizontal et sur l'axe vertical). Tu obtiens donc une silhouette "grossie" par rapport à la silhouette d'origine. Sur cette silhouette grossie, tu redessines l'image d'origine : l'effet sera que l'image possède un contour.

Et je suis en train de regarder sous AGS là, et il est effectivement possible de créer un tableau dynamique avec des DynamicSprite. Donc tu n'as plus d'excuses clin d'oeil

EDIT : attention aussi à la profondeur de tes images. J'ai essayé avec l'image de la clef dans le projet par défaut d'AGS, et elle est en 256 couleurs. Du coup, puisque CopyTransparencyMask exige la même profondeur de couleurs pour les deux images, je suis obligé de faire une silhouette possédant une des 256 couleurs (donc je ne peux pas passer GetColorFromRGB).
Si on veut malgré tout utiliser plus de couleurs pour "tourer" l'image, il va falloir ruser : il faut tout d'abord créer une DynamicSprite aux dimensions de l'image d'origine, récupérer la surface de l'image d'origine et dessiner cette surface sur celle de la DynamicSprite qu'on vient de créer. Ainsi, on a une copie haute-résolution de notre image 8 bits d'origine. Ensuite on procède "normalement", en se basant sur notre DynamicSprite plutôt que sur l'image d'origine.


Dernière édition par Kitai le Mer 13 Mar 2013 - 13:10, édité 2 fois (Raison : Remarque 8 bits)
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 13 Mar 2013 - 13:16

Kitai a écrit:

EDIT : attention aussi à la profondeur de tes images. J'ai essayé avec l'image de la clef dans le projet par défaut d'AGS, et elle est en 256 couleurs. Du coup, puisque CopyTransparencyMask exige la même profondeur de couleurs pour les deux images, je suis obligé de faire une silhouette possédant une des 256 couleurs

Oui mais j'ai déjà eu le problème avec "Tint" et du coup j'utilise un sprite test en hautes couleurs (ce qui sera le cas dans le jeu). Je suis néanmoins en train de me noyer quelque part entre les drawing surfaces et les sprites dynamiques sans trop savoir ou donner de la tête confus
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 13 Mar 2013 - 13:27

valoulef a écrit:
Je suis néanmoins en train de me noyer quelque part entre les drawing surfaces et les sprites dynamiques sans trop savoir ou donner de la tête confus
Ok, alors voilà le code que j'ai testé (et qui marche) :
Code:
// Je crée une image de la taille de celle qui m'intéresse
DynamicSprite* silhouette = DynamicSprite.CreateFromExistingSprite(iKey.Graphic);
DrawingSurface* surf_silhouette = silhouette.GetDrawingSurface();
// Je remplis cette image de blanc (par exemple, et modulo remarques sur images 8bits)
surf_silhouette.Clear(Game.GetColorFromRGB(255, 255, 255));
surf_silhouette.Release();
// Je "découpe" la silhouette en copiant le masque de transparence de l'image qui m'intéresse
silhouette.CopyTransparencyMask(iKey.Graphic);
// Je crée une image qui sera un peu plus large et un peu plus haute (contours)
DynamicSprite* final = DynamicSprite.Create(silhouette.Width+2, silhouette.Height+2);
DrawingSurface* surf_final = final.GetDrawingSurface();
// Je dessine la silhouette (blanche en l'occurrence) de façon décalée
surf_final.DrawImage(0, 0, silhouette.Graphic);
surf_final.DrawImage(0, 1, silhouette.Graphic);
surf_final.DrawImage(0, 2, silhouette.Graphic);
surf_final.DrawImage(1, 0, silhouette.Graphic);
surf_final.DrawImage(1, 2, silhouette.Graphic);
surf_final.DrawImage(2, 0, silhouette.Graphic);
surf_final.DrawImage(2, 1, silhouette.Graphic);
surf_final.DrawImage(2, 2, silhouette.Graphic);
// Je dessine l'image qui m'intéresse au centre
surf_final.DrawImage(1, 1, iKey.Graphic);
surf_final.Release();
silhouette.Delete();
// Et voilà, j'ai ma sprite FINAL qui contient l'image tourée (de blanc ici)
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 13 Mar 2013 - 14:06

Ca marche effectivement, bravo ! sourire

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) ?

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


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyMer 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).
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue
Billbis


Nombre de messages : 1346

Date d'inscription : 10/05/2012


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptySam 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. sourire 
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 :
[résolu]Curseur "ActiveInventory" en surbrillance 1380400989-bugmagicpink
Comme j'ai surtout recopié vos codes, je ne suis pas bien sûr de savoir d'où sa peut venir. rougit 
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 ?) !
Revenir en haut Aller en bas
http://nothingaboutthedog.blogspot.fr/
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyDim 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...
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue
Billbis


Nombre de messages : 1346

Date d'inscription : 10/05/2012


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyVen 18 Oct 2013 - 16:31

[résolu]Curseur "ActiveInventory" en surbrillance 1382113560-bouilloire
Avec AGS 3.3.0 (beta 8 ), ça fonctionne bien ! sourire
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.
Revenir en haut Aller en bas
http://nothingaboutthedog.blogspot.fr/
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyVen 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).
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyDim 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 clin d'oeil

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
Revenir en haut Aller en bas
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 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.
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue
Billbis


Nombre de messages : 1346

Date d'inscription : 10/05/2012


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 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.
zarb 
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.
sourire


Dernière édition par Kitai le Lun 21 Oct 2013 - 19:32, édité 1 fois (Raison : Prévention du bug de l'analyseur)
Revenir en haut Aller en bas
http://nothingaboutthedog.blogspot.fr/
Kitai
Délégué de la tasse bleue
Délégué de la tasse bleue
Kitai


Nombre de messages : 2907

Date d'inscription : 01/08/2006


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 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.


Dernière édition par Kitai le Lun 21 Oct 2013 - 19:58, édité 2 fois (Raison : Source du bug identifiée)
Revenir en haut Aller en bas
http://admin.no.uchi.free.fr/dokuwiki-2008-05-05/doku.php
valoulef
Délégué de la tasse bleue
Délégué de la tasse bleue
valoulef


Nombre de messages : 1791

Age : 35

Localisation : Condate

Date d'inscription : 01/08/2011


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 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.
sourire
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)
Revenir en haut Aller en bas
Billbis
Disciple de la Grande Tasse Bleue
Disciple de la Grande Tasse Bleue
Billbis


Nombre de messages : 1346

Date d'inscription : 10/05/2012


[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance EmptyLun 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. sourire

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.
Revenir en haut Aller en bas
http://nothingaboutthedog.blogspot.fr/
Contenu sponsorisé





[résolu]Curseur "ActiveInventory" en surbrillance Empty
MessageSujet: Re: [résolu]Curseur "ActiveInventory" en surbrillance   [résolu]Curseur "ActiveInventory" en surbrillance Empty

Revenir en haut Aller en bas
 
[résolu]Curseur "ActiveInventory" en surbrillance
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Adventure Games Studio fr :: CREATION DE JEUX :: Questions / Réponses-
Sauter vers: