1.1.2游戏主循环
游戏主循环需要处理的是不同状态下游戏的逻辑、渲染以及延时。其中延时是需要尽量精确控制的,它是游戏速度的主要控制方法。当然游戏速度的控制还有许多其他的方法,现有游戏框架仅对固定FPS进行设置。
关于延时部分,其中延时时间是由FPS的设定以及每次循环被游戏逻辑以及渲染消耗的时间所控制,因此需要计算逻辑以及渲染所消耗的时间,再以标准时间减掉消耗的时间才是循环暂停的时间。
首先在循环起始处需要记录循环起始时间,设置变量startTime进行记录。记录的代码如下:
startTime = System.currentTimeMillis();
|
计算延时时间代码如下:
delayTime = startTime + 1000/fps -System.currentTimeMillis();
|
计算后需要判断延时时间是否超过了正常的延时时间,若超过了则delayTime为负值,此时需要修正delayTime为0。
游戏循环代码如下:
public void run() {
// TODO Auto-generated method stub long startTime; long delayTime; while(!threadEnd){ startTime = System.currentTimeMillis(); if(!threadPouse){ switch(gameState){ case GAMESTATE_LOADING: loadingLogic(); break; case GAMESTATE_LOGO: logoLogic(); break; case GAMESTATE_MENU: menuLogic(); break; case GAMESTATE_PLAY: playLogic(); break; case GAMESTATE_END: endLogic(); break; } } render(); try { delayTime = startTime + 1000/fps -System.currentTimeMillis(); if(delayTime < 0){ delayTime = 0; } Thread.sleep(delayTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } |