又开始写代码了

来源:互联网 发布:linux切换进程cpu资源 编辑:程序博客网 时间:2024/03/29 10:02

先建了一个CGame类,把游戏控制的基本部分包装起来。
结构如下:

#pragma once

class CGame
{
public:
     CGame(void);
     ~CGame(void);
     // 开始游戏
     int Start(void);
    private:
     // 游戏消息循环
     int GameLoop(void);
     // 游戏运行状态
     bool bIsRunning;
};


然后把WinMain里面的消息循环放到了GameLoop里面
在WinMain里面原本消息循环的位置调用Game::Start()代替

// // 开始游戏
int CGame::Start(void)
{
 // 读取游戏设置

 // 初始化DirectDraw

 //
 bIsRunning = true;


 return GameLoop();
}

// 游戏消息循环
int CGame::GameLoop(void)
{
 MSG msg;

 while (bIsRunning)
 {
  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  {
   if (msg.message==WM_QUIT)
   {
    //myDebug->OutDebug("Game Terminated.../n");
    //break;
    bIsRunning = false;
   }
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }
 }
 return msg.wParam;
}


消息循环部分还需要修改,在游戏窗口在非活动状态的时候等待消息,以阻塞线程,降低CPU资源占用。
在回调函数WndProc里面,加入检测窗口是否在活动状态的代码:

 case WM_ACTIVATE: //应用程序是否活动
      if(LOWORD(wParam)==WA_INACTIVE)
           geGame.SetActive(false);
          else if(HIWORD(wParam))
      {
           geGame.SetActive(false);
           return 0;
      }
          else
      {
           SetCursor(NULL);
           Game.SetActive(true);
      }

上面的代码有两处SetActive(false),原理是从gpgame的圣剑2 copy的(现在好像个人/小团队开发的游戏都离不开“剑”字)还没搞清原理。不过需要注意的是,从非活动状态恢复的时候,需要重新获取输入、绘图设备等等。

至此CGame类大致的架构已经出来了。源码如下:



//Game.cpp
#include "StdAfx.h"
#include "./game.h"

CGame::CGame(void)
: bIsRunning(false)
, bActive(false)
{
}

CGame::~CGame(void)
{
}

// // 开始游戏
int CGame::Start(void)
{
 // 读取游戏设置

 // 初始化DirectDraw

 // 开始游戏
 bIsRunning = true;
 return GameLoop();
}

// 游戏消息循环
int CGame::GameLoop(void)
{
 MSG msg;

 while (bIsRunning)
 {
  if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  {
   if (msg.message==WM_QUIT)
   {
    bIsRunning = false; //退出游戏
    break;
   }
   TranslateMessage(&msg);
   DispatchMessage(&msg);
  }else if(!bActive){
   WaitMessage(); //等待消息
  }else{
   MainLoop(); //游戏主循环
  }
 }
 return msg.wParam;
}

// 设置窗口是否活动
void CGame::SetActive(bool Active)
{
 bActive = Active;
}

// 游戏主循环,负责更新状态,绘图翻页,响应等
void CGame::MainLoop(void)
{
 return;
}



//Game.h
#pragma once

class CGame
{
public:
 CGame(void);
 ~CGame(void);
 // // 开始游戏
 int Start(void);
private:
 // 游戏消息循环
 int GameLoop(void);
 // 游戏运行状态
 bool bIsRunning;
public:
 // 窗口是否活动状态
 bool bActive;
 // 设置窗口是否活动
 void SetActive(bool Active);
 // 游戏主循环,负责更新状态,绘图,响应等
 void MainLoop(void);
};


下一次就是DirectX的初始化了,深夜3:00了,玩玩横扫千军,然后睡觉。。。

原创粉丝点击