1

小惑星ゲームを数分間実行すると、船を表す SDL_Surface が消えます。どういうわけか、船の回転イメージ (rot) を保持するサーフェスが NULL に設定されています。理由がわかりません!行を追加する前はif(rot != NULL && image != NULL)、約 1 分 30 秒実行するとプログラムがクラッシュしていましたが、今では画像が消えてしまいます。何が悪いのか理解できないようです!前もって感謝します!

回転とレンダリングを含むスプライト クラス関数。

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);
4

1 に答える 1

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);
}
于 2013-03-31T09:57:37.927 に答える