 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Re-Z01 Mini JLI'ler
Alter: 42 Anmeldedatum: 26.10.2006 Beiträge: 14 Wohnort: Alfeld (Leine) Medaillen: Keine
|
Verfasst am: 24.12.2006, 15:19 Titel: [Kapitel 21 : Sprites animieren]Fehler beim Kompilieren |
|
|
Frohe Weihnachten allerseits!
Ich wollte mir mit einem kleinen Programm aus dem Buch die Weihnachtszeit verkürzen. Leider bekomme ich in CodeBlocks beim kompilieren eine Fehlermeldung :
error C2989 'iterator_traits<class ?? ::_Iter *>' : Vorlagenklasse wurde bereits als Nicht-Vorlagenklasse definiert
Ich bin mir sogar ziemlich sicher, dass es am
in der Sprite.h liegt. Ich weiß bloß nicht, warum?
Kann mir jemand dabei helfen? |
|
Nach oben |
|
 |
Loigie Junior JLI'ler

Anmeldedatum: 29.06.2004 Beiträge: 52 Wohnort: NRW Medaillen: Keine
|
|
Nach oben |
|
 |
Re-Z01 Mini JLI'ler
Alter: 42 Anmeldedatum: 26.10.2006 Beiträge: 14 Wohnort: Alfeld (Leine) Medaillen: Keine
|
Verfasst am: 25.12.2006, 17:53 Titel: |
|
|
Irgendwie hat mir das nicht weiterhgeholfen.
Hier ist mein Sourcecode :
DirectXGraphics.cpp
CPP: | #include "Direct3D.h"
#include "CSprite.h"
#include <cstdio>
// Anwendungsfenster erzeugen
HWND CreateMainWindow(HINSTANCE hInstance);
// Callback Funktion zur Nachrichtenbehandlung
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
// Das Fensterhandle
HWND hWnd = 0;
// Instanzierung der D3D-Klasse
CDirect3D Direct3D;
// Instanzierung der Sprite-Klasse
CSprite Sprite;
// Windows main-Funktion
int WINAPI WinMain(HINSTANCE hInstance, // Handle der Programminstanz
HINSTANCE hPrevInstance, // Handle der letzten Instanz
LPSTR lpCmdLine, // Kommandozeile
int nCmdShow) // Art wie das Fenster angezeigt werden soll
{
// Fenster erzeugen und Handle speichern
hWnd = CreateMainWindow(hInstance);
// Wenn der Rueckgabewert 0 ist, ist ein Fehler aufgetreten
if(hWnd == 0)
{
MessageBox(0, "Fenster konnte nicht erzeugt werden", "Fehler", MB_OK);
return -1;
}
if(!Direct3D.Init(hWnd, TRUE))
{
MessageBox(0, "Fehler beim initialisieren von Direct3D", "Fehler", MB_OK);
return -1;
}
// Maus-Cursor verstecken
ShowCursor(FALSE);
Direct3D.SetClearColor(D3DCOLOR_XRGB(0, 0, 0));
Sprite.Create(Direct3D.GetDevice(), 2);
// Grafiken bzw. Texturen laden
char FileName[128];
for(int i=0;i<37;i++)
{
std::sprintf(FileName,"walkexample%d.png", i+1);
Sprite.AddTexture(FileName);
}
// Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg = { 0 };
// Diese Schleife laeuft bis die Nachricht WM_QUIT empfangen wird
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// Nachricht an die Callbackfunktion senden
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Direct3D.BeginScene();
// Tasten fuer die Bewegung von Sprites abfragen
if(GetAsyncKeyState(VK_LEFT) & 0x8000)
{
Sprite.Move(LEFT);
}
else if(GetAsyncKeyState(VK_RIGHT) & 0x8000)
{
Sprite.Move(RIGHT);
}
else if(GetAsyncKeyState(VK_UP) & 0x8000)
{
Sprite.Move(UP);
}
else if(GetAsyncKeyState(VK_DOWN) & 0x8000)
{
Sprite.Move(DOWN);
}
// Sprite rotieren wenn die Leertaste gedrueckt wird
if(GetAsyncKeyState(VK_SPACE) & 0x08000)
{
Sprite.Rotate(.1f);
}
// Sprite vergroessern mit Linksshift
if(GetAsyncKeyState(VK_LSHIFT) & 0x8000)
{
Sprite.Scale(.1f);
}
// Sprite verkleinern mit Rechtsshift
if(GetAsyncKeyState(VK_RSHIFT) & 0x08000)
{
Sprite.Scale(-.1f);
}
Sprite.Draw();
Direct3D.EndScene();
}
}
// Rueckgabewert an Windows
return 0;
}
HWND CreateMainWindow(HINSTANCE hInstance)
{
WNDCLASSEX wndClass =
{
sizeof(WNDCLASSEX), // Groesse angeben
CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW, // Standardstile
MessageHandler, // Callback-Funktion
0, // Zusaetzliche Angaben
0, // nicht benoetigt
hInstance, // Anwendungsinstanz
LoadIcon(NULL, IDI_WINLOGO), // Windows-Logo
LoadCursor(NULL, IDC_ARROW), // Normaler Cursor
(HBRUSH)GetStockObject(WHITE_BRUSH), // Weisser Pinsel
NULL, // kein Menue
"WindowClass", // Der Name der Klasse
LoadIcon(NULL, IDI_WINLOGO) // Windows Logo
};
RegisterClassEx(&wndClass);
return CreateWindowEx(NULL, // Keine erweiterten Stile nutzen
"WindowClass", // Klassenname
"Sprite Animation", // Fenstertitel
WS_OVERLAPPEDWINDOW | // Fenster
WS_VISIBLE, // Eigenschaften
50, 50, // Position
SCR_WIDTH, SCR_HEIGHT, // Groesse
NULL, // Handle des Elternfensters
NULL, // Handle des Menues
hInstance, // Anwendungsinstanz
NULL); // wird nicht benoetigt
}
// Diese Funktion wird von Windows aufgrufen, wenn eine Nachricht
// fuer Ihr Programm vorliegt
LRESULT CALLBACK MessageHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// testen, um welche Nachticht es sich handelt
switch(msg)
{
// wenn das Fenster geschlossen wird, eine Nachricht senden,
// die das Programm beendet
case WM_DESTROY:
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wParam)
{
// Screenshot bei F1
case VK_F1:
Direct3D.CreateScreenshot("C:\\Screen.bmp");
break;
// Anwendung beenden, bei Druck auf ESC
case VK_ESCAPE:
DestroyWindow(hWnd);
break;
}
break;
}
// Wenn wir uns nicht um die Nachricht gekuemmert haben
// wird sie an die Standardnachrichtenverarbeitung von Windows
// geschickt
return DefWindowProc(hwnd, msg, wParam, lParam);
}
|
CSprite.h
CPP: | #include <d3d9.h>
#include <d3dx9.h>
#include <vector>
#include "global.h"
// Bewegungsrichtungen
enum DIRECTION {LEFT, RIGHT, UP, DOWN };
class CSprite
{
public:
CSprite();
virtual ~CSprite();
// Sprite erzeugen
void Create(LPDIRECT3DDEVICE9 lpDevice, int AnimationSpeed);
// Textur hinzufuegen
void AddTexture(LPCSTR lpFileName);
// Sprite zeichnen
void Draw(void);
// festlegen der absoluten Position
void SetPosition(float x, float y);
// festlegen der absoluten Rotation
void SetRotation(float rotation);
// festlegen der absouten Skalierung
void SetScale(float scale);
// festlegen der Schrittweite
void SetStep(float StepX, float StepY);
// relative Bewegung um StepX, StepY Pixel
void Move(DIRECTION dir);
// relative Skalierung
void Scale(float dScale);
// relative Rotation
void Rotate(float dRotation);
protected:
// Zeiger auf das Direct3D-Device
LPDIRECT3DDEVICE9 m_lpDevice;
// Zeiger auf das Sprite
LPD3DXSPRITE m_lpSprite;
// Zeiger auf die Textur
// LPDIRECT3DTEXTURE9 m_lpTexture;
// aktuelle Position
D3DXVECTOR3 m_vPosition;
// Skalierung
D3DXVECTOR2 m_vScale;
// Rotationsmittelpunkt
D3DXVECTOR3 m_vCenter;
// aktuelle Rotation
float m_Rotation;
// Schrittweite
float m_StepX;
float m_StepY;
// Breite und Hoehe
int m_Width;
int m_Height;
// Animationsgeschwindigkeit
DWORD m_AnimationSpeed;
DWORD m_AnimationDelay;
size_t m_CurrentImage;
std::vector<LPDIRECT3DTEXTURE9> m_AnimationVec;
};
|
CSprite.cpp
CPP: | #include "CSprite.h"
CSprite::CSprite(void)
{
m_lpSprite = NULL;
// m_lpTexture = NULL;
m_AnimationDelay = 0;
m_CurrentImage = 0;
}
CSprite::~CSprite(void)
{
if(m_lpSprite != NULL)
{
m_lpSprite->Release();
m_lpSprite = NULL;
}
// if(m_lpTexture != NULL)
// {
// m_lpTexture->Release();
// m_lpTexture = NULL;
// }
for(size_t i=0;i<m_AminationVec.size();i++)
{
if(m_AnimationVec[i])
{
m_AnimationVec[i]->Release();
}
}
}
void CSprite::SetPosition(float x, float y)
{
m_vPosition.x = x;
m_vPosition.y = y;
}
void CSprite::SetRotation(float rotation)
{
m_Rotation = rotation;
}
void CSprite::SetScale(float scale)
{
m_vScale.x = scale;
m_vScale.y = scale;
}
void CSprite::SetStep(float StepX, float StepY)
{
m_StepX = StepX;
m_StepY = StepY;
}
void CSprite::Create(LPDIRECT3DDEVICE9 lpDevice, int AnimationSpeed)
{
m_lpDevice = lpDevice;
m_AnimationSpeed = AnimationSpeed;
// Sprite anlegen
D3DXCreateSprite(m_lpDevice, &m_lpSprite);
m_vCenter = D3DXVECTOR3(static_cast<float>(m_Width) / 2.0f,
static_cast<float>(m_Height) / 2.0f,
0.0f);
// setzen der Skalierung und der Schrittweite
m_vScale = D3DXVECTOR2(1.0f, 1.0f);
// setzen der Schrittweite bei Bewegung
m_StepX = 10.0f;
m_StepY = 10.0f;
}
void CSprite::Draw(void)
{
if(++m_AnimationDelay > m_AnimationSpeed)
{
m_AnimationDelay = 0;
if(++m_CurrentImage >= m_AnimationVec.size())
{
m_CurrentImage = 0;
}
}
// D3DXVector2 vScaling(m_Scale, m_Scale);
D3DXMATRIX Matrix;
D3DXMatrixTransformation2D(
&Matrix,
reinterpret_cast<D3DXVECTOR2*>(&m_vCenter),
0.0f,
&m_vScale,
reinterpret_cast<D3DXVECTOR2*>(&m_vCenter),
m_Rotation,
reinterpret_cast<D3DXVECTOR2*>(&m_vPosition));
m_lpSprite->Begin(D3DXSPRITE_ALPHABLEND);
// setzen derTransformationsmatrix
m_lpSprite->SetTransform(&Matrix);
DWORD ModulateColor = 0xFFFFFFFF;
// zeichnen des Sprites
m_lpSprite->Draw(m_AnimationVec[m_CurrentImage],
NULL,
NULL,
NULL,
ModulateColor);
m_lpSprite->End();
}
void CSprite::AddTexture(LPCSTR lpFileName)
{
// holen der Informationen der Textur
D3DXIMAGE_INFO ImgInfo;
D3DXGetImageInfoFromFile(lpFileName, &ImgInfo);
// speichern von Breite und Hoehe
m_Width = ImgInfo.Width;
m_Height = ImgInfo.Height;
LPDIRECT3DTEXTURE9 lpTexture;
// anlegen der Textur
D3DXCreateTextureFromFileEx(m_lpDevice,
lpFileName,
ImgInfo.Width,
ImgInfo.Height,
1, 0,
D3DFMT_UNKNOWN,
D3DPOOL_MANAGED,
D3DX_FILTER_NONE,
D3DX_FILTER_NONE,
0, 0, 0,
&lpTexture);
m_AnimationVec.push_back(lpTexture);
}
void CSprite::Move(DIRECTION dir)
{
switch(dir)
{
case LEFT:
if(m_vPosition.x > 0)
{
m_vPosition.x -= m_StepX;
}
break;
case RIGHT:
if(m_vPosition.x < SCR_WIDTH - m_Width)
{
m_vPosition.x += m_StepX;
}
break;
case UP:
if(m_vPosition.y > 0)
{
m_vPosition.y -= m_StepY;
}
break;
case DOWN:
if(m_vPosition.y < SCR_HEIGHT - m_Height)
{
m_vPosition.y += m_StepY;
}
break;
}
}
void CSprite::Scale(float dScale)
{
m_vScale.x += dScale;
m_vScale.y += dScale;
}
void CSprite::Rotate(float dRotation)
{
m_Rotation += dRotation;
}
|
Vielleicht findet jemand hier den Fehler.
Interessanterweise scheint es Probleme bei folgenden Anweisungen zu geben :
und das, obwohl das C++ Toolkit nach der Anleitung im Buch eingebunden ist.
Es ist und bleibt ein Rätsel.
Edit by Kampfhund: code- durch cpp-Tags ersetzt. Bitte in Zukunft cpp-Tags für c++-Codeausschnitte verwenden. |
|
Nach oben |
|
 |
