danke für eure reaktion.
gut zur detailierteren beschreibung kann ich leider wirklich nicht viel mehr sagen, als das funtz nicht...
ich hab mit dieser map mein spielmenü gesteuert. während der initialisierung wurden auf ein und die selbe art und weise vier einträge hinzugefügt:
1."New Game", 2."Help", 3."Quit", 4."Help Text".
Angezeigt wurden aber nur die Einträge "New Game" und "Quit".
Ich bin das ganze im Debugger durchgegangen und in der map waren 4 einträge drin. Aber gerendert wurden die mit 'H' am anfang nicht.
Da map.find wenn es nichts findet das letzte element liefert, aber der "Help Text" auch nicht dargestellt wird kann es daran nicht liegen.
Wenn ich aber die Einträge in "elp" und in "elp Text" umbennene wird das menü vollständig dargestellt.
An der tbFont Klasse, die ich verwende kann es aber auch nicht liegen, denn die Texte die dargestellt werden fangen mit 'H' an, nur der key in der std::map scheint in irgendeiner form probleme mit dem 'H' zu haben.
code is kein prob (bitte nicht erschrecken, hab versucht es so klein wie möglich zu halten):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// so werden die overlays zum overlaymanager hinzugefügt
m_pFont = new tbFont;
if(m_pFont->Init("Data\\IntroFont.tga", "Data\\IntroFont.tbf"))TB_ERROR("Fehler beim Laden von IntroFont.tbf", TB_ERROR);
INSTANCE(COverlayManager).AddText("New Game", m_pFont, tbVector2(0.5f, 0.6f), "Neues Spiel",
TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
//stünde hier
// INSTANCE(COverlayManager).AddText("Help", m_pFont, tbVector2(...), "Hilfe anzeigen",...) würde "Hilfe anzeigen" nicht im Menü stehen.
//mit "elp" wird der Text angezeigt
INSTANCE(COverlayManager).AddText("elp", m_pFont, tbVector2(0.5f, 0.69f), "Hilfe anzeigen",
TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
INSTANCE(COverlayManager).AddText("Quit", m_pFont, tbVector2(0.5f, 0.78f), "Spiel beenden",
TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
// selbes problem auch hier
INSTANCE(COverlayManager).AddText("elp Text", m_pFont, tbVector2(0.7f, 0.6f), "\"Neues Spiel\" drücken!\nEnter zum Verlassen der Hilfe",
TB_FF_RELATIVE | TB_FF_RELATIVESCALING | TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER);
|
dann noch zur funktionsweise des overlay managers:
diese struktur kapselt ein overlay
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
struct S_OVERLAY {
OverlayType otType; // textur oder text
BOOL bEnabled; // anzeigen oder nicht
union {
struct{
// was man so für eine textur braucht
};
struct {
tbFont* fFont;
char* pcText;
// ... noch anderes zeug, das man für tbFont braucht
};
};
};
|
das ist der overlay manager
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
|
class COverlayManager : public CObject, public CSingleton<COverlayManager>
{
public:
// ...
tbResult AddText(std::string name, tbFont *fFont, tbVector2 vPosition, const char* pcText/*...*/);
tbResult EnableOverlay(std::string name, BOOL bEnabled=TRUE);
// ...
protected:
// hier werden die overlays gespeichert
std::map<std::string, S_OVERLAY> m_overlays;
|
Die funktion Enable Overlay
|
C-/C++-Quelltext
|
1
2
3
4
|
tbResult COverlayManager::EnableOverlay (std::string name, BOOL bEnabled) {
m_overlays.find(name)->second.bEnabled = bEnabled;
return TB_OK;
}
|
Die render funktion
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
tbResult COverlayManager::Render (float fTime)
{
std::map<std::string, S_OVERLAY>::iterator itr;
for(itr=m_overlays.begin();itr!=m_overlays.end();itr++) {
if(itr->second.bEnabled) {
switch(itr->second.otType) {
case OT_PICTURE:
// rendere die textur
break;
case OT_TEXT:
tbDirect3D::Instance().SetRS(D3DRS_ZENABLE, D3DZB_FALSE);
itr->second.fFont->Begin();
itr->second.fFont->DrawText(itr->second.vPosition,
itr->second.pcText/*...*/);
itr->second.fFont->End();
break;
default:
TB_ERROR("Nicht definiertes Overlay!", TB_ERROR);
break;
};
}
}
return TB_OK;
}
|
im menü erfolgt ein einfacher aufruf von enable overlay:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
// vereinfachte version
INSTANCE(COverlayManager).EnableOverlay("New Game", TRUE);
INSTANCE(COverlayManager).EnableOverlay("elp", TRUE);
INSTANCE(COverlayManager).EnableOverlay("Quit", TRUE);
// keine panik, das FALSE ist absicht, der Hilfe Text soll erst angezeigt werden, wenn benötigt.
INSTANCE(COverlayManager).EnableOverlay("elp Text", FALSE);
|
ich hoffe diese beschreibung ist verständlicher. hab versucht den code weitestgehend auf das minimum zu beschränken.
vielen dank im voraus..