Hallo ich bin neu in der Welt der Spieleprogrammierung bzw. DirectX
Somit alles was ich nun schreibe mit Vorsicht genießen
Ich benutze Microsoft Visual C++ 2005 Prof. und wollte die TriBase Engine kompilieren mit dem "uralt" SDK gibt es keine Probleme jedoch mit dem aktuellen "DirectX SDK (August 2007)" habe ich die selben Probleme wie von Anderen beschrieben:
|
Quellcode
|
1
|
FEHLER: Der Aufruf von D3DXCreateEffect verursachte den DirectX-Fehler E_FAIL! Beschreibung: An undetermined error occurred (tbeffect.cpp, Zeile 62, Funktion tbEffect::Init)
|
Das Problem tritt bei folgenden Projekten auf:
- /Beispiele/Kapitel 03/03 - Texte
- /Spiele/Buch/Breakanoid
- /Spiele/Buch/Galactica
Wie Andere schon festgestellt haben wird der Fehler durch "D3DXCreateEffect" ausgelöst.
Somit habe ich erstmal folgende Modifikation gemacht, damit die Compiler\Interpreter Fehler, bei der Debug Version,
in das Log geschrieben werden.
Ein externes Tool zum Syntax Check der FX Scripts wäre praktisch jedoch habe ich so etwas nicht im SDK gefunden.
|
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// Erstellen aus einem String
tbResult tbEffect::Init(char* pcCode,
int iSize)
{
HRESULT hResult;
// Die Klasseninstanz zurücksetzen.
// Damit wird ermöglicht, dass der Init-Aufruf mehrere Male mit
// derselben Instanz funktioniert.
Exit();
// Parameter prüfen und sicherstellen, dass Direct3D initialisiert wurde
if(!pcCode) TB_ERROR_NULL_POINTER("pcCode", TB_ERROR);
if(iSize == 0 || iSize < -1) TB_ERROR_INVALID_VALUE("iSize", TB_ERROR);
if(!tbDirect3D::IsInitialized()) TB_ERROR("Direct3D wurde noch nicht initialisiert!", TB_ERROR);
// Länge anpassen
if(iSize == -1) iSize = strlen(pcCode);
//Debug Log
#ifdef _DEBUG
LPD3DXBUFFER ppCompilationErrors = NULL;
// Jetzt den Effekt erstellen
if(FAILED(hResult = D3DXCreateEffect(tbDirect3D::Instance().GetDevice(),
pcCode, iSize, NULL, NULL, 0,
tb_g_pEffectPool, &m_pEffect, &ppCompilationErrors)))
{
// Fehler!
TB_ERROR_MESSAGE(ppCompilationErrors->GetBufferPointer());
TB_SAFE_RELEASE(ppCompilationErrors);
TB_ERROR_DIRECTX("D3DXCreateEffect", hResult, TB_ERROR);
}
else TB_SAFE_RELEASE(ppCompilationErrors);
//Release Log
#else
// Jetzt den Effekt erstellen
if(FAILED(hResult = D3DXCreateEffect(tbDirect3D::Instance().GetDevice(),
pcCode, iSize, NULL, NULL, 0,
tb_g_pEffectPool, &m_pEffect, NULL)))
{
// Fehler!
TB_ERROR_DIRECTX("D3DXCreateEffect", hResult, TB_ERROR);
}
#endif
// Effektbeschreibung abfragen
m_pEffect->GetDesc(&m_Desc);
// Die erste gültige Technik setzen
SetTechnique(-1);
return TB_OK;
}
|
Mit dieser Modifikation findet man recht schnell heraus, dass das Problem darin liegt, dass
die Script Engine nicht damit klar kommt wenn Variablen so heißen wie ihr Typ und das ist eben der Fall
bei der "tbFont" Initialisierung (TEXTURE Texture):
tbFont.cpp:
|
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
|
if(m_pEffect->Init("TEXTURE Texture;\n"
"\n"
"TECHNIQUE T1\n"
"{\n"
" PASS P1\n"
" {\n"
" Texture[0] = <Texture>;\n"
" ZEnable = False;\n"
" ZWriteEnable = False;\n"
" ColorOp[0] = Modulate;\n"
" ColorArg1[0] = Texture;\n"
" ColorArg2[0] = Current;\n"
" ColorOp[1] = Disable;\n"
" AlphaOp[0] = Modulate;\n"
" AlphaArg1[0] = Texture;\n"
" AlphaArg2[0] = Current;\n"
" AlphaOp[1] = Disable;\n"
" AlphaBlendEnable = True;\n"
" SrcBlend = SrcAlpha;\n"
" DestBlend = InvSrcAlpha;\n"
" }\n"
"}\n", -1))
|
also einfach zu folgendem ändern:
|
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
25
26
27
28
29
30
|
if(m_pEffect->Init("TEXTURE Texture1;\n"
"\n"
"TECHNIQUE T1\n"
"{\n"
" PASS P1\n"
" {\n"
" Texture[0] = <Texture1>;\n"
" ZEnable = False;\n"
" ZWriteEnable = False;\n"
" ColorOp[0] = Modulate;\n"
" ColorArg1[0] = Texture;\n"
" ColorArg2[0] = Current;\n"
" ColorOp[1] = Disable;\n"
" AlphaOp[0] = Modulate;\n"
" AlphaArg1[0] = Texture;\n"
" AlphaArg2[0] = Current;\n"
" AlphaOp[1] = Disable;\n"
" AlphaBlendEnable = True;\n"
" SrcBlend = SrcAlpha;\n"
" DestBlend = InvSrcAlpha;\n"
" }\n"
"}\n", -1))
Zusätzlich muss man noch Folgende zwei Zeilen anpassen:
// Textur setzen
m_pEffect->GetEffect()->SetTexture("Texture1", m_pTexture);
// Textur aus dem Effekt nehmen
if(m_pEffect) m_pEffect->GetEffect()->SetTexture("Texture1", NULL);
|
Mit diesen Veränderungen neu kompilieren und das
"/Beispiele/Kapitel 03/03 - Texte" Projekt geht schon mal einwandfrei.
"Breakanoid" & "Galactica" starten nun immerhin spucken dann aber später bei den anderen Skripts Fehler aus und beenden sich
Bei Galactica muss man bei der Sprites.fx und Gui.fx so verfahren wie bei tbFont sprich "Texture" wird zu "Texture1"
und jeweils die beiden SetTexture() Aufrufe anpassen.
Das ist leider noch nicht alles, da in den TBM Files weitere FX Scripts sind die scheinbar zu ähnlichen Problemen führen.
Damit werde ich mich die Tage beschäftigen und sofern ich was hin bekomme ein Listing posten was man nun alles verändern muss um die TriBase Engine mit "DirectX SDK (August 2007)" zu nutzen bzw. die Spiele zu spielen.
Vielleicht hat ja noch jemand anderes Lust ein wenig zu suchen
Hoffe ich konnte vielleicht dem ein oder anderen damit helfen.
Das Buch ist jedenfalls sehr sehr gut geschrieben
Update\Edit:
Okay wer lesen bzw. suchen kann ist klar im Vorteil :roll:
wie schon in einem anderen Thread geschrieben besteht das einzige weitere Problem darin dass aus STRING nun string wurde.
Sprich entweder alle TBM files mit dem "ModelConverter" editieren -> ca. 1 Stunde Zeitaufwand oder einfach mit einem Hex-Editor wie hex workshop Search&Replace bei allen TBM files. -> 5 min Zeitaufwand. Danach funktioniert "Breakanoid" und "Galactica" ohne Probleme auch mit dem neusten SDK.
Immerhin ist die Wahrscheinlichkeit nun doppelt so groß das jemand die Lösung für dieses problem findet
Blacklotus :lol: