游戏运行几分钟后,SDL_Surface消失了吗?

时间:2013-03-31 04:23:54

标签: c++ sdl surface

运行我的小行星游戏几分钟后,代表我的船的SDL_Surface消失了。不知何故,保持船舶旋转图像(腐烂)的表面被设置为NULL。我无法弄清楚为什么!在我添加行if(rot != NULL && image != NULL)之前,程序会在运行大约一分钟三十秒后崩溃,但现在图像就会消失。我似乎无法弄清楚什么是错的!提前谢谢!

包含旋转和渲染的Sprite类函数。

void Sprite::Rotate(double angleAdd)
{
    rotated = true;
    double temp = 0;
    angle += angleAdd;
    temp = angleAdd + angle;
    if (temp >= 360)
        angleAdd = temp - 360;
    if (temp <= 360)
        angleAdd = temp + 360;

    rot = rotozoomSurface(image, angle , 1.0, 1);
}

void Sprite::Draw(SDL_Surface* screen)
{
    if(image == NULL)
        SDL_FillRect(screen, &rect, color);
    else
    {
        if (rotated)
        {
            rotRect.x = x;
            rotRect.y = y;
            //Center the image
            if(rot != NULL && image != NULL){
                rotRect.x -= ((rot->w/2) - (image->w/2));
                rotRect.y -= ((rot->h/2) - (image->h/2));
            }
            SDL_BlitSurface(rot, NULL, screen, &rotRect);
        }
        else
            SDL_BlitSurface(image, NULL, screen, &rect);
    }
}

bool Sprite::SetImage(std::string fileName)
{
    imageFileName = fileName;
    SDL_Surface* loadedImage = NULL;
    loadedImage = SDL_LoadBMP(fileName.c_str());
    if(loadedImage == NULL)
    {
        if (debugEnabled)
            printf("Failed to load image: %s\n", fileName.c_str());
            SDL_FreeSurface(loadedImage);
        return false;
    }
    else
    {
        image = SDL_DisplayFormat(loadedImage);

        SDL_FreeSurface(loadedImage);
        return true;
    }

}

主:

    if (arrowPressed[0])
    {
        ship.SetImage(shipFor.GetImage());
        if(!phase)
            ship.Accel(-moveSpeed);
        else
            ship.Accel(-moveSpeed * 2);
    }
    if (arrowPressed[1])
    {
        ship.Rotate(turnSpeed);
        ship.SetImage(shipRig.GetImage());
    }
    if (arrowPressed[3])
    {
        ship.Rotate(-turnSpeed);
        ship.SetImage(shipLef.GetImage());
    }

    if (arrowPressed[0] && arrowPressed[1])
        ship.SetImage(shipForRig.GetImage());
    if (arrowPressed[0] && arrowPressed[3])
        ship.SetImage(shipForLef.GetImage());
    if (!arrowPressed[0] && !arrowPressed[1] && !arrowPressed[3])
        ship.SetImage(shipNor.GetImage());

    if (ship.GetCenterX() >= RESX - 40)
        ship.SetPosCentered(50, ship.GetCenterY());
    if (ship.GetCenterX() <= 40)
        ship.SetPosCentered(RESX - 50, ship.GetCenterY());
    if (ship.GetCenterY() >= RESY - 40)
        ship.SetPosCentered(ship.GetCenterX(), 50);
    if (ship.GetCenterY() <= 40)
        ship.SetPosCentered(ship.GetCenterX(), RESY - 150);

1 个答案:

答案 0 :(得分:0)

您似乎没有释放上次旋转的图像。检查是否为null,并在创建新曲面之前释放曲面:

void Sprite::Rotate(double angleAdd)
{
    if(rot != NULL)
        SDL_FreeSurface(rot);

    rotated = true;
    double temp = 0;
    angle += angleAdd;
    temp = angleAdd + angle;
    if (temp >= 360)
        angleAdd = temp - 360;
    if (temp <= 360)
        angleAdd = temp + 360;

    rot = rotozoomSurface(image, angle , 1.0, 1);
}