CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] ID3DXSprite

lag-it
lag-it
Niveau 10
09 juillet 2004 à 00:25:24

Bin pourtant dans ma doc avec F1 :

Microsoft DirectX 8.1
ID3DXSprite::Draw
Draws a simple sprite in screen-space.

HRESULT Draw(
LPDIRECT3DTEXTURE8 pSrcTexture,
CONST RECT* pSrcRect,
CONST D3DXVECTOR2* pScaling,
CONST D3DXVECTOR2* pRotationCenter,
FLOAT Rotation,
CONST D3DVECTOR2* pTranslation,
D3DCOLOR Color
) ;

Parameters
pSrcTexture
[in] Pointer to an IDirect3DTexture8 interface, representing the source image used for the sprite.
pSrcRect
[in] A pointer to a RECT structure that indicates what portion of the source texture to use for the sprite. If this parameter is NULL, then the entire source image is used for the sprite; however, you can specify a sub-rectangle of the source image instead.
Before transformation, the size of the sprite is defined by pSrcRect with the top-left corner at the origin ( 0,0).

pScaling
[in] Pointer to a D3DXVECTOR2 structure, containing the scaling vector. If this argument is NULL, the value ( 1.0, 1.0) is used. Since pScaling is vector, a multiplier of 1.0 would preserve the source image size.
pRotationCenter
[in] Pointer to a D3DXVECTOR2 structure, containing the point in screen pixels that identifies the center of rotation. If this argument is NULL, the point ( 0,0) is used, which is the upper-left corner of the texture.
Rotation
[in] Value that specifies the rotation in radians, counter-clockwise.
pTranslation
[in] Pointer to a D3DXVECTOR2 structure, containing the translation in screen pixels. If this argument is NULL, the point ( 0,0) is used.
Color
[in] D3DCOLOR type. The color and alpha channels are modulated by this value. A value of 0xFFFFFFFF maintains the original source color and alpha data.
Return Values
If the method succeeds, the return value is D3D_OK.

If the method fails, the return value can be D3DERR_INVALIDCALL.

Remarks
This method must be called between an IDirect3DDevice8::BeginScene and IDirect3DDevice8::EndScene pair.

If ID3DXSprite::Begin has not been called, this method will internally call Begin and ID3DXSprite::End. When making successive calls to ID3DXSprite::Draw and/or ID3DXSprite::DrawTransform, be sure to call Begin to avoid the extra overhead of Draw and DrawTransform internally calling Begin and End each time.

The image can be mirrored by specifying a negative vector in the appropriate direction ( x, y, or both) for the pScaling parameter and adding the width and/or height of the source rectangle, specified in the pSrcRect parameter, to the values specified in the pTranslation parameter. Note that this will change the point of origin for rotations.

Requirements
Header: Declared in D3dx8core.h.
Import Library: Use D3dx8.lib.

See Also
ID3DXSprite::DrawTransform

lag-it
lag-it
Niveau 10
09 juillet 2004 à 00:26:21

Je précise qu´en dépit du " Microsoft DirectX 8.1", c´est bien extrait de DirectX9.0b

techslash
techslash
Niveau 8
09 juillet 2004 à 00:27:47

J´ai regardé sur msdn en ligne... J´ai l´impression que c´est le proto à 5 params qui est le + à jour... Voyez vous-même:

Proto 7 param:
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/graphics/reference/d3dx/interfaces/id3dxsprite/Draw.asp

" Archived content. No warranty is made as to technical accuracy. Content may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist."

Proto 5 param:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/d3dx/interfaces/ID3DXSprite/Draw.asp

techslash
techslash
Niveau 8
09 juillet 2004 à 00:29:12

Je viens de voir

D3DXMatrixScaling

Dans la documentation... Je vais essayer ça.

lag-it
lag-it
Niveau 10
09 juillet 2004 à 00:30:42

Essaye DrawTransform.
Mais l´avantage de LPDIRECT3DXSPRITE, c´est justement de te passer des matrices :)

techslash
techslash
Niveau 8
09 juillet 2004 à 00:34:59

Je trouve pas que c´est un avantage ( sauf peut-être au niveau performance ? ), c´est plutôt facile à utiliser ( les matrices de base, du moins, qui sont fournies avec le SDK).

Malheureusement c´est la version à 7 param qui vient avec DrawTransform.

La matrice de scaling marche bien, l´image grossie comme prévue.

Merci à vous deux, je pense que ça répond à toutes mes question ! :)

LGV
LGV
Niveau 28
09 juillet 2004 à 00:58:40

lag-it : et si tu prends seulement la doc du SDK de DX, il te dit pareil pour le proto ?
moi je serai tenté de dire que tu as le SDK 9.0b d´AVANT le Summer Update 2003, qui a justement apporté pas mal de modifs à ID3DXSPRITE. Si c´est le cas, il parait ( je n´utilisais pas avant, donc je ne peux pas comparer) que les perfs se sont GRANDEMENT amélioré entre les deux, donc tu peux p-e y gagner :-?

techslash : matrice ou pas, moi je trouve zarb que dans le draw on ne garde que 2 transfos sur trois ( rotation/scaling/translation) : ou bien il fallait garder les 7 params, ou alors tout passer via la SetTransform pour rester cohérent. Là il faut utiliser les params du draw pour la position et le scaling et le transform pour la rotation, j´ai trouvé ça bizarre mais apparement c´est prévu pour fonctionner comme ça

techslash
techslash
Niveau 8
09 juillet 2004 à 06:50:20

Par curiosité...

Est-ce que la version de ID3DXSPRITE avant la summer update supporte le color keying pour la transparence ?

Parce que la dernière version ne le fait pas, le color keying de D3DXCreateTextureFromFileEx remplace tout les pixels d´une couleur ARGB en noir transparent ( ce qui, je suppose, veut dire noir avec un alpha de 0). Conséquemment, il faut faire de l´alpha blending. Superbe casse-tête, les explications à ce sujet étant absente d´msdn :-p .

lag-it
lag-it
Niveau 10
09 juillet 2004 à 09:09:17

Oui, je dois avoir une version pré-summer update 2003 :)

Et oui, ID3DXSPRITE supporte le color keying pour la transparence.
Mais c´est bizarre d´avoir à faire de l´alpha-blending, y pas une autre méthode :(

Pour une fois que je trouvais DirectX très accessible pour les débutants, voila qu´ils nous suppriment des paramètres qui facilifiaient la vie et qu´il posent des problèmes de transparence...

LGV
LGV
Niveau 28
09 juillet 2004 à 14:59:59

ben il se trouve qu´avant le Summer Update, le Draw était en fait un Blit sélectif, le masque étant défini par la colorkey ; seulement ça coûte pas mal en perf, puisque le blitter doit tester les pixel pour s´avoir s´il doit les afficher ou pas ; de plus ça peut poser pb si le sprite est scalé. Donc leur idée retenue dans la derniere implémentation, pour améliorer la rapidité, c´est effectivement de substituer à la création de la texture les pixels correspondants à la colorkey par du noir. Du coup pour arriver au meme résultat, il n´y a plus qu´à faire une des unités de texturing plutot qu´un blitter, ce qui s´avère TRES intéressant en terme d´efficacité ( surtout à partit des GF3 en fait). Mais bon evidémment, pour pas que le noir s´affiche, faut blender : et comme c´est du noir en alpha 0, sa contribution est de zéro.
Donc c´est principalement pour utiliser une autre partie de l´archi interne, plus rapide, que le blit a été remplacé par un texturing standard.

techslash
techslash
Niveau 8
09 juillet 2004 à 17:37:30

M´enfin, bonne chance pour blender pour une personne qui s´y connait pas. Tout les guides, articles et tuto du net parle de la version avant la summer update 2k3. J´avance par tatonnement. Je remplace une couleur par du noir alpha 0 sans problème sauf que le blending refuse de se faire, peut importe les renderstates que je mets :mort: ( autrement dit le noir " transparent"/cgn´est pas transparent du tout).

techslash
techslash
Niveau 8
09 juillet 2004 à 17:38:27

/ cg ? ! Qu´est-ce que c´est que cette faute de frappe qui est apparue toute seule ? lol

LGV
LGV
Niveau 28
09 juillet 2004 à 17:47:19

ben comme l´interface ID3DXSPRITE gère ses propres renderstates ( une partie seulement, un peu comme pour les matrices : celles habituelles n´ont pas d´influence sur les sprites), tu dois utiliser les params du Begin ; chez moi ça ressemble à :

if ( FAILED(hr = m_pd3dSprite->Begin(D3DXSPRITE_ALPHABLEND)))
{
return DXTRACE_ERR("Begin", hr);
}

pis ensuite les Draw normaux

techslash
techslash
Niveau 8
09 juillet 2004 à 18:10:38

Urgh, merci beaucoup, tu as raison, 1 heure d´essai et erreur avec les renderstates pour finalement toutes les enlever :-p . J´ai un peu de mal à comprendre, j´avais déjà ce paramètre dans Begin ( en plus de D3DXSPRITE_SORT_DEPTH_BACKTOFRONT que j´ai ajouté parce que MSDN parle de sorting de sprite avec transparence). Je pense que le problème venait ou bien d´un begin mal fait ( j´avais p-e utilisé un autre opérateur que | par accident ? ), d´une image qui ne faisait pas l´affaire ( j´ai changé la texture avec laquelle je test pour un mega-man :) ) ou alors du clear du device que j´ai modifié hier et qui ne semblait pas plair au programme ( du garbage en fond d´écran au lieu d´une couleur unie).

