Создание GUI с использованием Qt для текстовой игры - PullRequest
0 голосов
/ 27 мая 2011

Я и мои одноклассники решили сделать игру за лето.Сначала мы решили сделать его текстовым консольным приложением, но потом я подумал, что можно было бы создать графический интерфейс для игры с использованием Qt.Я немного поиграл с этим, будучи в состоянии создавать виджеты и что-то еще, но не мог сделать одну вещь.Например, наша игра содержит класс Player.Я создал фиктивный плеер в main.cpp и впоследствии попытался сделать так, чтобы информация об игроках отображалась на ярлыке одним нажатием кнопки.После многочисленных попыток я смог сделать это только путем добавления игрока в mainwindow.cpp.Есть ли способ отобразить информацию об игроке, сделанном в main.cpp?Как можно было бы сделать данные доступными для разных окон, таких как окно битвы, окно инвентаря и т. Д.

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Хорошо, если main.cpp настолько прост, насколько это возможно, в вашем случае он не должен содержать много кода.

Если я правильно понимаю, у вас есть несколько окон (может быть просто QWidgets без родителя или QMainWindows), работающих на одном и том же QApplication, и вы хотите обмениваться данными между ними? Почему бы просто не поделиться указателем Player в обоих ваших окнах?

Ваш main.cpp будет выглядеть так:

QApplication app(argc,argv);
YourWindows1 mw1;
YourWindows2 mw2;
Player player;
mw1.setPlayer(&player);
mv2.setPlayer(&player);
mw1.show();
mw2.show();
app.exec();

Более причудливый способ - использовать синглтон. Этот синглтон может владеть и хранить ваш экземпляр Player, каждое окно может получить статический доступ к этому синглтону в любое время для получения информации Player. Это может быть полезным для вас.

ПРИМЕЧАНИЕ: я не вижу точно, в чем здесь проблема, возможно, вы могли бы поделиться более подробной информацией о том, что вызывает у вас проблемы ...

1 голос
/ 27 мая 2011

В типичном приложении Qt main.cpp существует только для запуска единственного объекта пользовательского интерфейса приложения, а затем передает управление обработчику событий Qt. Можно отклониться от этой модели, но если вы не обладаете достаточным опытом работы с Qt, это не то, что было бы рекомендовано.

0 голосов
/ 27 мая 2011

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

class Game{
    Game();
    ~Game();
    int OnExecute();
};

int Game::OnExecute(){
    while(running){
        // do game stuff
    }
    return 0; // No errors, game closed correctly.
}

int main(int argc, char* argv[]){
    Game myGame;
    myGame.OnExecute();
}

Все ваши методы / код инициализации содержатся в функции OnExecute до того, как игра войдет в свой основной цикл.В этом основном цикле while(running) вы переводите вызовы в функции обновления и рендеринга для каждого кадра, которые управляют логическими вычислениями, такими как положение объекта, обновление физики, обновление ИИ и т. Д., А затем вы визуализируете все для этого кадра.Это, очевидно, ультра-упрощенная стратегия, но она определенно помогла мне понять, как именно работают игровые движки.

Теперь, что касается Qt, я попробовал именно то, что вы пытаетесь, и это не легко.Qt, хотя он может быть настроен для работы с внутриигровыми интерфейсами и т.п., мне кажется, в первую очередь предназначен для использования в приложениях, а не в играх.Он обеспечивает отличную функциональность, если вам нужны простые формы и кнопки в вашей программе, но если вам нужны индивидуально разработанные HUD и тому подобное, вам нужно искать в другом месте, чтобы избавить себя от множества хлопот.Однако существует огромное количество расширяемых графических библиотек, специально предназначенных для игр.Я бы посоветовал искать тот, который основан просто на OpenGL, так как большинство графических / игровых движков построены на нем и будут довольно хорошо интегрироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...