JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[Kapitel 21 : Sprites animieren]Fehler beim Kompilieren

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 24.12.2006, 15:19    Titel: [Kapitel 21 : Sprites animieren]Fehler beim Kompilieren Antworten mit Zitat

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
Code:
#include <vector>


in der Sprite.h liegt. Ich weiß bloß nicht, warum?

Kann mir jemand dabei helfen?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 11:35    Titel: Antworten mit Zitat

Also mir sagt die Fehlermeldung an für sich nicht direkt wo der Fehler liegt. Aber Google und MSDN helfen dir bestimmt weiter! Am besten gibt man den Fehlercode zur suche ein.

Guck mal hier:
http://support.microsoft.com/kb/240866
http://support.microsoft.com/kb/163995/de
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Re-Z01
Mini JLI'ler


Alter: 42
Anmeldedatum: 26.10.2006
Beiträge: 14
Wohnort: Alfeld (Leine)
Medaillen: Keine

BeitragVerfasst am: 25.12.2006, 17:53    Titel: Antworten mit Zitat

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 :

CPP:
#include <cstdio>


CPP:
#include <vector>


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
Benutzer-Profile anzeigen Private Nachricht senden
Loigie
Junior JLI'ler



Anmeldedatum: 29.06.2004
Beiträge: 52
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 26.12.2006, 21:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 26.12.2006, 21:45    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Re-Z01
Mini JLI'ler


Alter: 42
Anmeldedatum: 26.10.2006
Beiträge: 14
Wohnort: Alfeld (Leine)
Medaillen: Keine

BeitragVerfasst am: 27.12.2006, 13:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.12.2006, 19:29    Titel: Antworten mit Zitat

Re-Z01 hat Folgendes geschrieben:

Vielleicht findet jemand hier den Fehler.

Interessanterweise scheint es Probleme bei folgenden Anweisungen zu geben :

CPP:
#include <cstdio>


CPP:
#include <vector>


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
CPP:
#include <vector.h>

So mach ich das immer...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
manu
Super JLI'ler


Alter: 35
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 27.12.2006, 19:49    Titel: Antworten mit Zitat

Otscho hat Folgendes geschrieben:


Vielleicht ist es auch nur Schwachsinn was ich jetzt behaupte, aber heißt es nicht immer noch
CPP:
#include <vector.h>

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
Benutzer-Profile anzeigen Private Nachricht senden
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 27.12.2006, 21:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 28.12.2006, 01:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Re-Z01
Mini JLI'ler


Alter: 42
Anmeldedatum: 26.10.2006
Beiträge: 14
Wohnort: Alfeld (Leine)
Medaillen: Keine

BeitragVerfasst am: 28.12.2006, 13:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 29.12.2006, 10:21    Titel: Antworten mit Zitat

Benutzt du das Platform SDK von der CD? Hast du noch andere Compiler installiert, deren Header/Libs evtl. verwendet werden?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Re-Z01
Mini JLI'ler


Alter: 42
Anmeldedatum: 26.10.2006
Beiträge: 14
Wohnort: Alfeld (Leine)
Medaillen: Keine

BeitragVerfasst am: 29.12.2006, 14:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum