7

Windows で SDL2 を使用しています (Windows 7 と Windows 8 の両方をテストしました)。マウス座標にロックされたテクスチャをレンダリングして、一種の「十字線」効果を作成して遊んでいました。

動作しますが、テクスチャが明らかにマウスに遅れをとっているため、マウスの動きとレンダリングされた更新の間に厄介な遅延が生じます。正直なところ、遅延は非常にわずかですが、絶対的な精度を気にする人にとっては、気が狂ってしまうでしょう.

私の質問は基本的に、これは正常ですか?遅延は、Windows がイベントを SDL に配信し、次に SDL がイベントを配信するのにかかる時間が原因であると推測しています。SDL を介してロックされた「十字線」効果を実現するにはどうすればよいですか?

参照用の私のコード:

#include "SDL.h"

int main( int argc, char* args[] ) 
{ 
    SDL_Init( SDL_INIT_EVERYTHING ); 

    SDL_Window* window = SDL_CreateWindow("SDL", 100, 100, 640, 480, SDL_WINDOW_SHOWN);

    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

    SDL_Surface* surface = SDL_LoadBMP("mouse.bmp");

    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);

    bool isExiting = false;
    int x = 0;
    int y = 0;

    while(!isExiting)
    {
        SDL_Event e;
        while(SDL_PollEvent(&e))
        {
            if(e.type == SDL_QUIT)
            {
                isExiting = true;
                break;
            }
            else if(e.type == SDL_MOUSEMOTION)
            {
                x = e.motion.x;
                y = e.motion.y;
            }
        }

        SDL_Rect destRect;
        destRect.h = 19;
        destRect.w = 19;
        destRect.x = x;
        destRect.y = y;

        SDL_RenderClear(renderer);
        SDL_RenderCopy(renderer, texture, NULL, &destRect);
        SDL_RenderPresent(renderer);
    }

    SDL_Quit(); 

    return 0; 
}
4

2 に答える 2

3

ループが遅れる理由はわかりませんが、SDL はマウス サーフェスの変更や、興味のある他の機能をサポートしていますSDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y)。うまく利用できるようです。マウス サポートに関する wiki ページへのリンクは次のとおりです: http://wiki.libsdl.org/CategoryMouse

ハッピーコーディング!

于 2013-09-28T20:43:49.593 に答える
1

私が取り組んでいるプロジェクトでは、次のようなことをしています。

(メインのゲーム ループの外):

SDL_Texture* cursor = //blah;
SDL_Rect cursor_hitbox;
SDL_QueryTexture(cursor, NULL, NULL, &cursor_hitbox.w, &cursor_hitbox.h);

(メインのゲーム ループで):

SDL_GetMouseState(&cursor_hitbox.x, &cursor_hitbox.y);

これを使用している間、入力の遅延は特に気になりませんでした。多分それはただのイベントタイプですか?

ただし、マウスを動かしたときだけでなく、フレームごとにマウスの状態を取得するため、これは効率的ではない可能性が高いことに注意してください。

于 2015-06-08T21:35:03.083 に答える