Page 1 sur 1

Sprite Alpha

Publié : jeu. 15/oct./2009 15:45
par Octavius
Je voudrais dessiner sur un Sprite de type #PB_Sprite_Alpha pour ensuite l'afficher avec DisplayShadowSprite().

Le problème c'est qu'il n'est pas possible d'utiliser SpriteOutput() avec les sprites de type #PB_Sprite_Alpha.

Comment puis-je faire ?

Re: Sprite Alpha

Publié : jeu. 15/oct./2009 18:45
par Le Soldat Inconnu
Alors la, ormis créer un BMP, l'enregistrer, et puis le charger pour avoir le sprite Alpha :?

Re: Sprite Alpha

Publié : jeu. 15/oct./2009 18:52
par Ollivier
Rajoute #PB_Sprite_Texture | #PB_Sprite_AlphaBlending dans les options de CreateSprite().

Re: Sprite Alpha

Publié : jeu. 15/oct./2009 19:52
par Octavius
Après avoir testé, ça ne marche pas :

1) Il n'est pas précisé dans la doc que #PB_Sprite_AlphaBlending fonctionne avec CreateSprite().
2) Mon image de départ ne contient pas de couche alpha, c'est l'image elle-même que je veux utiliser comme alpha.

EDIT: Désolé de ne pas posté un code, mon programme fait 12 000 lignes de code, alors c'est un peu difficile de séparer les éléments pour avoir qqch de présentable ici.

Re: Sprite Alpha

Publié : jeu. 15/oct./2009 20:22
par djes
Attends la prochaine version, pour l'instant la doc est très incomplète. La nouvelle lib drawing contient plein de fonctions pour l'alpha, j'espère qu'il y aura ce qu'il faut pour passer facilement d'une image avec couche alpha à un sprite.

Re: Sprite Alpha

Publié : jeu. 15/oct./2009 20:32
par Octavius
OK. Bon c'est pas grave, je peux attendre la sortie de la prochaine version.

En attendant je vais utiliser DisplayTransparentSprite(), ça me permet au moins d'avoir le noir transparent, même si mes niveaux de gris ne sont pas translucides.

Re: Sprite Alpha

Publié : sam. 17/oct./2009 12:16
par Anonyme
Création d'un cercle semi-Transparent dans une image , puis utilisation dans un sprite 3D supportant l'alpha blending.
Top la Beta 5 ! :mrgreen:

Code : Tout sélectionner

UsePNGImageDecoder()
UsePNGImageEncoder()

CreateImage(0,128,128,32)

StartDrawing(ImageOutput(0))
    ; Dessine la couche alpha... dessine du vide en gros
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 128, 128, $00000000)
    ; puis ton cercle...
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle(64,64,64,RGBA(64,128,255,128))
StopDrawing()

SaveImage(0,"c:\sprite.png", #PB_ImagePlugin_PNG)




ExamineDesktops()
InitSprite() : InitKeyboard() : InitSprite3D()
OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"")

LoadSprite(0,"c:\sprite.png",#PB_Sprite_Texture | #PB_Sprite_AlphaBlending)
CreateSprite3D(0,0)
DeleteFile("c:\sprite.png")


Repeat
  ExamineKeyboard()
    ClearScreen(0)
  
  Start3D()
    For x = 0 To DesktopWidth(0) / 64
     For y = 0 To DesktopHeight(0) / 64
        DisplaySprite3D(0,x*64,y*64)
     Next 
    Next 
  Stop3D()
  
 
    FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Re: Sprite Alpha

Publié : sam. 17/oct./2009 19:33
par Ollivier
@Octavius

Comment ça, ça ne marche pas? Au contraire, ça marche très bien! (Comme notre dernière bonne discussion dans un autre sujet un peu houleux, mais c'était loin d'être de notre faute...)
Au fait, t'as pondu 12000 lignes de code sans découvrir la moindre petite astuce à partager avec tes acolytes? ça ne va plus là! :D

@Cpl.Bator

Je me demande qui est l'ignoble abruti infâme, odieux voire mesquin et vicelard qui t'a inspiré à l'aide d'un code, par exemple, à enregistrer une image sur disque pour la rappeler ensuite... :mrgreen:

Code : Tout sélectionner

; Créé par Cpl.Bator
; Revu par Ollivier

CreateImage(0,128,128,32)

StartDrawing(ImageOutput(0))
    ; Dessine la couche alpha... dessine du vide en gros
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, 128, 128, $00000000)
    ; puis ton cercle...
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    Circle(64,64,64,RGBA(64,128,255,128))
StopDrawing()

