进入SDL之后,我按照DreamInCode上的教程“ StaysCrisp”进行了介绍。问题是,当我尝试使用其中一种绘制方法时。我得到了错误:

Unhandled exception at 0x6C7DB2AA (SDL2.dll) in Tutorial.exe:
0xC0000005: Access violation reading location 0x00000044.


问题出在Sprite类的draw方法中。所以这是代码。另外,我使用的是最新版本的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

09-16 15:58