0

[解決済み]私はこのチュートリアル (ビデオ)に従っており、まさにこの瞬間にいます。コンパイルには問題はありませんでしたが、プログラムの実行に関しては、1 秒間点滅してオフになるだけです。そのため、デバッガーを実行しましたSDL_DisplayFormatが、load_image機能からセグメンテーション違反が見つかりました。画像をロードする行をコメントアウトすると、問題なく動作しますが、問題の理由が見つかりません。

[解決策] SDL_DisplayFormat が機能しなかった理由は、.bmp ファイルを埋めていないことです。図面を提出すると、すべてが機能し始めました。

これが私のコードです:

#include "game.h"
/*TODO 
*stworzyć plik z blokami "blocks.bmp"
*stworzyć plik  z tlem "background.bmp"
*uzywac jako tla do obrazkow 000,255,255
*
*/
game::game()
{
    //zaladowanie ekranu
    SDL_Init(SDL_INIT_EVERYTHING);
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGTH, 32, SDL_SWSURFACE);
    //ladowanei obrazkow

    //ustawianie polozenia i rozmiaru kamery
    camera.x = camera.y = 0;
    camera.w = SCREEN_WIDTH;
    camera.h = SCREEN_HEIGTH;
    //inicjalizacja kierunku w kotrym sie poruszamy
    direction[0] = direction[1] = 0;
    running = true;
    block = (load_image("blocks.bmp"));
    background = (load_image("background.bmp"));
}
game::~game()
{
    SDL_FreeSurface(block);
    SDL_FreeSurface(background);
    SDL_Quit();
}
SDL_Surface* game::load_image (const char* filename)
{
    SDL_Surface* tmp = SDL_LoadBMP(filename);
    SDL_Surface* tmp2 = SDL_DisplayFormat(tmp);
    //do odkomentowania kolorkey na razie zeby sprawdzac kolizje
    //  SDL_SetColorKey(tmp2, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format, 0x00, 0xff, 0xff)
    SDL_FreeSurface(tmp);
    return tmp2;
}
void game::handleEvents()
{
    SDL_Event event;
    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_QUIT:
                running = false;
                return;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_LEFT:
                        direction[0] = 1;
                        break;
                    case SDLK_RIGHT:
                        direction[1] = 1;
                        break;
                }
                break;
            case SDL_KEYUP:
                switch(event.key.keysym.sym)
                {
                    case SDLK_LEFT:
                        direction[0] = 0;
                        break;
                    case SDLK_RIGHT:
                        direction[1] = 0;
                        break;
                }
                break;
        }
    }
}
void game::start()
{
    while(1)
    {
        handleEvents();
        SDL_Flip(screen);
    }
}
4

1 に答える 1

2

事前のアドバイス:コンパイル手順を含む完全で最小限のコードを提供します。main()関数がなく、クラス定義もありません(game.h)。これを再構築してデバッガーで実行した後、最初のSDL_LoadBMP()がNULLを返すことがわかりました(おそらくそれはあなたのものと同じですが、これは間違いなく私が対応するファイルを持っていない場合です)、それで私には手がかりがありません同じ問題があるかどうか。

さて、これを修正するために試みることができるのは、戻り値をチェックすることです。この場合、これを試してください:

SDL_Surface* tmp = SDL_LoadBMP(filename);
if(!tmp)
    throw std::runtime_error("SDL_LoadBMP() failed");

リソースをリークしないようにするには、unique_ptrまたはカスタムラッパークラスを使用することもお勧めします。

于 2013-01-10T22:10:21.497 に答える