|
本文演示在
http://jx.jlu.edu.cn/down/game.rar
源大哥在CSDN上说了游戏内部逻辑的重要性,我想能不能把逻辑引擎抽象出来,然后用脚本文件去构造游戏整个游戏呢?
无知者无畏.我想了很久,也做了一点.
游戏不过是一些对象,得到输入的事件,进行逻辑运算然后,反馈动作输出.根据这个想法我把游戏划分成了几个模块,
(1)图形引擎以及windows窗口(直接用一个教程的源码)
(2)Bob(图像变换器),用来处理游戏对象的显示画面,预留了3D接口.是游戏对象和引擎的桥梁.
(3)EventManager 事件管理器,用来接收 键盘 鼠标 时间等消息,然后激活相应事件.事件是游戏对象的属性.
(4)游戏对象,是游戏中任何一个元素,精灵,背景,鼠标箭头.他内部拥有一些属性和事件,如果事件被激活而且满足条件,这个对象就执行相应动作.对象可以拥有子对象.
以下是以后准备增加的
(5)声音 (6)网络支持
因为是刚刚开始,引擎只能接受键盘命令和执行一些简单动作,,全部源码等完善一点再给大家拿出来.
以下是用引擎构造游戏的代码,以后应该从脚本文件中生成的,暂时只能硬编码了.
bool CGame::InitialiseEvent(HWND hWnd, HINSTANCE hInst)//这个就是构造游戏的函数
{
//创建一个bob管理器
this->m_pBC=new CBobController(m_pD3DDevice,m_nScreenWidth, m_nScreenHeight);
DWORD id;
DWORD ids[24];
DWORD idso[24];
//创建一个bob2d对象(演示中的精灵),读取bmp
m_pBC->BuildBob2DBegin("Textures\\action.bmp",D3DCOLOR_XRGB(0, 0, 0),24,40,210,200);
m_pBC->BuildBob2DBmpSize(256,128);
//分割图片
for(int i=0;i<3;i++)
for(int j=0;j<8;j++)
{
m_pBC->BuildBob2DAddRect(id,j*24,i*40,24,40);
ids[i*8+j]=i*8+j;
}
for(i=0;i<3;i++)
for(int j=0;j<8;j++)
{
m_pBC->BuildBob2DAddRect(id,(j+1)*24,i*40,-24,40);
idso[i*8+j]=i*8+j+24;
}
//生成动画
m_pBC->BulidBob2DAddAnimation(id,&ids[20],4*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&ids[16],4*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&idso[16],4*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&idso[20],4*sizeof(DWORD));
//stand
m_pBC->BulidBob2DAddAnimation(id,&ids[13],2*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&ids[5],2*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&idso[5],2*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&idso[13],2*sizeof(DWORD));
//go
m_pBC->BulidBob2DAddAnimation(id,&ids[8],5*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&ids[0],5*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&idso[0],5*sizeof(DWORD));
m_pBC->BulidBob2DAddAnimation(id,&idso[8],5*sizeof(DWORD));
m_pBob2D4=m_pBC->BuildBob2DLink(NULL);
m_pBC->BuildBob2DEnd();
//同样的设置鼠标,不过鼠标事件没有在引擎中实现,是通过另外的代码实现的
m_pBC->BuildBob2DBegin("Textures\\Mouse.bmp",D3DCOLOR_XRGB(0, 0, 0),32,32);
m_pBC->BuildBob2DBmpSize(32,32);
m_pBobMouse=m_pBC->BuildBob2DLink(NULL);
m_pBC->BuildBob2DEnd();
//建立事件管理器
this->m_pEvent=new CEventManager(hWnd,hInst);
//建立一个游戏对象
this->m_pComponent=new CComponent;
//游戏对象连接到精灵
this->m_pComponent->LinkBob(m_pBob2D4);
//以下是建立一个 当右箭头按键按下时候 精灵向右下走的事件
//新的事件
CTreeManager* pM=new CTreeManager;
//增加动作,bob向右下移动每单位时间(4,3)
pM->AddAction(new CActionBobMove(this->m_pComponent,new CList<int>(4),new CList<int>(3)));
//另外的动作,bob播放向右下走的动画
pM->AddAction(new CActionBobPlay(this->m_pComponent,new CList<int>(7)));
//注册键盘事件
this->m_pEvent->AddKeyEvent("asd",DIK_RIGHT,pM,DEF_CHICK);
//把事件连接到游戏对象
this->m_pComponent->AddEvent(pM);
//键盘松开人物停止,播放站着的动画
pM=new CTreeManager;
pM->AddAction(new CActionBobMove(this->m_pComponent,new CList<int>(0),new CList<int>(0)));
pM->AddAction(new CActionBobPlay(this->m_pComponent,new CList<int>(3)));
this->m_pEvent->AddKeyEvent("asd",DIK_RIGHT,pM,DEF_UP);
this->m_pComponent->AddEvent(pM);
//以下省略 重复生成另外3个方向的动画 和esc按键退出的事件
以上看到的就是构造演示动画的代码,虽然看起来还是很罗嗦,但是我相信如果能放到脚本文件中用MFC的编辑起来编辑的话,就不很麻烦.
你会看到当两个方向键同时按的话会有毛病,如国加一个状态变量来保存就能解决了.
以前看到说外国人写的用XML直接写游戏的软件,估计也差不多把.呵呵~
还有很多想说的,等大体上完善点再说吧,祝各位进步,赚钱.祝我自己考试不要挂太多了
[em17]明天还有期末考啊 [em17] |
|