(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
-
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 DuCSprite
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
-
Offtopic: Was passiert denn, wenn der Anwender in deinem Code das Init oder Quit vergisst?