Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Eins schon mal vorweg, is mir nämlich gerade aufgefallen. Bei deinem Operator kannst du dir das if-Statement sparen. SDL_FreeSurface() einen NULL-Zeiger zu übergeben ist sicher - in diesem Fall passiert einfach gar nichts.
Dein Quellcode sollte eigentlich funktionieren, wo taucht denn die Zugriffsverletzung auf? Immer noch beim SetColourKey()?
Prüf doch mal nach LoadStory() ob SpriteIntro_Text NULL ist.
Was machst du denn mit dem Sprite im weiteren Verlauf deines Prorgamms? Du renderst das Sprite doch mit Sicherheit oder? Und das machst du dann auch in einer anderen Funktion von CGame oder? Dann "musst" du das Objekt eh auf dem Heap anlegen.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Funktionsaufruf: CSprite *pSpriteIntro_Text = NULL; pSpriteIntro_Text = LoadStory(ID_Story); //Storry Datei laden //pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis"); pSpriteIntro_Text -> SetColourKey(205,179,139); //dann rendern //und nach dem rendern per delete freigeben Funktion: CSprite* CGame::LoadStory(const int ID_Story) { CSprite *Sprite = new CSprite; //CSprite für den Text if(ID_Story == 1) Sprite.Load("Data/Emphasis/Storry/Storry_1.Emphasis"); else if(ID_Story == 2) Sprite.Load("Data/Emphasis/Storry/Storry_2.Emphasis"); return Sprite; } |
Hallo Ombalat,(...) im Sprite die Breite, Hohe und das Format scheinbar nicht richtig übernommen wurden (...)
Daher brauche ich die Variable nicht umbedingt auf dem heap erzeugen.
Ich überlege mir zZ aber, ob es nicht über den Heap einfacher währe.
C-/C++-Quelltext |
|
1 2 3 |
private: string sPath; //Der Pfad, wo die Bilddatei liegt string GetPath() { return (sPath); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »SaRu« (30.08.2010, 19:06)
Warum? Die Funktion GetPath() lieft den Pfad zur Bilddatei, ok. Aber was macht sie im private Bereich der Klasse? Innerhalb der Klasse und ihrer Funktionen kannst du ja auf private Variablen sowieso zugreifen und von außen solltest du dann GetPath() benutzen, dafür muss die Funktion allerdings public sein. Schau mal bitte (mit einer zwischengeschobenen Ausgabe oder so) nach, was der Funktionsaufruf in deinem Operator zurückliefert.
C-/C++-Quelltext |
|
1 2 3 4 |
Sprite.hpp: private: string sPath; //Der Pfad, wo die Bilddatei liegt |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
Sprite.cpp: CSprite& CSprite::operator =(CSprite& rhs) { cout << rhs.sPath.c_str(); Load(rhs.sPath); return *this; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Sprite.hpp class CSprite { public: SDL_Surface* GetSurface () {return m_pSurface;} CSprite& operator = (CSprite& rhs); private: SDL_Surface* m_pSurface; }; // Sprite.cpp CSprite& CSprite::operator = (CSprite& rhs) { m_pSurface = new SDL_Surface(*rhs.GetSurface()); return *this; } // Sollte nun funktionieren... CSprite EinSprite; EinSprite = LoadStory(ID_Story); EinSprite.SetColourKey(...); |
C-/C++-Quelltext |
|
1 2 3 4 5 |
Funktionsaufruf (unverändert): SpriteIntro_Text = LoadStory(ID_Story); //Storry Datei laden //pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis"); SpriteIntro_Text.SetColourKey(205,179,139); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Ladefunktion (unverändert): CSprite CGame::LoadStory(const int ID_Storry) { CSprite TempSprite; //Temporäres CSprite für den Text if(ID_Storry == 1) TempSprite.Load("Data/Emphasis/Story/Story_1.Emphasis"); else if(ID_Storry == 2) TempSprite.Load("Data/Emphasis/Story/Story_2.Emphasis"); return TempSprite; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
Sprite.hpp: public: CSprite(); SDL_Surface *GetSurface() { return(m_pImage); } CSprite &operator = (CSprite& rhs); //Überladen des = Operators private: SDL_Surface *m_pScreen; //Das Surface für den Screen, in den Gerendert wird SDL_Surface *m_pImage; // Das Surface für das Bild, in dem sich das zu rendernde Bild befindet |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sprite.cpp: //Standard - Konstruktor des Sprites //Holt den Screen für das Ziel - Surface vom Framework CSprite::CSprite() { m_pImage = NULL; m_pScreen = g_pFramework -> GetSurface(); } CSprite& CSprite::operator =(CSprite& rhs) { m_pImage = new SDL_Surface(*rhs.GetSurface()); return *this; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Funktionsaufruf: CSprite *SpriteIntroText = NULL; SpriteIntro_Text = LoadStory(ID_Story); //Storry Datei laden //pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis"); SpriteIntro_Text -> SetColourKey(205,179,139); //Hier noch rendern delete (SpriteIntro_Text); Ladefunktion: CSprite *CGame::LoadStory(const int ID_Storry) { CSprite *Sprite = new CSprite; //CSprite für den Text if(ID_Storry == 1) Sprite -> Load("Data/Emphasis/Story/Story_1.Emphasis"); else if(ID_Storry == 2) Sprite -> Load("Data/Emphasis/Story/Story_2.Emphasis"); return Sprite; } |
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Ombalat« (01.09.2010, 21:59)
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
Game.cpp: void CGame::RenderStory(const int &ID_Story) { //Story rendern bool bIntro = true; //Abbruchbedningung für das Intro float fYPos = 600.0f; SDL_Event Event; //Sprites für den Text initialisieren CSprite* SpriteIntro_Text = NULL; SpriteIntro_Text = LoadStory(ID_Story); //Storry Datei laden //pSpriteIntro_Text -> Load("Data/Emphasis/Storry/Storry_2.Emphasis"); SpriteIntro_Text -> SetColourKey(205,179,139); do { g_pFramework -> Update(); g_pFramework -> Clear(); //Text des Intros rendern //RenderText("Escape - Taste drücken",40,85,85,85,280,250); SpriteIntro_Text -> SetPos(0.0f,fYPos); SpriteIntro_Text -> Render(); g_pFramework -> Flip(); fYPos -= 25 * g_pTimer -> GetElapsed(); //Abbruchbedingung if(SDL_PollEvent(&Event)) { switch(Event.type) { //Wurde eine Taste gedrückt? case(SDL_KEYDOWN): { switch(Event.key.keysym.sym) { case (SDLK_ESCAPE): { bIntro = false; } } }break; } } }while(bIntro && fYPos > -1247.0f); delete (SpriteIntro_Text); } //Funktion zum Laden der Storry CSprite* CGame::LoadStory(const int ID_Storry) { CSprite* Sprite = new CSprite; //CSprite für den Text if(ID_Storry == 1) Sprite -> Load("Data/Emphasis/Story/Story_1.Emphasis"); else if(ID_Storry == 2) Sprite -> Load("Data/Emphasis/Story/Story_2.Emphasis"); return Sprite; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Sprite.hpp: #ifndef SPRITE_HPP #define SPRITE_HPP #include "Framework.hpp" class CSprite { public: CSprite(); ~CSprite(); void Load(const string sFilename); void Load(const string sFilename, int NumFrames, int FrameWidth, int FrameHeight); void Render(); void Render(float fFrameNumber); void SetColourKey(int R, int G, int B); void SetAlphaKey(Uint8 AlphaValue); void SetPos(float fXPos, float fYPos); SDL_Rect GetRect() { return (m_Rect); }; private: SDL_Surface *m_pScreen; //Das Surface für den Screen, in den Gerendert wird SDL_Surface *m_pImage; // Das Surface für das Bild, in dem sich das zu rendernde Bild befindet SDL_Rect m_Rect; //Das Rect (Rechteck) für das Bild SDL_Rect m_FrameRect; //Das Rect für die Animationsphase int m_NumFrames; //Anzahl der Animationsphasen int m_FrameWidth; //Breite der Animationsphase int m_FrameHeight; //Höhe der Animationsphase int m_NumFramesX; //Anzahl der Animationsphasen in X - Richtung }; #endif |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
Site - Klasse: #include "Sprite.hpp" //Standard - Konstruktor des Sprites //Holt den Screen für das Ziel - Surface vom Framework CSprite::CSprite() { m_pImage = NULL; m_pScreen = g_pFramework -> GetSurface(); } //Destruktor //Gibt das Surface vom Image frei CSprite::~CSprite() { if(m_pImage != NULL) { SDL_FreeSurface(m_pImage); m_pImage = NULL; } } //Load - Funktion. //Ermöglicht das Laden eines nicht animierten Sprites void CSprite::Load(const string sFilename) { m_pImage = SDL_LoadBMP(sFilename.c_str()); //BMP laden //Fehlerabfrage if (m_pImage == NULL) { cout << "Fehler beim Laden von: " << sFilename.c_str() << endl; cout << "Fehlermeldung: " << SDL_GetError() << endl; //Framework herunterfahren g_pFramework -> Quit(); //Gesammtes Programm herunterfahren exit(1); } //Rect initialisieren m_Rect.x = 0; //X - Pos für die linke obere Ecke im Rect m_Rect.y = 0; //Y - Pos für die linke obere Ecke im Rect m_Rect.w = m_pImage -> w; //Breite des Rect m_Rect.h = m_pImage -> h; //Höhe des Rect } //Load - Funktion //Ermöglicht das laden von animierten Sprites void CSprite::Load(const string sFilename, int NumFrames, int FrameWidth, int FrameHeight) { //Laden der Bitemap Load(sFilename.c_str()); //Rect für die Animationsphase initialisieren m_NumFrames = NumFrames; m_FrameWidth = FrameWidth; m_FrameHeight = FrameHeight; m_FrameRect.w = FrameWidth; m_FrameRect.h = FrameHeight; m_NumFramesX = (m_pImage -> w) / FrameWidth; } //Funktion zum Setzen der Poition des Sprites void CSprite::SetPos(float fXPos, float fYPos) { m_Rect.x = static_cast<int> (fXPos); m_Rect.y = static_cast<int> (fYPos); } //Funktion zum definieren des Colour - Keys void CSprite::SetColourKey(int R, int G, int B) { if(SDL_SetColorKey(m_pImage,SDL_SRCCOLORKEY,SDL_MapRGB(m_pImage->format,R,G,B)) < 0) cout << "Fehler beim setzten des Colour - Keys!\nFehler: " << SDL_GetError() << endl; } //Funktion zum definieren der Transparenz des Sprites void CSprite::SetAlphaKey(Uint8 AlphaValue) { SDL_SetAlpha(m_pImage,SDL_SRCALPHA, static_cast<Uint8> (AlphaValue)); } //Funktion zum Rendern eines Nicht animierten Sprites void CSprite::Render() { SDL_BlitSurface(m_pImage,NULL,m_pScreen,&m_Rect); } //Funktion zum Rendern eines animierten Sprites void CSprite::Render(float fFrameNumber) { // Spalte berechnen int Column = static_cast<int>(fFrameNumber)%m_NumFramesX; // Zeile berechnen int Row = static_cast<int>(fFrameNumber)/m_NumFramesX; // Rect berechnen m_FrameRect.x = Column * m_FrameWidth; m_FrameRect.y = Row * m_FrameHeight; //Rendern SDL_BlitSurface(m_pImage,&m_FrameRect,m_pScreen,&m_Rect); } |
Werbeanzeige