SDL2 рендеринг текстуры заметно отстает от мыши

Я использую SDL2 в Windows (я тестировал 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;
}

5

Решение

Хотя я не могу быть уверен, почему ваша петля отстает, SDL поддерживает изменение поверхности мыши, а также некоторые другие функции, которые могут вас заинтересовать. Кажется, вы могли бы поставить SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y) с пользой. Вот ссылка на вики-страницу о поддержке мыши: http://wiki.libsdl.org/CategoryMouse

Удачного кодирования!

2

Другие решения

В проекте, над которым я работаю, я делаю что-то вроде этого:

(Вне основного игрового цикла):

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

При использовании этого я действительно не заметил никакой задержки ввода. Может быть, это просто тип события?

Обратите внимание, что это, скорее всего, не так эффективно, так как вы будете получать состояние мыши в каждом кадре, а не только при перемещении мыши.

0

По вопросам рекламы [email protected]