Salut tout le monde !
Je poste ici plutot que dans " J´aide les personne en C/C++"
Probleme de passage de directX8 a directX9 :
Dans un tutorial ( http://www.andypike.com/tutorials/directx8/ ) , il y a une fonction qui permet de recuperer des information sur le mode d´affichage afin de creer le backbuffer. Mon probleme vien du fait que les parametre sont plus les meme sur Dx8 que sur Dx9. J´ai pas mal galerer pour finalement en plein desespoir ariver a une solution bourin en atendant de pouvoir demander de l´aide.
Je suis passe de cette fonction :
D3DFORMAT CGame::CheckDisplayMode(UINT nWidth, UINT nHeight, UINT nDepth){
UINT x;
D3DDISPLAYMODE d3ddm;
D3DFORMAT
format=m_pD3D->EnumAdapterModes(D3DADAPTER_DEFAULT
, D3DFMT_X8R8G8B8
for(x = 0; x < m_pD3D->GetAdapterModeCount(0); x++)
{
m_pD3D->EnumAdapterModes(0, x, &3ddm);
if(d3ddm.Width == nWidth)
{
if(d3ddm.Height == nHeight)
{
if((d3ddm.Format == D3DFMT_R5G6B5) ||
( d3ddm.Format == D3DFMT_X1R5G5B5) ||
( d3ddm.Format == D3DFMT_X4R4G4B4))
{
if(nDepth == 16)
{
return d3ddm.Format;
}
}
else if((d3ddm.Format == D3DFMT_R8G8B8) ||
( d3ddm.Format == D3DFMT_X8R8G8B8))
{
if(nDepth == 32)
{
return d3ddm.Format;
}
}
}
}
}
return D3DFMT_UNKNOWN;
}
a celle la :
D3DFORMAT CGame::CheckDisplayMode(UINT nWidth, UINT nHeight, UINT nDepth){
return D3DFMT_X8R8G8B8;
}
BEUUUURKK !
Si quelqu´un peu m´aider, ce serai simpa
Autre probleme : Je bosse sur . net chez moi, mais j´ai visual 6 au boulot : comment je peut creer un workspace pour le 6 a partir des fichier du 7 ( fichier . vcproj et . sln) ?
( desole pour l´ecriture : je suis en ecosse avec un clavier qwerty...)
Personne ?
Si tu as le SDK de DX9, un paquet d´exemples montrent comment faire...
T´as compris Altonfrere !
Va bouffer tes ongles d´orteils tout seul dans ton coin mdr!!!!
Bonne chance !
sinon, solution pratique, tu peux utiliser le code genere par le wizard DirectX, ca marche TRES bien pour ces trucs qui sont plutot chiants a faire...
Arg... je suis pas asez souple pour boufer mes ongles d´orteils
Le wizard fait une base directX a sa sauce. Je m´inspire d´une base sur le net pour creer la mienne, pour justement eviter d´avoir a faire les trucs chiant quand j´utiliserai ma base.
M´enfin, je vais essayer de me demerder tout seul.
La prochaine fois, je demanderai comment faire un jeu avec RPGmaker, j´aurai plus de reponses...
. .. dans le SDK y´a des dizaines d´exemples qui font ce que tu veux, et le code du wizard est beaucoup plus complet que ce que bcp ont la volonte de pondre ( parce des milliers de lignes pour tester les CAPS c´est chiant...).
pour les questions de " base" dsl mais on renvoit toujours a la doc... pour les choses plus fines, la on peut aider ( comme je ne sais plus qui avec ses ID3DXSprite il y a peu)
Je me heurte a un nouveau probleme. ( je suis un gros noob de DirectX
)
La perte du device lorsque l´on fait alt tab :
avec m_pD3DDevice->TestCooperativeLevel() je verifie l´etat des devices.
Pour l´instant je fait un gros clean up general puis je recreer les objets... se qui me ramene au demarage de l´aplication!
Donc je me demande : qu´est ce qui est perdu lors de la perte du device, que faut-il netoyer et que faut-il reinitialier ?
Salut a tous, Je travaille avec Ruffi actuellement. On a reussit a resoudre un petit peu ce probleme mais de maniere pas tres conventionnelle on va dire.
Voici le code que l´on a mis a l´interieur de la fonction render()
/ /Test de l´etat du Device
HRESULT s;
s = m_pD3DDevice->TestCooperativeLevel();
if ( FAILED(s))
{
if ( s == D3DERR_DEVICELOST)
{
/ / Focus perdu par exemple
return false;
}
if ( s == D3DERR_DEVICENOTRESET)
{
/ /l´application recupere le Focus
ReleaseObjects();
/ /Desallocation mais de quoi exactement ? ??
if
(FAILED(m_pD3DDevice->Reset(d3dPresent_Parameters)
;
/ /La ca plante bien bien quand on essaye de faire le Reset
{return false;}
Init(); / /Reinitialisation du Device
}
}
Bon voila ce qu´on a code, si on commente le m_pD3DDevice->Reset(d3dPresent_Parameters); ben ca marche...
sachant que dans ReleaseObjects() on libere les deux variables LPDIRECT3D9 et LPDIRECT3DDEVICE9(m_pD3DDevice).
Voila, j´aimerai bien comprendre pourquoi le Reset du d3dPresent_parameters plante, a moins que quelqu´un ai une autre methode?
Merki !
)
Pour plus de precision ( il va devenir complique ce topic) :
ReleaseObjects() est la fonction qui nous sert a tout effacer a la sortie du programme
Init() est la fonction qui nous sert a tout initialiser au debut du programme ( pas bon car sa nous remet la plupar des donnes memberes a leurs etats initialles)
Voila ![]()
dans un premier temps tu peux la jouer barbare en recreant TOUT a chaque perte du device ( les surfaces, les vertex/index buffer, les shaders, les meshes, etc.) ; apres, on peut jouer plus fin en faisant comme dans le code genere par le SDK, cad un init unique, deux methodes de creation/destruction des objets ( utilise a chaque perte du device), et un clean up unique. Dans l´idee, ca doit etre symetrique par paire : ce qu´on init qu´une seule fois, on le clean qu´une seule fois, et ce qu´on cree a chaque perte on le supprime de la meme maniere.
C´est assez fin de savoir ce qui survir ou ce qui ne survit pas ( les textures peuvent survire, selon leur mode de creation par exemple) donc dans l´immedait la premiere solution, ca n´a pas d´influence sur les perfs du programme ( c´est juste un peu plus long de recharger quand tu alt+tab par ex.)
Le probleme en detruisant tout est la perte des donnes membre ( par exemple les coordones d´un objet)
Un solution serai de faire une methode de destruction et reconstructions specifique a chaque objet qui detruirait que les choses necessaire ( les surfaces, les vertex/index buffer, les shaders, les meshes, etc) mais pas les donnes membres.
Mais si tu a une autre solution, je suis preneur ![]()
LGV
Ben actuellement on fait la methode Barbare dont tu parle, c´est a dire que tout les objets sont recrees, pour un cube ca va, le Alt-Tab se fait vite, mais au plus tu surcharge ta scene et au plus ca met de temps pour revenir a l´affichage.
Mais peut etre qu´en reinitialisant seulement les Devices sant toucher aux Buffers ca peut marcher. ( L´application garde le meme Handle peut importe qu´elle soit en arriere plan ou en premier plan non?)
P.S. Je ne suis pas retissant avec les accents, c´est juste que sur un clavier qwerty, y´en a pas. Desole ![]()
pareil, clavier qwerty... ; )
bon, detruire/recreer vos objets, c´est BCP trop couteux, c´est clair ; comme Ruffi propose, il faut une paire de methode pour chaque objet lie a directX, qui ont pour but de releaser et d´initer les elements ayant besoin du device.
Mais ca, c´est ENCORE la methode barbare, car certains objets objets crees avec le device peuvent survivre a une perte de ce dernier... Mais deja, commencer par rajouter deux methodes a vos objets, pour ne pas les detruire mais reiniter les membres lies a DX devrait bcp faire gagner en temps de rechargement
Merci, on va voir ca. ![]()
Pour ceux que ca interesse, directX 9.0c est sorti, ainsi que son SDK :
http://www.microsoft.com/downloads/details.aspx?FamilyID=fd044a42-9912-42a3-9a9e-d857199f888e&DisplayLang=en
LGV : quand tu programme en directX, tu part de la base cree par visual ou tu t´es fait la tienne ?
Encore une chose : DirectMusic permet elle de lire les fichier mp3 ?
Sur tous les exemples du sdk, elle lit que les midi et les waves ![]()
En fait, on a plein de question. Si quelqu´un peu nous aider : http://membres.lycos.fr/brugevinboris/viewtopic.php?t=652
merci ![]()
pour les mp3 tu peux passer par DirectShow . .. ca serait trop long à expliquer mais renseigne toi sur ces interfaces : IGraphBuilder, IMediaControl, IMediaEventEx, IBasicAudio, IMediaSeeking
En attendant que LGV te réponde, le mieux pour débuter est de te servir des exemples et de faire ta sauce. Plus tard ( une fois que tu auras vu un peu tous les principaux problèmes que l´on peut rencontrer) tu seras capable de créer tes propres librairies, dll, environnement de développement pour DirectX.