Приступая к SDL, я изложил следующие уроки «StaysCrisp» на DreamInCode. Проблема в том, что когда я пытаюсь использовать один из методов рисования. Я получаю ошибку:
Unhandled exception at 0x6C7DB2AA (SDL2.dll) in Tutorial.exe:
0xC0000005: Access violation reading location 0x00000044.
Проблема в методе рисования класса Sprite. Итак, вот код. Также на заметку, что я использую последнюю версию SDL (2.0.3), и я могу сказать из кода, что StaysCrisp нет.
#include "Sprite.h"
//constructor
Sprite::Sprite()
{
}
SDL_Surface*Sprite::Load(char*File)
{
SDL_Surface*temp = NULL;
SDL_Surface*optimized = NULL;
if ((temp = IMG_Load(File)) == NULL)
{
return NULL;
}
optimized = temp;
SDL_FreeSurface(temp);
return optimized;
}
bool Sprite::Draw(SDL_Surface*dest, SDL_Surface*src, int x, int y)
{
if (dest == NULL || src == NULL)
{
return false;
std::cout << "Could not draw the entire surface!\n ERROR: SPRITE.CCP";
}
SDL_Rect destR;
destR.x = x;
destR.y = y;
SDL_BlitSurface(src, NULL, dest, &destR); //Compiler says the problem is here
return true;
}
bool Sprite::Draw(SDL_Surface*dest, SDL_Surface*src, int x, int y,
int x2, int y2, int width, int height)
{
if (dest == NULL || src == NULL)
{
std::cout << "Could not draw sprite. SPRITE.CCP \n";
return false;
}
SDL_Rect destR;
destR.x = x;
destR.y = y;SDL_Rect srcR;
srcR.x = x2;
srcR.y = y2;
srcR.w = width;
srcR.h = height;
SDL_BlitSurface(src, &srcR, dest, &destR); //Compiler says the problem is here
return true;
}
Я смог воспроизвести ваш крах,
Избавьтесь от этой строки:
SDL_FreeSurface(temp);
temp и optimized указывают на один и тот же ресурс, поэтому освобождение одного означает, что они оба указывают на мусор.
В своем коде он вызвал функцию, которая явно выделяла некоторую копию этой памяти, в вашей вы просто назначаете указатель, который не будет работать.
optimized = SDL_DisplayFormatAlpha(temp); //this will create a copy
SDL_FreeSurface(temp);
Кроме того, я не уверен, что этот код даст что-то полезное, так как этот код выглядит так, как будто он был написан для SDL 1.2 (SDL1.2 и SDL2,0 — это достаточно разные звери, поэтому вы не сможете смешивать и сопоставлять код, если вы на самом деле не знаю, что ты делаешь).
Есть учебники для 2.0, я посмотрю, смогу ли я выкопать, где они для вас. ( http://lazyfoo.net/tutorials/SDL/index.php)