Главная страница
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.033 c
3-1138185122
raferty
2006-01-25 13:32
2006.03.19
Русский язык и MySQL 5.0.18


3-1138164463
TimScorp
2006-01-25 07:47
2006.03.19
Проверка условий в БД.


15-1141018363
Ega23
2006-02-27 08:32
2006.03.19
С Днём рождения! 27 февраля


15-1141029035
syte_ser78
2006-02-27 11:30
2006.03.19
Как стать провайдером?


5-1127369126
Vcoder
2005-09-22 10:05
2006.03.19
Динамический массив в методе компонента