ExamineDesktops()
InitSprite() : InitKeyboard() : InitSprite3D()
OpenScreen(DesktopWidth(0),DesktopHeight(0),DesktopDepth(0),"")

CreateSprite(0, 128, 128, #PB_Sprite_Texture | #PB_Sprite_Alphablending)
StartDrawing(SpriteOutput(0) )
    DrawAlphaImage(ImageID(0), 0, 0)
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    DrawAlphaImage(ImageID(0), 0, 0)    
StopDrawing()
CreateSprite3D(0,0)


Repeat
  ExamineKeyboard()
    ClearScreen(0)
  Start3D()
  Sprite3DBlendingMode(5, 7)
    For x = 0 To DesktopWidth(0) / 64
     For y = 0 To DesktopHeight(0) / 64
        DisplaySprite3D(0,x*64,y*64)
     Next
    Next
  Stop3D()
 

    FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)

Re: Sprite Alpha

Publié : sam. 17/oct./2009 22:58
par Octavius
Ollivier a écrit :Au fait, t'as pondu 12000 lignes de code sans découvrir la moindre petite astuce à partager avec tes acolytes? ça ne va plus là! :D
:wink: http://www.purebasic.fr/french/viewtopic.php?f=2&t=8676
Je partagerai bientôt les sources de ma nouvelle version.

Re: Sprite Alpha

Publié : dim. 18/oct./2009 0:18
par Ollivier
Mais, ce n'est pas dans ce sens là que je voyais les choses! C'est dans le fait d'entendre "12000 lignes": pour moi, ça sonne "Jeu + Editeur de jeu". Il y a un hic quelque part que peut-être tu aurais pu découvrir plus tôt en discutant d'autres bouts de source dans d'autres domaines. C'est ce que je t'invite à faire à l'avenir, en public ou en privé dans d'autres domaines que tes projets principaux.

Dans le lien que j'ai mis plus haut (le sujet que tu avais créé), tu es arrivé avec une idée et un problème. Tu es repartie avec ton idée publiée et une solution! Bon, des fois, il ne faut pas trop en dire c'est sûr: le monde est fait d'imposteurs! Mais la communication peut être très enrichissante, tant que l'équilibre du partage des idées est effective.

Re: Sprite Alpha

Publié : dim. 18/oct./2009 10:57
par Octavius
Je comprends ta philosophie, mais souvent je n'ai pas la sensation d'écrire des codes si exceptionnels que ça, et qui méritent d'être partagés. Je me considère encore comme un programmeur débutant et qui a beaucoup de choses à apprendre, alors quand je n'ai pas de problèmes particuliers je n'ose pas trop ouvrir de nouveaux sujets pour déballer mes bouts de code qui pourraient paraître sûrement évidents à beaucoup d'entre vous. Mais à l'avenir j'essaierai de davantage publier.

Re: Sprite Alpha

Publié : lun. 19/oct./2009 8:32
par Fred
Il faut oublier les sprites purement alpha (8 bits), c'est une reminiscence du passé (c'est rendu en mode 'software' à l'ancienne). Avec les subsystems modernes (DX9/OpenGL et Sprite3D/DX7) c'est géré en hard donc bien plus rapide, il suffit d'utiliser un sprite 32 bits avec alphachannel.

Re: Sprite Alpha

Publié : lun. 19/oct./2009 18:35
par Octavius
OK Fred :wink:

Re: Sprite Alpha

Publié : ven. 23/oct./2009 18:14
par Ollivier
Salut,

J'en profite pour surligner un point assez essentiel que Cpl.Bator a mis en valeur et que j'ai négligé sur le coup. C'est ceci:

Code : Tout sélectionner

        DrawingMode(#PB_2DDrawing_AlphaChannel)
        Box(0, 0, 128, 128, RGBA(0, 0, 0, 0) )
        DrawingMode(#PB_2DDrawing_AlphaBlend)
Les 2 1ères lignes semblent anodines mais sont pourtant indispensables quand on crée sa propre image avec couche alpha. Cpl l'a bien indiqué d'ailleurs dans son code plus haut.

A avoir négligé ce léger détail, je suis resté scotché pendant deux heures et quart, la bouche ouverte et les yeux scrutant les pixels et les valeurs pour essayer de comprendre où était le problème...