2012-03-18 5 views
4

Я хотел бы знать, как обновлять и отображать игровые объекты при использовании Qt. Например. с типичной игрой у вас будет цикл событий, но у Qt только exec(). Каков правильный способ обновления и рендеринга игровых объектов с помощью Qt? Как мне делать такие вещи, как получить время между каждым фреймом для обновления моих игровых объектов? Я использую отдельный поток для всего этого?Обновление/рендеринг игровых объектов с помощью Qt

Мой вопрос очень похож на this thread, за исключением того, что я не пытаюсь избежать стандартных процессов Qt.

Редактировать: Приносим извинения за неполный вопрос. Я считаю, что tmpearce уже ответила на мой вопрос, но вот простой пример того, что я пытаюсь делать в случае, если кто-то есть один и тот же вопрос:

int main(int argv, char **args) 
{ 
    QApplication app(argv, args); 

    ApplicationWindow window; 
    window.show(); 

    // How and where do I update my Game object? 

    return app.exec(); 
} 

class Game 
{ 
public: 
    void timeUpdate() 
    { 
     // Update game entities, etc. Should be called every frame. 
    } 

    void render() 
    { 
     // Renders game entities - where should I render to? 
     // Should be called 30 times a second, etc. 
    } 
}; 

Приветствие.

+0

Ваш «вопрос» слишком широк. Пожалуйста, будьте более конкретными. – Koying

+0

Вы правы, это может быть более конкретным. Я был не уверен, как спросить об этом - я приведу образец кода. – Mitch

+0

Это не очень подходит для этого сообщества. Сначала вы должны исследовать дизайн игрового движка и игровое программирование (для этого есть много хороших книг), тогда совет по дизайну, связанный с дизайном, может быть лучше ответил [http://gamedev.stackexchange.com] (http: //gamedev.stackexchange .com). –

ответ

7

Qt имеет цикл событий; он начинается с QApplication::exec(). Я понятия не имею, каковы ваши требования в отношении обновления и рендеринга; но, поскольку вам кажется, что вам нужен цикл событий, как в «типичной игре», я предполагаю, что вы можете взять его оттуда.

В вашем приложении создайте QTimer. Подключите сигнал timeout к слоту, который вы хотите вызвать в каждом цикле событий. Вызов QTimer::start(0): каждый раз он будет вызывать сигнал timeout через цикл событий.

Что касается времени, проверьте QElapsedTimer - Я подозреваю, что это то, что вы ищете.

+0

Спасибо @tmpearce. Я извиняюсь - я не подразумевал, что у Qt нет цикла событий, несмотря на то, как это могло произойти. Я хотел сказать, что я не знал, как выполнить логику игры в приложении. – Mitch

+1

@mitch Нет проблем. Я думаю, ты на правильном пути. Совет, который я дал о подключении QTimer к слоту, я считаю, что вам не хватает. Создайте 'Game' из' QObject', включите макрос 'Q_OBJECT' в определение класса и определите пользовательский слот (есть много хороших документов о Qt, если вы не знаете, как это сделать уже). Подключите 'QTimer', начиная с' start (0) ', в ваш слот, и теперь вы постоянно обновляете. Вы можете подключить виджеты GUI к своим объектам одинаково, или отправить через мастер-класс «Игра» - в любом случае. – tmpearce

+0

Очень полезно, спасибо. – Mitch

Смежные вопросы