C ++ SFML游戏杆输入

时间:2018-12-24 19:45:18

标签: c++ sfml joystick

我正在使用SFML和C ++进行大学对编程项目,以制作两人游戏2D游戏。


TL; DR:

如何使Xbox360Controller实例可从游戏中的任何位置访问? [请记住,如果您建议使用Singleton Pattern,将连接两个控制器]。


我们有一个大学课堂上编写的引擎,我们制作了诸如ResourceManagerSceneGraphCommandQueueStateStackInput Action bindings之类的东西

引擎功能分为update()draw()handleEvent()handleRealtimeInput()中单独的Player.cpp

我已经在我的Github中编写并重做了一个Xbox360Controller类(暂时忽略了static GetController()方法)。

最初,来自 dustinfreeman's GitHub的原始类使用了Singleton模式,但我们需要允许连接2个控制器。

我不确定我是否仍应使用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();
        }
    }
}

圣诞节快乐。

0 个答案:

没有答案