Форум: "Игры";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизИгровой цикл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c