【问题标题】:SDL_Surface disappears after game runs for several minutes?游戏运行几分钟后 SDL_Surface 消失?
【发布时间】:2013-03-21 12:23:24
【问题描述】:

运行我的小行星游戏几分钟后,代表我的飞船的 SDL_Surface 消失了。不知何故,保存船舶旋转图像(rot)的表面被设置为 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);

【问题讨论】:

  • 你的程序使用了多少内存?我怀疑这是内存泄漏。

标签: c++ sdl surface


【解决方案1】:

您似乎没有释放最后一个旋转的图像。检查是否为 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);
}

【讨论】:

  • 谢谢!我会试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 2013-06-30
  • 2021-05-12
相关资源
最近更新 更多