Quoiqu´il en soit, merci beaucoup !

J´aurais une nouvelle question, si un programme doit avoir des sprites qui passent l´une devant l´autre ( en 3D on dirait deux valeurs de Z différentes), qu´elle est la méthode propre pour gérée qu´elle image est en avant et quelle est en arrière ? Je pense que c´est une question d´ordre dans lequel les ´draw´ sont fait ? Est-ce que c´est l´utilité des paramètres de sorting ( ex.: D3DXSPRITE_SORT_DEPTH_BACKTOFRONT) ?

Merci encore et encore et toujours :)

lag-it
lag-it
Niveau 10
09 juillet 2004 à 18:58:36

Oui c´est fonction de l´ordre d´apparition des draw.
Donc pour un jeu de plateformes par exemple, commence par afficher les tiles du background, puis les tiles du décors et enfin les " entitées" ( héro, monstres, . .. )

LGV
LGV
Niveau 28
09 juillet 2004 à 19:00:14

t´as beau manipuler des sprites 2D, ce n´est qu´une restriction du monde 3D de D3D, donc tes sprites ONT un positionnement selon l´axe de profondeur.
Le param du begin te permet de trier facilement, donc ça fait exactement ce que tu veux ; si tu peux remplacer par une gestion maison sous forme de layers, c´est encore mieux : tu éviteras de demander à DX de te trier tes polygones en les fournissant toi meme dans l´ordre qui va bien pour ton affichage.
En général, dans un jeu 2D tu vas avoir 1 ou plusieurs plans de background ( pour du scrolling différentiel par exemple), 1 plan de jeu dans lequel évolue le perso, et 1 plan de foreground, pour faire qq petits effets sympas ; vient ensuite l´interface. Donc avec qqch comme 5 layers, tu dois pouvoir facilement gérer l´ordre d´affichage.

LGV
LGV
Niveau 28
09 juillet 2004 à 19:01:11

LOL, c´est fort, avec lag-it on se débrouille tout le temps pour répondre en meme temps on dirait ; )

techslash
techslash
Niveau 8
09 juillet 2004 à 19:16:33

Et bien je n´ai plus de questions ! Merci beaucoup, votre aide ( et votre patience :) ) a été précieuse.

lag-it
lag-it
Niveau 10
09 juillet 2004 à 19:17:49

Ouaip ^^

Sauf que moi c´est les méthodes simples ( bêtes ? ) :-p

techslash
techslash
Niveau 8
18 juillet 2004 à 04:48:43

Hey hey, le vieux topic est de retour :) !

Je viens de me casser les dents sur un problème pour lequel je ne trouve pas de solution.

J´ai une fenêtre 480x480...

HWND hWnd = CreateWindow( " DXFramework", " DXFramework", WS_OVERLAPPEDWINDOW, 100, 100, 480, 480, GetDesktopWindow(), NULL, wc.hInstance, NULL ) ;

Dans laquelle je charge une sprite 480x480...
D3DXCreateTextureFromFileEx(g_pd3dDevice, " background.png", 480, 480, D3DX_DEFAULT, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_ARGB(255,0,255,0), NULL, NULL, &_pd3dTexture)

Et que je dessine...
g_pd3dSprite->Draw(g_pd3dTexture, &, &3DXVECTOR3(0.0f, 0.0f, 0.0f) , &3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DCOLOR_ARGB(255,255,255,255))

Pour une raison que j´ignore, on morceau de l´image est coupé ( à droite). Un peu comme si la caméra avait zoomé, si un scaling avait eu lieu ( parce qu´en changeant les coordonnées de l´image dans le draw, je peux manuellement recentrer le tout). Pourquoi est-ce que je n´ai pas un ratio 1:1 texture/ce qui est affiché par mon programme ? Je ne vois pas ce qui peut causer ça.

Je pense que ça pourrait avoir lien avec le vidage des buffers alors voici la ligne concernée, au cas où...
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 155), 1.0f, 0)

Ça ne vient pas non plus de mon rectangle ( rectTexture) dans le draw...
RECT rectTexture;
rectTexture.bottom = 480;
rectTexture.left = 0;
rectTexture.right = 480;
rectTexture.top = 0;

  • Je sais que c´est une façon un peu longue de remplir un objet, je l´ai fait comme ça pour m´assurer que les données étaient les bonnes.

Merci d´avance !

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment