Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: flash et déformation de l'image d'un sprite  (Lu 2671 fois)

0 Membres et 1 Invité sur ce sujet

Tonyryu

  • Full Member
  • ***
  • Messages: 159
    • Voir le profil
flash et déformation de l'image d'un sprite
« le: Juin 29, 2014, 07:25:48 pm »
Bonjour,

Etant un grand fan de RPGmaker, j'ai pas mal roulé ma bosse dessus, en ayant également recoder beaucoup de chose en ruby, afin de supporter le clavier la souris et aussi les sockets. Cependant l'ENORME problème de la librairie RGSS, c'est que lorsque l'on quitte le focus de la fenêtre, l'exécution des scripts ruby est interrompu, ce qui devient catastrophique avec un jeu en client serveur.

J'ai donc commencer à coder une nouvelle librairie RGSS perso, afin de ne plus avoir cette interruption d'exécution mais aussi permettre la gestion du clavier/souris et network nativement en utilisant la librairie SFML.

Le binding se passe bien, mais je tombe sur quelques problèmes, du à ma faible connaissance des subtilités du SFML. En effet la classe Sprite de la RGSS, contient un bitmap source et un rectangle de sélection permettant d'afficher une portion du bitmap. De ce coté là, pas de soucis, avec les classes sf::Image sf::Texture, ya moyen que je m'en sorte facilement. Cependant, la RGSS propose ces subtilités :

Citer
flash(color, duration)
Begins flashing the sprite. duration specifies the number of frames flashing will last.
If color is set to nil, the sprite will disappear while flashing.

wave_amp
wave_length
wave_speed
wave_phase

Defines the amplitude, frequency, speed, and phase of the wave effect. A raster scroll effect is achieved by using a sinusoidal function to draw the sprite with each line's horizontal position slightly different from the last.

wave_amp is the wave amplitude and wave_length is the wave frequency, and each is specified by a number of pixels.

wave_speed specifies the speed of the wave animation. The default is 360, and the larger the value, the faster the effect.

wave_phase specifies the phase of the top line of the sprite using an angle of up to 360 degrees. This is updated each time the update method is called. It is not necessary to use this property unless it is required for two sprites to have their wave effects synchronized.

mirror
A flag denoting the sprite has been flipped horizontally. If TRUE, the sprite will be drawn flipped. The default is false.

bush_depth
bush_opacity

The bush depth and opacity of a sprite. This can be used to represent a situation such as the character's legs being hidden by bushes.

For bush_depth, the number of pixels for the bush section is specified. The default value is 0.

For bush_opacity, the opacity of the bush section from 0 to 255 is specified. Out-of-range values will be corrected automatically. The default value is 128.

The bush_opacity value will be multiplied by opacity. For example, if both opacity and bush_opacity are set to 128, it will be handled as a transparency on top of a transparency, for an actual opacity of 64.

opacity
The sprite's opacity (0-255). Out-of-range values are automatically corrected.

blend_type
The sprite's blending mode (0: normal, 1: addition, 2: subtraction).

color
The color (Color) to be blended with the sprite. Alpha values are used in the blending ratio.

Handled separately from the color blended into a flash effect. However, the color with the higher alpha value when displayed will have the higher priority when blended.

J'étais parti pour faire des transformations sur l'instance de sf::Image, mais je bloque sur le flash et la déformation par vague. Au pire, je peux faire les transformations au pixel, mais j'ai peur que ce soir très gourmand en temps processeur.

Est-ce que vous auriez des exemples de code permettant d'afficher un sf:Sprite avec un flash d'une certaine couleur, et/ou permettre une déformation courant dans le temps?


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : flash et déformation de l'image d'un sprite
« Réponse #1 le: Juin 29, 2014, 08:40:55 pm »
flash(color, duration)
Ca dépend de ce que ça fait exactement. Est-ce que ça ajoute un masque du sprite en blanc plus ou moins opaque par dessus ? Autre chose ?

wave_amp
wave_length
wave_speed
wave_phase

Un pixel shader. Définitivement. Toute autre solution sera trop lente.

mirror
Un textureRect inversé. Par exemple IntRect(50, 0, -50, 10) affiche un sprite de 50x10 retourné de gauche à droite.

bush_depth
bush_opacity

Là ça dépend de comment tu gères le reste, mais il faudra potentiellement un pixel shader si seule une partie du sprite doit être rendue transparente.

opacity
setColor.

blend_type
cf. sf::RenderStates.

color
setColor.

En gros, pour les changements de couleur, setColor si possible, sinon pour les trucs plus chiadés un pixel shader. Ce sera toujours la meilleure solution.
Laurent Gomila - SFML developer

Tonyryu

  • Full Member
  • ***
  • Messages: 159
    • Voir le profil
Re : flash et déformation de l'image d'un sprite
« Réponse #2 le: Juin 30, 2014, 09:33:53 am »
Merci Laurent pour ta réponse.

Pour le miroir, effectivement, c'est une méthode particulière efficace, on a tendance à penser que retourner une texture, fait qu'on ne la vois plus, alors qu'il faut vraiment considérer cela, comme une fiche de rétro-projecteur.

Pour le flash, la couleur passée en paramètre est immédiatement appliqué sur l'intégralité du sprite (avec alpha), puis l'update du sprite joue sur l'alpha de la couleur appliquée afin de la rendre transparente à la fin du temps (duration). Si aucune couleur n'est transmise en paramètre, en passant nil, alors le sprite devient non visible pendant toute la durée, son retour n'est pas progressif.

Donc avec un setColor sur sf::Sprite c'est largement jouable.

pour la gestion de la déformation, je me doutais bien que l'utilisation de shader serait ce qu'il ya de plus performant. Il faut que je regarde comment ça fonctionne, et comment cela peut s'appliquer sur un sprite indépendamment des autres.

Si tu as un exemple sous la mains, Laurent, je suis bien évidemment preneur

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : flash et déformation de l'image d'un sprite
« Réponse #3 le: Juin 30, 2014, 09:50:45 am »
Non désolé, là je n'ai pas d'exemple qui fait ça sous la main. Dans l'exemple "Shader" du SDK de SFML il y a un effet de vague sur du texte, mais ça utilise un vertex shader, qui ne marcherait pas sur un sprite.

Pour l'appliquer sur un sprite et pas sur les autres, ça se fait naturellement puisque le shader doit être donné à chaque appel à la fonction draw:

window.draw(mon_sprite_sans_effet);
window.draw(mon_sprite_avec_effet, &mon_shader);
Laurent Gomila - SFML developer

Tonyryu

  • Full Member
  • ***
  • Messages: 159
    • Voir le profil
Re : flash et déformation de l'image d'un sprite
« Réponse #4 le: Juin 30, 2014, 10:00:41 am »
je ne te demandais pas un exemple de déformation par shader, oula, loin de moi cette idée, faut quant même que je réflechisse un peu, sinon la sclérose intellectuelle n'est pas loin. Kuste l'appel d'un shader isolé à un sprite tel que tu me l'as donné, me suffit largement. Tellement l'habitude d'utiliser draw pour afficher un objet, que j'en ai oublié de regarder sa propre documentation pour voir si cette méthode pouvait offrir d'autre possibilité.