|
| [Résolu]Ma DrawImage clignote alors que je veux pas. | |
| | Auteur | Message |
---|
Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: [Résolu]Ma DrawImage clignote alors que je veux pas. Mar 20 Nov 2012 - 18:13 | |
| Coucou ! Je m'initie tout doucement aux DynamicSprites, Overlays et autres DrawingSurfaces. Imaginons que je veuille afficher un curseur de la souris à la position 100, 100 de l'écran lorsque j’appuie sur la barre d'espace : - Code:
-
function on_key_press(eKeyCode keycode) { if (keycode == eKeySpace) {
DrawingSurface *siaSurface = Room.GetDrawingSurfaceForBackground(); DrawingSurface *siaBackup = siaSurface.CreateCopy(); siaSurface.DrawImage(100, 100, Mouse.GetModeGraphic(eModeWalkto)); Wait(80); siaSurface.DrawSurface(siaBackup); siaBackup.Release(); siaSurface.Release();
} } Youpi ! Ça marche ! Mais pas glop, l'image du curseur clignote au lieu de rester fixe. Mes questions : Pourquoi tant de haine ? Comment combattre la haine par l'amour faire pour que ça ne clignote plus ? D'avance merci. Infiniment votre, Billbis EDIT : Ça a surement un lien avec le fait que je suis sur une Room dont l'image de fond est animé. Je vais creuser par là.
Dernière édition par Billbis le Mer 21 Nov 2012 - 11:42, édité 2 fois |
| | | Billbis Disciple de la Grande Tasse Bleue
Nombre de messages : 1346
Date d'inscription : 10/05/2012
| Sujet: Re: [Résolu]Ma DrawImage clignote alors que je veux pas. Mar 20 Nov 2012 - 20:15 | |
| Cher Billbis, c'est toujours un plaisir de te lire, même si parfois tu ferais mieux de réfléchir un peu avant de poster des problèmes que tu es parfaitement capable de résoudre. Cela dit, comme tu m'as déjà aidé à résoudre mes soucis avec AGS, je suis très heureux de pouvoir t'aider à ton tour. En effet, ton problème semble venir du fait que tu utilise un background animé. Or l'étape : - Code:
-
DrawingSurface *siaSurface = Room.GetDrawingSurfaceForBackground(); ne prend en compte qu'une seule des 5 frames que compte ton background animé. D'où le clignotement. Je te propose plutôt de passer par la fonction DynamicSprite.GetDrawingSurface(), en utilisant un sprite transparent que tu afficheras en overlay par la suite. Un peu comme ceci : - Code:
-
function on_key_press(eKeyCode keycode) { if (keycode == eKeySpace) { DynamicSprite *siaSprite = DynamicSprite.Create(System.ScreenWidth, System.ScreenHeight); DrawingSurface *siaSurface = siaSprite.GetDrawingSurface(); siaSurface.DrawImage(100, 100, Mouse.GetModeGraphic(eModeWalkto)); siaSurface.Release(); Overlay* myOverlay = Overlay.CreateGraphical(100, 100, siaSprite.Graphic, true); Wait(80); siaSprite.Delete(); } } Attention de prendre bien en compte le viewport si tu veux passer des screen coordinates aux rooms coordinates. Bon courage pour tes projets ! EDIT : remarquons que d'une façon inexplicable, et alors que je n'ai rien demandé, l'overlay en question disparait dès 80 cycles... |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Résolu]Ma DrawImage clignote alors que je veux pas. Mar 20 Nov 2012 - 20:42 | |
| Eh bien Billbis, on peut dire que tu peux remercier Billbis d'être passé par là, il t'a bien tiré du pétrin. Toujours est-il que je suis déçu, j'avais aussi un problème de clignotement mais je n'utilise pas de fond animé, donc ça ne peut pas venir de ça Une autre solution à ton problème, sinon, si tu veux éviter d'avoir recours à un calque (qui sera potentiellement affiché au-dessus des personnages, et qui empiétera sur la limite fixée par AGS) est de modifier chaque image de ton arrière-plan animé, en les récupérant grâce au paramètre optionnel de la fonction GetDrawingSurfaceForBackground. Et comme ça tu économises une DynamicSprite et de la mémoire _________________ 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]Ma DrawImage clignote alors que je veux pas. Mar 20 Nov 2012 - 20:50 | |
| Proposition intéressante. Malheureusement, c'est pour faire un module. Du coup je devrais vérifier si les Background en question existent avant de faire n'importe quoi... Pas sur que je sache faire ça ! |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Résolu]Ma DrawImage clignote alors que je veux pas. Mer 21 Nov 2012 - 16:12 | |
| - Billbis a écrit:
-
- Code:
-
function on_key_press(eKeyCode keycode) { if (keycode == eKeySpace) { DynamicSprite *siaSprite = DynamicSprite.Create(System.ScreenWidth, System.ScreenHeight); DrawingSurface *siaSurface = siaSprite.GetDrawingSurface(); siaSurface.DrawImage(100, 100, Mouse.GetModeGraphic(eModeWalkto)); siaSurface.Release(); Overlay* myOverlay = Overlay.CreateGraphical(100, 100, siaSprite.Graphic, true); Wait(80); siaSprite.Delete(); } } EDIT : remarquons que d'une façon inexplicable, et alors que je n'ai rien demandé, l'overlay en question disparait dès 80 cycles... 80, c'est le nombre de cycles que tu demandes d'attendre avant de supprimer ton instance siaSprite : coïncidence ? Je ne crois pas. En fait si tu réfléchis bien (eh oui, la police des idées arrive, Orwell nous avait prévenus), tu remarqueras que tu crées un calque qui contient un élément graphique, à savoir une image sur laquelle pointe ton instance siaSprite. Ok. Maintenant, si tu appelles Delete sur ton instance siaSprite, l'effet est que cette dernière ne réfère plus à aucune image (ce qui va permettre au moteur de libérer ladite image de la mémoire). Donc désormais, ton calque va chercher ton image là où siaSprite lui dit de chercher, mais siaSprite étant désormais muette (car tu lui as coupé la langue avec la commande Delete), le calque ne va trouver aucune image et donc rester totalement transparent. La solution est de ne pas supprimer ta DynamicSprite tant que tu veux afficher l'image à l'écran (car il faut bien que quelqu'un, siaSprite en l'occurrence, puisse dire où aller chercher l'image). C'est une leçon plus générale : lorsque l'apparence d'un élément du jeu est déterminé par une DynamicSprite, il ne faut pas supprimer celle-ci tant que tu veux garder l'apparence de l'élément. Généralement ça se fait de deux façons : déclarer ton instance DynamicSprite en début de fichier script, ou utiliser une variable globale. _________________ 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]Ma DrawImage clignote alors que je veux pas. Mer 21 Nov 2012 - 16:21 | |
| Bon sang, mais c'est bien sur ! Merci Kitai pour ces explications. J'ai juste un peu de mal à me dire que mon Overlay est "redessiné" à chaque frame du jeu. Vu mon faible niveau de programmation, j'avais tendance à penser que si je fait : - Code:
-
a = 1 ; b = a ; a = 0 ; b vaut toujours 1. Mais ça a l'air plus compliqué que ça avec les Overlays et les dynamic sprites. Je vais pouvoir optimiser tout ça. Donc encore merci ! |
| | | Kitai Délégué de la tasse bleue
Nombre de messages : 2907
Date d'inscription : 01/08/2006
| Sujet: Re: [Résolu]Ma DrawImage clignote alors que je veux pas. Mer 21 Nov 2012 - 18:19 | |
| - Billbis a écrit:
- j'avais tendance à penser que si je fait :
- Code:
-
a = 1 ; b = a ; a = 0 ; b vaut toujours 1. Mais ça a l'air plus compliqué que ça avec les Overlays et les dynamic sprites. Quelque part ton raisonnement est bon. Mais quelque part ton raisonnement n'est pas bon Tu as un peu la même chose dans la langue si tu dis : - Code:
-
Monkey Island (a) est désormais (=) dans mon armoire (1); Mon jeu préféré (b) est désormais (=) Monkey Island (a); Monkey Island (a) est désormais (=) hors de mon armoire (0); Est-ce que ton jeu préféré est toujours dans ton armoire ? Non. Par contre, si tu dis : - Code:
-
Mon jeu préféré (a) est désormais (=) Monkey Island (1); L'unique jeu dans mon armoire (b) est désormais (=) mon jeu préféré (a); Mon jeu préféré (a) est désormais (=) Maniac Mansion (0); Est-ce que l'unique jeu dans ton armoire est toujours Monkey Island ? Oui (sous un sens. Non, sous un autre). Ce que ça révèle, c'est d'une part que "mon jeu préféré" est une expression du français qui se comporte un peu comme un pointeur : l'objet auquel l'expression se réfère peut changer, et donc les propriétés de "mon jeu préféré" varient en fonction de l'objet auquel l'expression se réfère. Au contraire "Monkey Island" est une expression du français qui ne se comporte pas comme un pointeur : l'objet auquel l'expression se réfère est toujours le même objet. Pour autant, les propriétés de Monkey Island peuvent changer avec le temps (il peut être le jeu le plus récent un jour, et cesser de l'être le lendemain). Donc les deux expressions sont liées à des propriétés variables, mais en plus l'expression "pointeur" est liée à un objet variable (chaque objet ayant des propriétés variables), tandis que l'expression non pointeur est toujours liée au même objet, qui lui a des propriétés variables. D'autre part, ça révèle que "est désormais" est en français une expression bien plus symétrique que ne l'est l'opérateur "=" : on peut comprendre "l'unique jeu dans mon armoire est désormais mon jeu préféré" comme "je redéfinis mon jeu préféré comme...", tandis qu'en programmation "Instance* a = b;" ne signifiera jamais "je redéfinis b de façon à ce que ça réfère à a". Je te laisse cogiter là-dessus _________________ 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]Ma DrawImage clignote alors que je veux pas. Mer 21 Nov 2012 - 18:44 | |
| Merveilleux. Je vais relire tout ça et y songer cette nuit. Mais je crois bien que tu as réussis à me faire enfin comprendre la différence fondamentale entre une variable et un pointeur. Chose que ni Asaroth, ni l'aide d'AGS, ni le Site du Zéro n'avaient réussi à faire. Enfin, je suis pas sur. Faut que j'y réfléchisse. En tout cas, mille mercis Kitai. |
| | | Contenu sponsorisé
| Sujet: Re: [Résolu]Ma DrawImage clignote alors que je veux pas. | |
| |
| | | | [Résolu]Ma DrawImage clignote alors que je veux pas. | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |