Aktualisierte Projekte, die mit Visual C++ 2010 und dem neusten DirectX-SDK funktionieren - siehe hier:
Software-Update: Alle Projekte aus dem Buch "3D-Spieleprogrammierung" für Visual C++ 2010 & neues DirectX-SDK
-------------------------------------------------------
(ALTER BEITRAG - NICHT WICHTIG!)
Hallo,
wie Ihr ja wisst, gibt es Probleme, die Engine und die anderen Projekte mit Visual C++ 2005 Express zu kompilieren.
Nach einem halben Tag Arbeit habe ich es jetzt geschafft, alles ans Laufen zu kriegen. Es gibt keinerlei Probleme mehr.
------------------------------
1. Zu allererst benötigt Ihr das
Platform-SDK:
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ (Weiterleitung)
Installiert es. Es werden nicht alle Komponenten benötigt. Am wichtigsten sind die Core- und die DirectShow-Komponente. Die Dokumentation kann natürlich auch nicht schaden, das Herunterladen dauert aber lange.
Wenn das Platform-SDK installiert ist, müsst Ihr folgende Verzeichnisse in Visual C++ 2005 Express eintragen (ich gehe hier davon aus, dass das Platform-SDK nach "C:\Dev\Platform SDK" installiert wurde):
- (
Include): C:\Dev\Platform SDK\Include
- (
Include): C:\Dev\Platform SDK\Include\MFC (für afxres.h)
- (
Library): C:\Dev\Platform SDK\Lib
Natürlich müssen auch die folgenden Pfade angegeben werden:
- (
Include): C:\Dev\Buch\TriBase\Include
- (
Library): C:\Dev\Buch\TriBase\Lib
- (
Include): C:\Dev\DirectX SDK\Include
- (
Library): C:\Dev\DirectX SDK\Lib(\X86) - je nach SDK-Version
------------------------------
2. Nun sollten alle schon vorhandenen Binärdaten im TriBase-Ordner gelöscht werden. Das sind die LIB-Dateien, die DLLs und die EXEs. Aber eine LIB muss erhalten bleiben, nämlich die "StrmIIDs.lib".
------------------------------
3. Jetzt solltet Ihr versuchen, die DirectShow-Base-Classes neu zu kompilieren (werden von der Engine benötigt). Dazu importiert Ihr einfach das Projekt "baseclasses.sln" (es befindet sich in "TriBase\Include\DShowBaseClasses") in Visual C++ 2005 Express.
Im importierten Projekt (das gilt für ALLE in der 2005er-Version importierten Projekte) müssen erst einmal die hinzugelinkten Libraries geändert werden:
- (
entfernen): odbc32.lib odbccp32.lib (das sind die beiden letzten)
- (
hinzufügen): kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
Beim Kompilieren wird es einige Fehler und Warnungen geben.
Die Warnungen beziehen sich auf die alten unsicheren Funktionen wie strcpy. Wer mag, ersetzt sie durch die Neuen. Anderenfalls kann man das Makro _CRT_SECURE_NO_DEPRECATE setzen (am besten ganz oben in der jeweiligen Datei) und mit #pragma warning(disable:4995 4996) diese Warnungen ignorieren.
Die Fehler sind hauptsächlich solche, wo eine Zählvariable einer for-Schleife außerhalb dieser Schleife noch einmal verwendet wurde. Es reicht, sie einfach noch einmal zu deklarieren. Also aus
|
C-/C++-Quelltext
|
1
2
|
for(int i = 0; i < 100; i++) ...
for(i = 10; i < 200; i++) ...
|
wird
|
C-/C++-Quelltext
|
1
2
|
for(int i = 0; i < 100; i++) ...
for(int i = 10; i < 200; i++) ...
|
An manchen Stellen wird auch nach der Schleife noch einmal auf die Zählvariable zugegriffen. Dann muss man die Zählvariable außerhalb der Schleife deklarieren. Also aus
|
C-/C++-Quelltext
|
1
2
|
for(int i = 0; i < 1000; i++) ...
if(i == 1000) ...
|
wird
|
C-/C++-Quelltext
|
1
2
3
|
int i;
for(i = 0; i < 1000; i++) ... // Wichtig: Hier das "int" wegnehmen!
if(i == 1000) ...
|
Dann gibt es noch einen weiteren Fehler bei den Base-Classes, und zwar in der Datei "ctlutil.h". Die Zeile, wo der Fehler liegt:
|
C-/C++-Quelltext
|
1
|
operator=(LONG);
|
muss umgeändert werden in:
|
C-/C++-Quelltext
|
1
|
COARefTime& operator=(LONG);
|
Die Base-Classes sollten sich nun kompilieren lassen.
Am besten kompiliert Ihr sowohl die Release- als auch die Debug-Version.
Die erzeugten Libraries (im Release-/Debug-Ordner) benennt Ihr in "StrmBase.lib" bzw. "StrmBaseD.lib" um und kopiert sie nach "TriBase\Lib".
------------------------------
4. Kompilieren der Engine: Wieder zuerst die Projektdatei importieren.
Im importierten Projekt (das gilt für ALLE in der 2005er-Version importierten Projekte) müssen erst einmal die hinzugelinkten Libraries geändert werden:
- (entfernen): odbc32.lib odbccp32.lib (das sind die beiden letzten)
- (hinzufügen): kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
Jetzt das Projekt kompilieren. Es wird wieder einen Haufen Warnungen und Fehler geben.
Die Warnungen bekommt man weg (wenn man zu faul ist, um die neuen sichereren Funktionen zu nutzen), indem man in der "TriBase.h" direkt unter folgender Zeile:
#define DIRECTINPUT_VERSION (0x0800)
folgende beiden Zeilen einfügt:
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4995 4996)
Die Fehler behebt man genauso wie schon oben bei den Base-Classes beschrieben.
Es geht immer nur um for-Schleifen - kein großes Problem.
Wenn alle Fehler entfernt wurden, sollte sich die Engine kompilieren lassen. Kompiliert sowohl die Release- als auch die Debug-Version. Die DLL-Dateien werden automatisch nach "TriBase\Bin" und in das Windows-Systemverzeichnis kopiert. Die generierten LIB-Dateien sollten in "TriBase\Lib" gelandet sein.
------------------------------
5. Nun können die Tools und die (Bei)Spiele kompiliert werden. Auch hier müssen wieder einige for-Schleifen korrigiert werden. Und nicht vergessen: Bei jedem Projekt die gelinkten Libraries ändern! Hier noch einmal:
- (
entfernen): odbc32.lib odbccp32.lib (das sind die beiden letzten)
- (
hinzufügen): kernel32.lib user32.lib gdi32.lib winspool.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
------------------------------
Das war's. Wahrscheinlich habe ich irgendetwas vergessen. Einfach fragen