d3d hook, texte einblenden

02/22/2009 14:03 __wadim#1
ich benutze den basehook von azorbix 3.0b mit dem ich in guild wars nun einen text einblenden möchte. es funktioniert, nur leider noch nicht so wie ich es haben möchte.

hier mein font (ID3DXFont *dFont):
Code:
	if(!fontCreated){
		D3DXCreateFont( m_pD3Ddev, 16, 0, FW_BOLD, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial Black", &dFont);
	}
und die funktion:
Code:
void _DrawText( char pString[], int x, int y, D3DCOLOR col)
{
	RECT FontRect = { x, y, x+120, y+16 };
	dFont->DrawTextA(NULL, pString, -1, &FontRect, DT_LEFT, col);
}
dann ruf ich das in der endscene auf:
_DrawText("123", 5, 5, greent);

ich weiss nicht genau wo ich font erstellen soll.

also nun zum eigentlichen problem. der text wird mir im spiel angezeigt, wenn ich aber jetzt in ein gebiet reise, sehe ich nur den ladebildschirm der nicht mehr weggeht. was mach ich falsch?
02/22/2009 14:26 Atheuz#2
Quote:
Originally Posted by __wadim View Post
ich benutze den basehook von azorbix 3.0b mit dem ich in guild wars nun einen text einblenden möchte. es funktioniert, nur leider noch nicht so wie ich es haben möchte.

hier mein font (ID3DXFont *dFont):
Code:
	if(!fontCreated){
		D3DXCreateFont( m_pD3Ddev, 16, 0, FW_BOLD, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial Black", &dFont);
	}
und die funktion:
Code:
void _DrawText( char pString[], int x, int y, D3DCOLOR col)
{
	RECT FontRect = { x, y, x+120, y+16 };
	dFont->DrawTextA(NULL, pString, -1, &FontRect, DT_LEFT, col);
}
dann ruf ich das in der endscene auf:
_DrawText("123", 5, 5, greent);

ich weiss nicht genau wo ich font erstellen soll.

also nun zum eigentlichen problem. der text wird mir im spiel angezeigt, wenn ich aber jetzt in ein gebiet reise, sehe ich nur den ladebildschirm der nicht mehr weggeht. was mach ich falsch?
tatnium log aufmachen und schauen ob Reset aufgerufen wird, wenn ja dann die Font auch in Reset löschen & initiliasieren. Oder in welcher Funktion rufst du überhaupt den ersten Codeschnippsel auf?
02/22/2009 14:50 __wadim#3
Quote:
Direct3DCreate9(32) succeeded...
Hooked Direct3D9 interface: 0x159da0 -> 0x21a24d8
Direct3DCreate9(32) succeeded...
Hooked Direct3D9 interface: 0x17e100 -> 0x21a2510
Hooked Direct3D9 device: 0x17fc20 -> 0x21a2548
ich weis nicht wo ich font erstellen soll, ich habs in beginscene.
02/22/2009 15:07 Atheuz#4
Quote:
Originally Posted by __wadim View Post
ich weis nicht wo ich font erstellen soll, ich habs in beginscene.
Ich würde dir empfehlen erstmal über DirectX sich schlau zu machen, Ich meins damit nicht böse. Oder du besorgst dir eine gut dokumentierte font Klasse.

Normalerweise Initialisiert du ein Fontobjekt während Initialize().
Dann während PreReset löscht du es z.B mit Invalidate() und nach
dem PreReset folgt PostReset (Alternativ bietet sich auch Release an) und dort einfach wieder durch deine Initialize Funktion erstellen lassen.

Beispiel:

Initialize
---
fontobject.Initialize();


PreReset
---
fontobject.Invalidate();


PostReset
---
fontobject.Initialize();
02/22/2009 19:11 __wadim#5
danke @atheuz, funktioniert bestens!

für die die das selbe problem haben(eigentlich kein problem, sondern nur mein unwissen :P)

Code:
//globals
LPD3DXFONT oFont;
bool bCreateFont = true;

void _DrawText( char pString[], int x, int y, D3DCOLOR col )
{
	RECT FontRect = { x, y, x+120, y+16 };
	oFont->DrawText( NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}
Initialize()
Code:
  if(bCreateFont == true)
  {
    bCreateFont = false;
	D3DXCreateFont( m_pD3Ddev, 16, 0, FW_BOLD, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial Black", &oFont);
  }
Reset
Code:
  if(oFont)
  oFont->OnLostDevice();

	HRESULT hRet = m_pD3Ddev->Reset(pPresentationParameters);

  if(oFont)
  oFont->OnLostDevice();
gute hilfe habe ich [Only registered and activated users can see links. Click Here To Register...] gefunden.

kann geschlossen werden!