Sprite Alpha

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Sprite Alpha

Message 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 ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Sprite Alpha

Message par Le Soldat Inconnu »

Alors la, ormis créer un BMP, l'enregistrer, et puis le charger pour avoir le sprite Alpha :?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Sprite Alpha

Message par Ollivier »

Rajoute #PB_Sprite_Texture | #PB_Sprite_AlphaBlending dans les options de CreateSprite().
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Sprite Alpha

Message 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.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Sprite Alpha

Message 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.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Sprite Alpha

Message 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.
Anonyme

Re: Sprite Alpha

Message 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)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Sprite Alpha

Message 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)
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Sprite Alpha

Message 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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Sprite Alpha

Message 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.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Sprite Alpha

Message 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.
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Sprite Alpha

Message 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.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Sprite Alpha

Message par Octavius »

OK Fred :wink:
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Sprite Alpha

Message 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...
Répondre