Я работаю над проектом парного программирования в колледже, используя 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();
}
}
}
Счастливого Рождества.