Bonjour,
Je suis en Win32 et DirectX.
J'affiche un texte avec :
DrawText(NULL, sText.c_str(), -1, &rct, _iCentered, fontColor );
Comment puis je l'effacer pour réécrire par dessus ?
Merci pour votre aide
Bonjour,
Je suis en Win32 et DirectX.
J'affiche un texte avec :
DrawText(NULL, sText.c_str(), -1, &rct, _iCentered, fontColor );
Comment puis je l'effacer pour réécrire par dessus ?
Merci pour votre aide
Bonjour.
J'imagine que tu utilises un ID3DXFont.
Donc un release puis un re-D3DXCreateFont...
Sinon, si ce n'est que le texte changes la string : DrawText(NULL, NewsText.c_str(), -1, &rct, _iCentered, fontColor );
Open Source Microsoft MediaFoundation
https://github.com/mofo7777
http://jeux.developpez.com/faq/directx/?page=dshow
Bonjour,
Un nouveau DrawText réécrit par dessus mais n'efface pas le texte précédent
Bonjour.
Cela sous-entends que tu n'effaces pas le backbuffer de DirectX ?
Open Source Microsoft MediaFoundation
https://github.com/mofo7777
http://jeux.developpez.com/faq/directx/?page=dshow
Bonjour,
Non, il n'est pas effacé.
A mon avis, il faut faire une copie du front buffer dans une surface et copier le rectangle sous le texte de cette surface dans une surface de sauvegarde.
Puis restituer cette surface de sauvegarde vers le front buffer.
Qu'en penses tu ?
Bonjour.
Désolé mais je ne comprends pas le fonctionnement de ton programme.
Sous DirectX, il me semble, ça se passe souvent comme cela :
-> j'efface le backbuffer.
-> je redessine mes objets (texte, mesh-3d, etc...)
-> je swap le tout -> ça devient le frontbuffer
-> je présente le frontbuffer (affichage sur l'écran).
-> je recommence...
Certes, pour optimiser, tu peux effacer une partie précise du backbuffer et redessiner le texte à cet endroit... Mais je ne sais pas en quoi consiste exactement ton programme.
Open Source Microsoft MediaFoundation
https://github.com/mofo7777
http://jeux.developpez.com/faq/directx/?page=dshow
Oui je suis d'accord, on peut effacer le backbuffer en entier mais je souhaitais seulement effacer sous mon texte pour le changer
Voici mon code :
/********************************************************************
* Render_Background *
* Writes the background bitmap to the display *
* ******************************************************************/
void dxManager::Render_Background(string BackgroundFileName)
{
IDirect3DSurface9* _bkgrd = getSurfaceFromBitmap(format_Bitmap(BackgroundFileName));
IDirect3DSurface9* backbuffer;
pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);
HRESULT hResult = pd3dDevice->StretchRect(_bkgrd, NULL, backbuffer, NULL, D3DTEXF_NONE);
// Creates an image surface matching the screen
pd3dDevice->CreateOffscreenPlainSurface(945,1680,D3DFMT_A8R8G8B8,D3DPOOL_SYSTEMMEM,&backbuffer_mem,NULL);
// Saves the back buffer to the back buffer backup
hResult = pd3dDevice->StretchRect(backbuffer,NULL,backbuffer_mem,NULL,D3DTEXF_NONE);
// Present the backbuffer contents to the display (front buffer)
pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
/*******************************************************************
* Render_Text *
* Renders the text from the top left coordinates _X,_Y *
* The text may be centered or not *
* We suggest to have _X = 0 for centered message *
********************************************************************/
void dxManager::Render_Text(int _X,int _Y,int _iMsgType,bool _bCentered,int _ID_Msg)
{
LPD3DXFONT m_font;
LONG rct_width;
string sText = get_translation(_ID_Msg);
// Creates a D3DX font object
D3DXCreateFont( pd3dDevice, pMessageStyle[_iMsgType]->Get_FontSize(), 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
pMessageStyle[_iMsgType]->Get_FontName(), &m_font );
// Creates a colour for the text
D3DCOLOR fontColor = pMessageStyle[_iMsgType]->Get_MessageColor();
// Creates a rectangle to indicate where on the screen it should be drawn
RECT rct;
rct.left = _X;
if (_bCentered)
rct.left = 0;
rct.top = _Y;
// Calculates the rectangle size
m_font->DrawText(NULL, sText.c_str(), -1, &rct, DT_CALCRECT, fontColor );
if (_bCentered)
{
// Tested on 01/21/10 for many fonts
rct_width = rct.right-rct.left;
rct.left = (My_Turn_For_You.Get_Height()-rct_width)/2;
rct.right = rct.left + rct_width;
};
// Creates the object within the message class
pMessage.push_back(new CMessage(_X,_Y,rct,_ID_Msg));
++ Nb_Messages;
// Draws text
m_font->DrawText(NULL, sText.c_str(), -1, &rct, 0, fontColor );
}
/****************************************************************************
* Delete_Text *
* Deletes the text from the top left coordinates _X,_Y *
* _X,_Y must have the same values than the ones used for rendering the text *
*****************************************************************************/
void dxManager:elete_Text(int _X,int _Y,int _ID_Msg)
{
// Searches for rectangle index coming with this message
int i = 0;
bool loop = true;
//POINT TLPoint;
RECT TLRect;
IDirect3DSurface9* backbuffer;
pd3dDevice->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO, &backbuffer);
while (loop)
{
if ((pMessage[i]->Get_XMessage()==_X) &&
(pMessage[i]->Get_YMessage()==_Y) &&
(pMessage[i]->Get_IDMessage()==_ID_Msg))
{
loop = false;
}
else
++i;
}
TLRect = pMessage[i]->Get_RectMessage();
pd3dDevice->StretchRect(backbuffer_mem,&TLRect,backbuffer,&TLRect,D3DTEXF_NONE);
// Present the backbuffer contents to the display
pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
Explications :
La première méthode affiche l'image de fond d'écran. Elle mémorise de plus le backbuffer dans backbuffer_mem.
La deuxième affiche un texte à un endroit précis et mémorise les coordonnées du rectangle utilisé pour l'affichage du texte ainsi que le numéro du message
La troisième est censée effacer le texte en retrouvant le rectangle associé et restituant backbuffer_mem dans ce rectangle.
Génial non ?
Mais cela ne fonctionne pas ...
Why ?
j'ai appuyé sur # pour mettre en valeur le code mais cela ne fonctionne pas apparemment
Bon je progresse :
J'ai remplacé D3DPOOL_SYSTEMMEM par D3DPOOL_DEFAULT et le texte est bien effacé.
Par contre, le fond d'écran n'est pas restitué, j'ai un rectangle noir
Bon, j'ai trouvé :
L'erreur vient que je mélange offscreen surface et backbuffer dans la ligne :
hResult = pd3dDevice->StretchRect(backbuffer,NULL,backbuffer_mem,NULL,D3DTEXF_NONE);
Il suffit donc de remplacer backbuffer par _bkgrd ...
Et cela fonctionne parfaitement
Partager