Hallo,
ich weiß jetzt nicht, ob das zur Spieleprogrammierung oder direkt zum Buch gehört, denn es bezieht sich ja auf die Engine...
Seid mir bitte nich böse, wenn ihr den Thread verschieben müsst.
Also, mein Problem:
Ach ja, ich muss vielleicht erst dazu sagen, dass ich den Bug, den man im "Das Buch"-FAQ-Forum findet, schon behoben habe.
Also, es ist so:
Für ein Helikopterspiel habe ich 5 verschiedene "Modelle" (2D eben
![;)](wcf/images/smilies/wink.png.pagespeed.ce.L9LRa_F2a5.png)
) auf einer Textur. Ich kann dann auch im Spiel mehrere Helikopter mit dieser Textur zeichnen, das klappt alles super.
Nun möchte ich im "Konfigurationsdialog" (mit tbGUI erstellt), der vor dem Laufen des Spiels die Auswahl von Waffen, Tasten, Levels und so weiter gibt. Der Dialog wird von der Spielklasse angezeigt, ebenso wie das laufende Spiel.
Das bedeutet dann auch, dass ich der tbGUI::CreateImage als Textur den selben Pointer übergebe, den ich auch zum Textur-Setzen beim Rendern der Helikopter benutze, und die demnach auch erfolgreich geladen wurde.
Sobald ich aber nun mit tbGUI::CreateImage das Bild erzeuge, werden sowohl anstatt des Bildes, als auch anstatt der Helikopter nur noch weiße Vierecke abgebildet.
Dass diese Vierecke die Vertizes sind, auf denen die Textur liegen sollte, ist dadurch klar ersichtlich, dass ich ja die Vertexfarben verändern kann, und so klar sehe, dass die Textur schlicht fehlt.
Ich hab mir auch den Code in der Engine ein paar mal angeschaut und bin einfach nicht schlauer geworden... könnt ihr mir vielleicht helfen?
Das Laden der Textur (muss wohl erfolgreich sein. Es ist ja vom tbGUIImage erst mal unberührt):
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
|
m_pHeliTex = tbTextureManager::GetTexture("Data\\Helicopters.bmp",
TRUE,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DX_DEFAULT,
D3DFMT_UNKNOWN,
0,
D3DPOOL_MANAGED,
D3DX_DEFAULT,
D3DX_DEFAULT,
0x00FF00FF);
if(m_pHeliTex == NULL) TB_ERROR("Fehler beim Laden von Data\\Helicopters.bmp!", TB_ERROR);
|
Danach kommt das ganze GUI-Skin Zeug usw... das funzt ja.
Dann, nach vielen CreateFrames und CreateButtons...
|
Quellcode
|
1
|
m_pGUI->CreateImage ( GUI_OPTIONS_IMAGE_PLAYER1, GUI_PAGE_OPTIONS, tbVector2(114.0f, 85.0f), tbVector2(256.0f, 128.0f), m_pHeliTex);
|
nach ein paar weiteren Frames und Buttons für PAGE 2 folgt dann das TB_OK;.
Die tbGUIImage::ReceiveImage sieht jetzt so aus:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
tbGUIVertex aVertex[4];
switch(pMsg->Type)
{
case TB_GMT_RENDER:
// Wenn das Element unsichtbar ist, wird es nicht gerendert.
if(!m_bVisible) break;
if(pMsg->aiInt[0] == 2)
{
// Bild zeichnen
m_pGUI->AddRect(m_vPosition * m_pGUI->m_vScaling, m_vSize * m_pGUI->m_vScaling,
m_Color, m_vTopLeftTex, m_vBottomRightTex - m_vTopLeftTex,
aVertex);
tbDirect3D::SetTexture(0, m_pTexture);
// Vertexformat und Render-States
tbDirect3D::SetFVF(TB_GUI_FVF);
tbDirect3D::SetRS(D3DRS_ZENABLE, FALSE);
tbDirect3D::SetRS(D3DRS_ZWRITEENABLE, FALSE);
tbDirect3D::SetRS(D3DRS_COLORVERTEX, TRUE);
tbDirect3D::SetRS(D3DRS_ALPHABLENDENABLE, TRUE);
tbDirect3D::SetRS(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
tbDirect3D::SetRS(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
tbDirect3D::SetTSS(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
tbDirect3D::SetTSS(0, D3DTSS_COLORARG1, D3DTA_CURRENT);
tbDirect3D::SetTSS(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);
tbDirect3D::SetTSS(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
tbDirect3D::SetTSS(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
tbDirect3D::SetTSS(0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
// Dreiecke zeichnen
tbDirect3D::GetDevice()->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, aVertex,
sizeof(tbGUIVertex));
}
break;
}
return TB_OK;
|
Auch hier hab ich nichts gefunden, was nicht dem im FAQ-Forum entspricht.
Die Heli-Render-Methode braucht ihr nicht, oder? Denn das funktioniert ja wunderbar, sobald ich nur die oben gepostete Zeile m_pGUI->CreateImage (...); auskommentiere.
Danke schonmal für eure Hilfe