(4) Probleme bei der Programmierung mit der SDL 2.0



  • Hallo liebe Community!

    Habe folgendes Problem:
    Ich bin grade dabei mein 2 Spiel zu programmieren und bin dazu von SDL 1.2.5 auf 2.0 umgestiegen. Fuchtele nun seit geraumer Zeit an der Header Datei rum, in die die Spielschleife reinkommt. Ich komme da aber kaum weiter. Wenn ich dort 2 Sprites von mir einfüge werden die mit folgenden Fehlern zugebombt:

    1. Fehler 1 error C2143: Syntaxfehler: Es fehlt ';' vor '*' c:\projekte\projekte\englishlearningluiz-serious\game.hpp 26 1 EnglishLearningLuiz-Serious

    2. Selber Fehler wie 1.

    3. Fehler 2 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\projekte\projekte\englishlearningluiz-serious\game.hpp 26 1 EnglishLearningLuiz-Serious

    4. Selber Fehler wie 3.

    //Game.hpp
    #ifndef GAME_HPP
    #define GAME_HPP
    
    #include "stdafx.hpp"
    #include "Sprite.hpp"
    #include "SDL_Setup.hpp"
    
    class CMain 
    {
    	public:
    		CMain							();
    		void Quit						();
    
    		void Init						();
    		void GameLoop					();
    
    	private:
    		bool quit;
    		bool m_bGameRun;
    
    		SDL_Event* m_pEMainEvent;
    		SDL_Window *mainWindow;
    
    		CFramework *Framework;
    
    		CSprite* StartButton1;		// Hier Fehler!
    		CSprite* BeendeButton;		// Hier Fehler!
    
    };
    
    #endif
    

    Ich habe die vermutung, dass irgendwas mit dem renderer nicht stimmt:

    Falls ihr einen genauen Blick in meine Sprite-Datei von den Variablen oben braucht:

    // Sprite.cpp
    #include "Sprite.hpp"
    
    // Konstruktor
    //
    // Aufgabe: Textur erstellen
    //
    CSprite::CSprite(SDL_Renderer* renderer)
    {
    
    	m_pRenderer = renderer;
    
    	m_pTtexture = NULL;
    
    	m_pSurface = NULL;
    
    }
     // Konstruktor
    
    CSprite::~CSprite()
    {
    
    	SDL_DestroyRenderer(m_pRenderer);
    	m_pRenderer = NULL;
    
    	SDL_DestroyTexture (m_pTtexture);
    	m_pTtexture = NULL;
    
    	m_pSurface = NULL;
    }
    
    // Load
    //
    // Aufgabe: Sprites laden
    //
    void CSprite::Load(const string sFilename)
    {
    
    	m_pSurface = SDL_LoadBMP (sFilename.c_str() );
    
    	m_Rect.x = 0;
    	m_Rect.y = 0;
    	m_Rect.w = m_pSurface->w;
    	m_Rect.h = m_pSurface->h;
    
    }
     // Load
    
    // SetPos
    //
    //Aufgabe: Position des Sprites festlgen
    //
    void CSprite::SetPos (float fXPos, float fYPos)
    {
    	// Rect updaten
    	m_Rect.x = static_cast<int>(fXPos);
    	m_Rect.y = static_cast<int>(fYPos);
    
    }	
    // SetPos
    
    // SetColorKey
    //
    // Aufgabe: Transparente Farbe festlegen u. von Surface in Textur umwandeln
    //
    void CSprite::SetColorKey  (int R, int G, int B)
    {
    
    	SDL_SetColorKey (m_pSurface, SDL_TRUE, SDL_MapRGB (m_pSurface->format, R, G, B));
    
    	m_pTtexture = SDL_CreateTextureFromSurface (m_pRenderer, m_pSurface);
    	if (m_pTtexture == NULL)
    	{
    		cout << "Unable to create texture from Surface!" << SDL_GetError() << endl;
    	}
    
    } 
    // SetColorKey
    
    // SetColourKey 2.0
    //
    // Aufgabe : Nur umwandeln
    //
    void CSprite::SetColorKey ()
    {
    	m_pTtexture = SDL_CreateTextureFromSurface (m_pRenderer, m_pSurface);
    	if (m_pTtexture == NULL)
    	{
    		cout << "Unable to create texture from Surface!" << SDL_GetError() << endl;
    	}
    }
     // SetColourKey
    
    // Render
    //
    // Aufgabe: Sprites zeichnen
    //
    void CSprite::Render()
    {
    	SDL_RenderCopy (m_pRenderer, m_pTtexture, NULL, &m_Rect);
    
    }
    

    Falls ihr noch mehr Code braucht, dann schreibt es am besten. Habe noch: Framework.cpp + hpp, Game.cpp, Sprite.hpp und die main 🙂

    Hat irgendwer ne Idee wo mein Fehler sein könnte? 😕

    Schon mal danke im Voraus!

    MfG EizoTheAssAssin


  • Mod

    Sprite.hpp?



  • Ich tippe mal wieder (wie so oft) auf "cross include" 😉



  • Was genau meinst du mit cross include? Hab ich noch nie von gehört 😕

    Und hier einmal Sprite.hpp

    // Sprite.hpp
    #ifndef SPRITE_HPP
    #define SPRITE_HPP
    
    #include "stdafx.hpp"
    #include "SDL_Setup.hpp"
    #include "Singleton.hpp"
    #include "Game.hpp"
    
    class CSprite 
    {
    	public:
    		CSprite	(SDL_Renderer* renderer);
    		~CSprite();
    
    		void Load							(const string sFilename);
    		void SetColorKey					(int R, int G, int B);
    		void SetColorKey					();
    		void SetPos							(float fXPos, float fYPos);
    		void Render							();
    		SDL_Rect GetRect					() {return m_Rect;}
    
    	private:
    		SDL_Renderer *m_pRenderer;
    		SDL_Texture *m_pTtexture;
    		SDL_Surface *m_pSurface;
    
    		SDL_Rect m_Rect;				// Rect des Sprites
    
    		CFramework *Framework;
    
    };
    
    #endif
    


  • Ich kann nicht direkt helfen, aber:

    Wieso inkludiert sprite.hpp so viel Gedoens?

    #include "stdafx.hpp"
    #include "SDL_Setup.hpp"
    #include "Singleton.hpp"
    #include "Game.hpp"
    

    Und <string> fehlt... 😞

    Aussserdem schnappst Du doch irgendwo ein using namespace std; auf. Das sollte auch nicht so sein.

    In Game.hpp kannst Du CSprite wohl vorausdeklarieren.

    Da würde ich etwas aufräumen.



  • Dann google danach... (alternativ "cross reference")

    Game.h includiert Sprite.h, Sprite.h includiert Game.h.
    Abhilfe: Vorwärtsreferenzen



  • Also string habe ich schon drinnen, ist nur in stdafx verpackt, habe nun mal aufgeräumt, ein paar Parameter entfernt und stattdessen Singletons benutzt. Soweit so gut. Jzt krieg ich aber 2 neue Fehelrmeldungen in meiner main!

    1. Error C2228: Links von ".GameLoop" muss sich eine Klasse/Struktur/Union befinden.

    2. IntelliSense: Der Ausdruck muss einen Klassentyp aufweisen.

    beide Fehlermeldungen gelten für alle 3 Aufrufe:

    #include "Game.hpp"
    #include "SDL_Setup.hpp"
    
    int main(int argc, char* argv[])
    {
    
    	if (g_pFramework->Init (800, 600, 16, false) == false)
    		return 0;
    
    	CMain Game ();
    
    	Game.Init ();				// Hier Fehler
    
    	Game.GameLoop ();			// Hier Fehler
    
    	Game.Quit ();				// Hier Fehler
    
    }
    

    Wenn ich versuche Game zu einem Pointer zu mache und die Punkte zu -> zu ändern kommt folgendes auf den Tisch:

    1. Fehler 3 error C2227: Links von "->Quit" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden. c:\projekte\projekte\englishlearningluiz-serious\main.cpp 17 1 EnglishLearningLuiz-Serious X 3 für jeden Aufruf

    2. 4 IntelliSense: Der Ausdruck muss den Typ "pointer-to-class" aufweisen. c:\Projekte\Projekte\EnglishLearningLuiz-Serious\main.cpp 13 2 EnglishLearningLuiz-Serious Ebenfalls X 3

    Ich habe überhaupt nichts an meiner CMain-Klasse verändert, weswegen mich die Exception doch ziemlich verwirrt 😕

    hat irgendjemand ne Idee ? Und nochmal danke für die Hilfe beim ersten Problem! 👍 👍 👍 😃
    Ich glaube ich bin irgendwie verflucht 😃



  • Stichwort: "most vexing parse".

    Mach die Klammern in Z.11 weg.

    Wo lernt man denn vor den Klammern Leerzeichen zu lassen?



  • Ist ne Angewohnheit, jeder Programmiert ja so wie es für ihn am geordnetsten erscheint 🙂

    Misst, danke Leichtsinnsfehler 😡


  • Mod

    Offtopic: Was passiert denn, wenn der Anwender in deinem Code das Init oder Quit vergisst?


Anmelden zum Antworten