Loigie Junior JLI'ler

Anmeldedatum: 29.06.2004 Beiträge: 52 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 26.12.2006, 21:20 Titel: |
|
|
In Zeile 25 der CSprite.cpp würde ich schon mal m_AminationVec durch m_AnimationVec ersetzen. Ansonsten habe ich keine fehler gefunden. |
|
Nach oben |
|
 |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 26.12.2006, 21:45 Titel: |
|
|
Sollte man die Standardbibliotheken ( <cstdio> & <vector> ) nicht immer besser als erstes einbinden?
Hab jedenfalls gehört, dass es ansonsten manchmal zu Problemen führen kann. Und die Fehlermeldung klingt ein klein wenig danach... _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
 |
|
Nach oben |
|
 |
Re-Z01 Mini JLI'ler
Alter: 42 Anmeldedatum: 26.10.2006 Beiträge: 14 Wohnort: Alfeld (Leine) Medaillen: Keine
|
Verfasst am: 27.12.2006, 13:38 Titel: |
|
|
Danke für die Hilfe.
Habe jetzt eure Tipps angewandt. Leider verschwindet der Fehler trotzdem nicht. Testweise habe ich versucht die "Lösung" SpriteAnim zu kompilieren. Auch dort gab es die gleiche Fehlermeldung, wie oben schon beschrieben.
Könnte es sich um einen Code::Blocks oder Visual C++ Toolkit-Problem handeln? |
|
Nach oben |
|
 |
Otscho Super JLI'ler

Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 27.12.2006, 19:29 Titel: |
|
|
Re-Z01 hat Folgendes geschrieben: |
Vielleicht findet jemand hier den Fehler.
Interessanterweise scheint es Probleme bei folgenden Anweisungen zu geben :
und das, obwohl das C++ Toolkit nach der Anleitung im Buch eingebunden ist.
Es ist und bleibt ein Rätsel.
|
Vielleicht ist es auch nur Schwachsinn was ich jetzt behaupte, aber heißt es nicht immer noch
So mach ich das immer... |
|
Nach oben |
|
 |
manu Super JLI'ler

Alter: 35 Anmeldedatum: 09.03.2006 Beiträge: 327 Wohnort: allgäu (DE) Medaillen: Keine
|
Verfasst am: 27.12.2006, 19:49 Titel: |
|
|
Otscho hat Folgendes geschrieben: |
Vielleicht ist es auch nur Schwachsinn was ich jetzt behaupte, aber heißt es nicht immer noch
So mach ich das immer... |
ne, soweit ich weiss, haben die stl header kein .h. Wenn ich mit Visualstudio #include <vector.h> verwende, kann er auch die Datei nicht finden, funktioniert nur ohne. |
|
Nach oben |
|
 |
DirectXer Dark JLI'ler

Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 27.12.2006, 21:58 Titel: |
|
|
hmm, zu welcher Zeile führt dich denn ein Doppelklick auf die Fehlermeldung? Ich könnte mir vorstellen, dass in <cstdio> eine Klasse global definiert wird, die in <vector> als Template im namespace std neu definiert wird. Die alten C-Definitionen (aus <cstdio>) und die neuen C++-Definitionen (hier aus <vector>) sollte man normalerweise eh nicht unter einen Hut bringen, mal von Ausnahmen wie z.B. <cctype> abgesehen...
Gruß DXer |
|
Nach oben |
|
 |
