6

私は現在、SDL2 ライブラリと C を使用して iPhone アプリケーションを作成していますが、ほとんどの場合、うまくいっています。残念ながら、一部の領域、特に iOS 固有の機能では、ドキュメントがかなり薄いようです。私は SDL2 を使用するのが初めてで、これが非常に難しくなっています。これまでのところ、すべてが機能していますが、1 つの問題に悩まされています。SDL2 では、特にモバイル アプリケーションに使用される 6 つのイベント タイプが定義されています。README-ios.txt ファイルは、それらを説明し、そのように使用します。

int HandleAppEvents(void *userdata, SDL_Event *event)
{
    switch (event->type)
    {
    case SDL_APP_TERMINATING:
        /* Terminate the app.
           Shut everything down before returning from this function.
        */
        return 0;
    case SDL_APP_LOWMEMORY:
        /* You will get this when your app is paused and iOS wants more memory.
           Release as much memory as possible.
        */
        return 0;
    case SDL_APP_WILLENTERBACKGROUND:
        /* Prepare your app to go into the background.  Stop loops, etc.
           This gets called when the user hits the home button, or gets a call.
        */
        return 0;
    case SDL_APP_DIDENTERBACKGROUND:
        /* This will get called if the user accepted whatever sent your app to the background.
           If the user got a phone call and canceled it, you'll instead get an    SDL_APP_DIDENTERFOREGROUND event and restart your loops.
           When you get this, you have 5 seconds to save all your state or the app will be terminated.
           Your app is NOT active at this point.
        */
        return 0;
    case SDL_APP_WILLENTERFOREGROUND:
       /* This call happens when your app is coming back to the foreground.
           Restore all your state here.
       */
        return 0;
    case SDL_APP_DIDENTERFOREGROUND:
        /* Restart your loops here.
           Your app is interactive and getting CPU again.
        */
        return 0;
    default:
        /* No special processing, add it to the event queue */
        return 1;
    }
}

int main(int argc, char *argv[])
{
    SDL_SetEventFilter(HandleAppEvents, NULL);

    //... run your main loop

    return 0;
}

このコードについていくつか質問があります。

SDL_SetEventFilter()は何をしますか? SDL Wiki ページを読みましたが、特に曖昧に思えました。

実際には、HandleAppEvents() 関数はどのように機能するのでしょうか? たとえば、次のようなコードがあるとします。

int main(int argc, char* argv[])
{
    //Initialize SDL, etc...
    SDL_SetEventFilter(HandleAppEvents, NULL);


    //I've got some SDL_Textures and windows and things...
    SDL_Window* my_window;
    SDL_Renderer* windowrend;
    SDL_Texture* tex1, tex2, tex3;

    //Primitive game loop
    while(game_is_running){
        handle_input();
        do_logic();
        update_screen();
    }

    destroy_all_my_data();
    SDL_Quit();
    return 0;
}

たとえば、SDL_APP_WILLENTERBACKGROUNDを受け取ったときにメモリを破壊したり、ゲームループを停止したりするには、HandleAppEvents()またはmain()にどのようなコードを配置する必要がありますか?

tex2 は消耗品であり、アプリが SDL_APP_LOWMEMORY を受け取ると削除できるとしましょう。他のデータをいじらずに、HandleAppEvents() から tex2 を削除するにはどうすればよいですか?

userdata ポインタには何が入っていますか?

アプリがバックグラウンドに入ったら、テクスチャをサーフェスに変換し、../tmp/ ディレクトリに bmp として保存する必要がありますか? それとも、アプリがフォアグラウンドに戻ったときにテクスチャはメモリに残っていますか?

私の紛らわしい質問が何らかの意味をなすことを願っています。SDL2 の完全なドキュメントを見つけることができる場所があれば、それを知っておくとよいでしょう。

ご覧いただきありがとうございます。

4

2 に答える 2

1

このスレッドからわかるように、クラッシュを回避するには、SDL_APP_WILLENTERBACKGROUND でゲーム ループを停止し、SDL_APP_WILLENTERFOREGROUND で再開する必要があります。

于 2013-10-02T07:03:21.833 に答える