我正在使用SFML和C ++进行大学对编程项目,以制作两人游戏2D游戏。
如何使Xbox360Controller
实例可从游戏中的任何位置访问? [请记住,如果您建议使用Singleton Pattern
,将连接两个控制器]。
我们有一个大学课堂上编写的引擎,我们制作了诸如ResourceManager
,SceneGraph
,CommandQueue
,StateStack
,Input 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();
}
}
}
圣诞节快乐。