magynhard Super JLI'ler

Anmeldedatum: 26.04.2003 Beiträge: 461 Wohnort: Wild durch die Welt ;-) Medaillen: Keine
|
Verfasst am: 28.12.2006, 01:26 Titel: |
|
|
Was steht denn in der global.h? _________________ Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
 |
|
Nach oben |
|
 |
Re-Z01 Mini JLI'ler
Alter: 42 Anmeldedatum: 26.10.2006 Beiträge: 14 Wohnort: Alfeld (Leine) Medaillen: Keine
|
Verfasst am: 28.12.2006, 13:34 Titel: |
|
|
Also,
ein Doppelklick auf die Fehlermeldung führt mich zu Zeile 115 der xutility.
In der global.h ist lediglich die Auflösung der Anzeige festgelegt.
Wenn ich nun die cstdio rausnehme, um Vermischungen zu vermeiden, bekomme ich trotzdem den gleichen Fehler. |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 29.12.2006, 10:21 Titel: |
|
|
Benutzt du das Platform SDK von der CD? Hast du noch andere Compiler installiert, deren Header/Libs evtl. verwendet werden? |
|
Nach oben |
|
 |
Re-Z01 Mini JLI'ler
Alter: 42 Anmeldedatum: 26.10.2006 Beiträge: 14 Wohnort: Alfeld (Leine) Medaillen: Keine
|
Verfasst am: 29.12.2006, 14:58 Titel: |
|
|
Ich habe tatsächlich noch den MinGW Compiler installiert.
Da gab es wahrscheinlich Konflikte.
Nach langem Suchen habe ich den Fehler dann auch gefunden.
Danke für den Hinweis. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|