SDL2 не может получить ввод мышью при нажатии клавиши - PullRequest
0 голосов
/ 08 июня 2019

Моя программа SDL2 игнорирует щелчок мыши при нажатии клавиши. Вот мой MCVE:

#include <SDL.h>

void myEventHandler(bool& mouseClicked, bool& letsQuit)
{
    SDL_Event event;

    while (SDL_PollEvent(&event))
        switch (event.type)
        {
        case SDL_QUIT:            letsQuit = true;   break;
        case SDL_MOUSEBUTTONDOWN: mouseClicked = true;
        }
}

int main(int argc, char** argv)
{
    //Init SDL
    SDL_Window*   sldWindow;
    SDL_Renderer* sdlRenderer;

    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
        return -1;
    if (!(sldWindow   = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, 
                                         SDL_WINDOWPOS_UNDEFINED,640, 480, 0))) 
        return -1;
    if (!(sdlRenderer = SDL_CreateRenderer(sldWindow, -1, 0))) 
        return -1;
    SDL_ClearError();

    //Initialize some conditions
    bool letsDrawRed= true;   //Draw a red square, not blue        
    bool letsQuit = false;    //Quit the program

    while (! letsQuit)
    {
        SDL_RenderPresent(sdlRenderer);

        //static int framesSinceLastMouseClick = 0; //latency
        bool       mouseClicked = false;
        myEventHandler (mouseClicked, letsQuit);

        if (letsDrawRed) SDL_SetRenderDrawColor(sdlRenderer, 255, 0, 0, 255); //draw square as red
        else             SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 255, 255); //else draw it blue

        static SDL_Rect rect = { 0, 0, 100, 100 }; //draw the square
        SDL_RenderFillRect(sdlRenderer, &rect);

        //if clicked, and enough time since last click...
        //(All of these commented-out conditions fail too)
        //if (framesSinceLastMouseClick > 600 && mouseClicked) 
        //if (framesSinceLastMouseClick > 600 && SDL_GetMouseState(NULL, NULL))
        //if (mouseClicked)
        if (SDL_GetMouseState(NULL,NULL))
        {
            //framesSinceLastMouseClick = 0;  
            letsDrawRed = !letsDrawRed;
        }
        //else ++framesSinceLastMouseClick;
    }

    SDL_DestroyWindow(sldWindow); 
    SDL_Quit();

    return 0;
}

Я оставил некоторые вещи в комментариях, чтобы показать, что они не проблема. Одним из них является условие задержки (framesSinceLastMouseClick). Другой получает событие мыши от SDL_PollEvent вместо вызова SDL_GetMouseState.)

Еще одна вещь, на которую следует обратить внимание: это проблема, только когда нажатая клавиша пригодна для печати. ​​ Клавиши CapsLock, Shift, Alt, Ctrl и Function не вызывают проблем.

Платформа Visual Studio для MS Windows.

Итак ... как мне добраться до этой мыши, пока нажата клавиша? Это будет проблемой в реальной игре!

1 Ответ

0 голосов
/ 09 июня 2019

Оказалось, что это не SDL, а компьютер, на котором я работаю, который не может отправлять информацию с мыши (на самом деле, трекпад), пока печатается символ печати.Судя по всему, отправка нескольких сигналов с клавиатуры - давняя проблема, и результатом является «двоение в клавиатуре» (некоторые клавиши - в моем случае, нажатия трекпада - теряются).

На момент публикации я смог проверить, какой вывод моя клавиатура / трекпад может отправлять на https://keyboardtester.co/mouse-click-tester.html.

...