Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

Игровой цикл   Найти похожие ветки 

 
Signate ©   (2005-09-12 17:36) [0]

Здраствуйте!
Подскажите как лучше ораганизовать игровой цикл? (обработка клавиш мыши, рендер, игровой процесс)...

Может использовать таймеры или потоки?

Все пишеться на WinApi


 
A22 ©   (2005-09-12 18:34) [1]

ИМХО, потоки только если без них никак. С 1 потоком головной боли меньше...


 
Signate ©   (2005-09-12 20:03) [2]

я хотел узнать как будет рациональней...


 
OSokin ©   (2005-09-13 19:55) [3]

сначала обработка клавиш, потом игровой процесс, потом рендер


 
XProger ©   (2005-09-13 20:57) [4]

http://xproger.mirg.ru/files/src/XTropper.rar
XTropper.dpr смотри, никаких потоков использовать не надо, и никаких delta time в физике.


 
Sphinx ©   (2005-09-13 21:14) [5]

Вот мой вариант...много всего...хотелось сделать поуниверсальней...
 // цикл обработки сообщений системы
 while boolAppRun do
   begin
     // получаем очередное сообщение
     if PeekMessage( recRenderTargetWindow.WindowMessage, 0, 0, 0, PM_REMOVE) then
       // если сообщение есть и получено
       begin
         // если сообщение об уничтожении окна - прервать выполнение цикла
         if recRenderTargetWindow.WindowMessage.message = WM_QUIT then boolAppRun := False;
         // обработать сообщение
         TranslateMessage(recRenderTargetWindow.WindowMessage);
         DispatchMessage(recRenderTargetWindow.WindowMessage);
       end
     else // if PeekMessage - если сообщение отсутствует
       begin
         // вычисляем промежуток времени с прошлого выполнения цикла
         if boolQPSupport then
           begin
             try
               QueryPerformanceCounter(intQPCountCurrent);
               if intQPCountCurrent < intQPCountLast then
                 dTick := (High(Int64) - intQPCountLast + intQPCountCurrent) / intQPFrequency
               else
                 dTick := (intQPCountCurrent - intQPCountLast) / intQPFrequency;
               intQPCountLast := intQPCountCurrent;
             except
               boolQPSupport := False;
               dTick := 0;
               dwLastTick := GetTickCount;
             end;
           end
         else
           begin
             dwCurrentTick := GetTickCount;
             dTick := ((dwCurrentTick - dwLastTick) / 1000);
             dwLastTick := dwCurrentTick;
           end;
         // считаем FPS
         Inc(dwFPSTick);
         dFPSCount := dFPSCount + dTick;
         if dFPSCount > 1.0 then
           begin
             dFPSCount := dFPSCount - 1.0;
             dwFPS     := dwFPSTick;
             dwFPSTick := 0;
           end;        
         // если провалена функция приложения - прервать выполнение цикла
         if Failed(ExecuteFunctionEXE(dTick)) then boolAppRun := False;
         // если окно вывода активно
         if recRenderTargetWindow.WindowActive then
           begin
             // если провалена отрисовка сцены - прервать выполнение цикла
             if Failed(DrawScene) then boolAppRun := False;
           end
         else // if recRenderWin.WindowActive - если окно вывода неактивно
           begin
           end;
       end;

ExecuteFunctionEXE(dTick) - тут идет обработка сцены, передвижения, контроль клавишь (вот состояние клавиш пока что обновляю в этой функции, но думаю вынести в функцию таймера).
DrawScene - собственно отрисовка всей сцены.



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
6-1133432922
xmlBeginner
2005-12-01 13:28
2006.03.19
парсим xml с помощью msxml_tlb.pas


2-1141038241
DesertAlex
2006-02-27 14:04
2006.03.19
try не работает...


9-1126694611
Signate
2005-09-14 14:43
2006.03.19
Управление источником света OpenGL


15-1140675749
начинающий
2006-02-23 09:22
2006.03.19
Публично о личном aka блоги


15-1140901823
unknown
2006-02-26 00:10
2006.03.19
При смене материнской платы придётся покупать Windows