C ++ SFML Ввод джойстика - PullRequest
       19

C ++ SFML Ввод джойстика

0 голосов
/ 24 декабря 2018

Я работаю над проектом парного программирования в колледже, используя SFML & C ++ для создания 2D-игры для двух игроков.


TL; DR:

Как сделать экземпляр Xbox360Controller доступным из любой точки игры?[Имейте в виду, если вы порекомендуете Singleton Pattern, что будут подключены два контроллера].


У нас есть движок, написанный на наших уроках в колледже, мы сделали такие вещи, какResourceManager, SceneGraph, CommandQueue, StateStack, Input Action bindings и т. Д.

Функциональность двигателей разделена на update(), draw(), handleEvent() и отдельный handleRealtimeInput() в Player.cpp.

Я написал и переработал класс Xbox360Controller в моем Github (пока игнорируйте метод static GetController()).

Первоначально исходный класс из dustinfreeman's GitHub использовал шаблон Singleton, но нам нужно разрешить подключение двух контроллеров.

Я не уверен, еслиЯ все еще должен использовать класс класса Singleton или сделать экземпляр Xbox360Controller для конкретного игрока.

В настоящее время я пытаюсь использовать вторую реализацию, но в моем Application.cpp, когда я создаюэкземпляр в конструкторе, я хотел бы, чтобы все приложение для доступа к событиям контроллера, как показанониже:

Application::Application()
    :mWindow(sf::VideoMode(1024, 768), "Audio", sf::Style::Close)
    , mTextures()
    , mFonts()
    , mPlayer()
    , mMusic()
    , mSounds()
    , mStateStack(State::Context(mWindow, mTextures, mFonts, mPlayer, mMusic, mSounds))
    , mStatisticsText()
    , mStatisticsUpdateTime()
    , mStatisticsNumFrames(0)
{
    mWindow.setKeyRepeatEnabled(false);

    mFonts.load(FontIDs::Main, "Media/Sansation.ttf");

    mTextures.load(TextureIDs::TitleScreen, "Media/Textures/TitleScreen.png");
    mTextures.load(TextureIDs::Buttons, "Media/Textures/Buttons.png");

    registerStates();
    mStateStack.pushState(StateIDs::Title);

    // This line creates an instance for a controller if a controller is connected
    if (sf::Joystick::Count > 0)
    {
        std::cout << "Joystick Connected." << std::endl;
        // This instance should be available everywhere
        Xbox360Controller controller(0);
    }
}

// This runs in the game-loop
void Application::processInput()
{
    sf::Event event;
    while (mWindow.pollEvent(event))
    {
        if (sf::Joystick::isConnected(0))
        {
            // Do something [For testing], eventually, pass the event into StateStack
        }

        mStateStack.handleEvent(event);

        if (event.type == sf::Event::Closed)
        {
            mWindow.close();
        }
    }
}

Счастливого Рождества.

...