小游戏制作具体实现方案.docx
《小游戏制作具体实现方案.docx》由会员分享,可在线阅读,更多相关《小游戏制作具体实现方案.docx(40页珍藏版)》请在冰点文库上搜索。
![小游戏制作具体实现方案.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/a9acba04-a214-40ad-bce6-89d18838a87e/a9acba04-a214-40ad-bce6-89d18838a87e1.gif)
小游戏制作具体实现方案
游戏制作
虽然说的很简洁,但这些都是我自己理解之后,一字字打出来的,都是在互联网上找到并总结的。
具体的程序在网上有很多的下载,我也不会很正规的说一大堆。
如果可以写完上面那四个例子,我就可以详细地设计一个龙与地下城风格的MMORPG的游戏,是大型的3D再线游戏。
这是我这次学习游戏编程的毕业论文吧。
这次学习编游戏花了比较长的时间,由2003年12月到2004-5-3。
我的学习主要是上网查找源代和教程,所上的网站是“”,“”。
还有分析程序,看了《VisualC++游戏设计》、《VisualC++网络游戏建模与实现》、《Java游戏程序设计》、《游戏设计概论》。
前言--------------------------------------------------------3
游戏的库函数准备------------------------------------------3
要那些处理------------------------------------------------3
学习总结----------------------------------------------------4
1是简单的射击游戏-----------------------------------------5
具体过程:
----------------------------------------------------------------5
列举这个程序例子:
--------------------------------------------------------5
2是有规模的RPG游戏,但也是很小的-------------------------9
具体过程:
----------------------------------------------------------------9
列举这个程序例子:
--------------------------------------------------------10
3也是RPG游戏,很齐全的-----------------------------------17
具体过程:
----------------------------------------------------------------17
列举这个程序例子:
--------------------------------------------------------26
4最后是一个3D的简单游戏程序------------------------------27
具体过程:
----------------------------------------------------------------27
列举这个程序例子:
--------------------------------------------------------27
独立设计----------------------------------------------------30
大型的3D在线游戏-----------------------------------------30
具体过程:
----------------------------------------------------------------30
列举这个程序例子:
--------------------------------------------------------32
前言
整个游戏程序是由两个部分组成的。
第一是库函数,封装了directx或者openGL。
都是些接口函数,包括图形、声音、影片、3D、输入输出、网络连接等等。
第二个是具体的怎样把“图形、声音、输入输出”出现在你编的程序上,即整个游戏的流程图。
1游戏的库函数准备
编游戏一定要通过库函数或者别人编好的图形输入输出函数来用的。
Directdraw
Direct3D
Directaudio
Directinput
Directplay
Directshow
2要那些处理
Winmain()
Winproc()
Gamemain()
学习总结
我要用几个例子,由简单到复杂的讲述游戏编程的大概。
1是简单的射击游戏,用DirectDraw,DirectAudio两个对象就行了。
就是说只要声音、图片,不用Direct3D、DirectInput。
2是有规模的RPG游戏,但也是很小的,主要用到DirectDraw、DirectAudio、DirectInput。
3也是RPG游戏,很齐全的,分开不同部分有不同功能。
包括显示、战斗和菜单。
用到所有的directx对象,除了Direct3D。
4最后是一个3D的简单游戏程序。
1是简单的射击游戏
具体过程:
它的流程全部在gamemain()函数中,但directX库也少不了。
滚屏完美实现,其中的图片处理。
所有精灵显示完成(画面有些闪烁)
检测碰撞完成。
对精灵的显示做了部分优化。
加入记分部分,左边数字显示搞定。
记分数字显示全部完成,金币的动画显示完成。
开始加入开场及结束画面。
开始结束画面加入完毕
加入暂停部分。
加入游戏结束时的评价。
加入变速部分。
列举这个程序例子:
1游戏的库函数准备
Directdraw
Directaudio
Directinput
2要那些处理
Winmain()
Winproc()
Gamemain()
Winmain.cpp
//----------标准WINMAIN()主函数--------
intWINAPIWinMain()
{t=Game_Init();
if(t!
=0)
{sprintf(buffer,"err%d",t);
MessageBox(my_hwnd,"Game_Init",buffer,MB_OK|MB_ICONQUESTION);
PostQuitMessage(0);
}
//entermaineventloop
while(TRUE)
{if(end==0)
Game_Main();//正常游戏----
elseif(end==1)
game_pause();//游戏暂停------
elseif(end==2)
game_esc();//在游戏中按下ESC键------
elseif(end==3)
game_death();//被敌机打中------------
elseif(end==4)
game_past();//过关了------------
elseif(end==5)
game_over();//打爆机了------------
else
game_begain();//游戏的主菜单----------
}//endwhile
//closedowngamehere
Game_Shutdown();
//returntoWindowslikethis
return(msg.wParam);
}//endWinMain
Gamemain.cpp
//-----------------游戏的主体--------------------
intGamemain(void*parms=NULL,intnum_parms=0)
{if(KEYDOWN(VK_ESCAPE))//是否按下ESC键----------
{Sleep(300);
end=2;//进入菜单2-------------------------
bb=0;}
if(KEYDOWN(VK_RETURN))//是否按下回车键------------
{end=1;//-----------------暂停---------------
bb=0;
gamepause_s.dsbuffer->Play(0,0,0);//播放暂停的声音
Sleep(500);
return
(1);}
STAR_TIME=GetTickCount();
if(KEYDOWN(VK_LEFT)|KEYDOWN(my_left))//是否按下向左的键
{plane.x-=plane_v;
plane.stat=1;}
if(KEYDOWN(VK_RIGHT)|KEYDOWN(my_right))//是否按下向右的键
{plane.x+=plane_v;
plane.stat=2;}
if(KEYDOWN(VK_UP)|KEYDOWN(my_up))//是否按下向上的键
plane.y-=plane_v;
if(KEYDOWN(VK_DOWN)|KEYDOWN(my_down))//是否按下向上的键
plane.y+=plane_v;
//是否越界----------------------------
if(plane.x<2)plane.x=2;
if(plane.x>MMWIDTH)plane.x=MMWIDTH;
if(plane.y<2)plane.y=2;
if(plane.y>MMHEIGHT)plane.y=MMHEIGHT;
//操作我机子弹------------------------
if(plane.num//结束——--------是否发弹-----------
//----是否打中敌机,是否越界---------
if(plane.num>0){}//是否有子弹--------
//结束——-----------操作我机子弹----
//是否生成敌机-----------------------
if(p_e_n//操作敌机---------------------------
if(p_e_n>0){}
//是否有敌机--------------------------
//结束是否有敌机----------------------
//结束对敌机的操作--------------------
//操作敌机子弹------------------------
if(f_e_n>0){}
//结束————操作敌机子弹------------
//显示分数和难度----------------------
lpddsback->Blt();
lpddsback->GetDC(&my_dc);
//显示自己的子弹----------------------
my_rect(108,62,121,88);
if(plane.num>0){}
//显示自己的飞机---------------------
my_rect(plane.stat*50,0,plane.stat*50+50,62);
plane.stat=0;
lpddsback->BltFast();
//显示敌人的子弹----------------------
if(f_e_n>0){}
//显示敌人的飞机机--------------------
if(p_e_n>0){}
//--------------p用来记录幅数---------
p++;
if(p==30)p=0;
//----------------控制时间--------------
while((GetTickCount()-STAR_TIME)<33){}
//------------------------翻页----------
if(FAILED(lpddsprimary->Flip(NULL,DDFLIP_WAIT))){}
//返回----------------------------------
return
(1);}
//-----------endGamemain--------------
2是有规模的RPG游戏
具体过程:
第1天:
写地图编辑器。
第2天:
写地图编译器,制作地图(包括各种宝物,阻挡关系,游戏特殊地点事件)。
第3天:
精灵的行走(阻挡检测,宝物检测),及个地图的NBC连表,和各种菜单制作。
第4天:
战斗和对话的编制。
第5天:
物品的使用,简单的编辑修改,增增减减,以至于代码很乱。
游戏从开始制作到草草完成共用了5天时间(包括地图编辑器),或者说5天5夜。
主流程:
while
(1){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message==WM_QUIT)break;
TranslateMessage(&msg);
DispatchMessage(&msg);
Input();//输入输出}
else
{
switch(GameMessage)
{
case0:
FleshGame();break;//游戏主程序
case1:
FleshFightGame();break;//作战
case2:
FleshMenu();break;//开始菜单
}
}
}
第1天:
写地图编辑器
第2天:
写地图编译器,制作地图(包括各种宝物,阻挡关系,游戏特殊地点事件)
每个单元格32*32;
城堡30*30单元格
森林40*30单元格
废墟30*40单元格
城市60*30单元格
兵器铺20*15单元格
当铺20*15单元格
药铺20*15单元格
酒店20*15单元格
民居20*15单元格
地图结构
ypedefstructMAP
{
char*name;
intwidth;
intheight;//整张地图高宽,名字,掉入地图用
intlandform;//地图场景类型,
boolcm;//判断阻挡,TRUE:
可以行走,FALSE:
阻挡
intbaowu;//宝物编号//0表示没有宝物箱,1表示宝物箱被打开。
2,,3。
。
。
代表宝物编号
NBCLIST*NBCHead;//地图NBC连表
intevent;//图书地点时间编号
};
第3天:
精灵的行走(阻挡检测,宝物检测),及个地图的NBC连表,和各种菜单制作。
每次刷新检测:
{
TOM。
SPEED=8;每4*SPEED检测单元个阻挡。
,:
:
特殊地点事件触发。
与NBC的碰撞,矩形碰撞。
}
每次按KEYBOARD检测:
{
IF(坐标相邻,)检测与NBC对话,是否有宝物箱,
}
ESC:
弹出主菜单
第4天:
战斗和对话的编制
1每次打斗完,加LIFE,和MONEY点。
并检测是否升级,和文字提示。
2将死亡NBC从链中删除。
3B。
损失血=A。
攻击-B。
防御
4对话:
查找字符;“名字+#”,找到记录位置为I,从I开始查找FIRST“{”和第一个“}”,输出{}间字符。
第5天:
物品的使用,简单的编辑修改,增增减减,以至于代码很乱。
TOM。
GETBW
TOM。
USEBW(intBW)
特殊地点的事件:
TOM的初始地点定义,地图连表。
voidFleshEvent()
{
intEMessage=map[tom.pos.y][tom.pos.x].event;
switch(EMessage)
{
case1:
str="兵器铺";
InitMap();map[0][0].NBCHead=BQPnbchead;
tom.pos.x=16;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case2:
str="药铺";
InitMap();map[0][0].NBCHead=YPnbchead;tom.pos.x=10;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case3:
str="当铺";
InitMap();map[0][0].NBCHead=DPnbchead;tom.pos.x=14;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case4:
str="酒店";
InitMap();map[0][0].NBCHead=JDnbchead;
tom.pos.x=9;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case5:
str="民居";
InitMap();map[0][0].NBCHead=MJnbchead;tom.pos.x=10;tom.pos.y=13;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case6:
str="森林";
InitMap();map[0][0].NBCHead=SLnbchead;
tom.pos.x=8;tom.pos.y=1;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case7:
str="城市";
InitMap();map[0][0].NBCHead=CSnbchead;tom.pos.x=45;tom.pos.y=10;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case8:
str="城市";
InitMap();map[0][0].NBCHead=CSnbchead;
tom.pos.x=33;tom.pos.y=11;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case9:
str="城市";
InitMap();map[0][0].NBCHead=CSnbchead;tom.pos.x=32;tom.pos.y=19;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case10:
str="城市";
InitMap();map[0][0].NBCHead=CSnbchead;tom.pos.x=50;tom.pos.y=19;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case11:
str="城市";
InitMap();map[0][0].NBCHead=CSnbchead;
tom.pos.x=24;tom.pos.y=5;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case12:
str="城市";
InitMap();map[0][0].NBCHead=CSnbchead;tom.pos.x=36;tom.pos.y=28;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case13:
str="废墟";
InitMap();map[0][0].NBCHead=FXnbchead;
tom.pos.x=6;tom.pos.y=7;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case14:
str="森林";
InitMap();map[0][0].NBCHead=SLnbchead;
tom.pos.x=9;tom.pos.y=27;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case15:
str="城堡";
InitMap();map[0][0].NBCHead=CBnbchead;tom.pos.x=16;tom.pos.y=28;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
case16:
str="废墟";
InitMap();map[0][0].NBCHead=FXnbchead;tom.pos.x=10;tom.pos.y=36;tom.xpos.x=tom.pos.x*32;tom.xpos.y=tom.pos.y*32;break;
}
}
列举这个程序例子:
Winmain.cpp
Gamemain.cpp
Directaudio.cpp
Directdraw.cpp
Directinput.cpp
还有
Gamemain.h
Directaudio.h
Directdraw.h
Directinput.h
1要那些处理
Winmain.cpp
Gamemain.cpp
程序中只有声音、图形和输入输出的库函数,其他就不用列举了。
下面我会一个一个文件的讲。
首先是winmain.cpp。
Winmain()
{
初始化directX;
游戏的流程;
Gameinit();
Gameloop();
}
Winproc()
{
这里有处理与游戏打交道的消息处理
}
Winmain.cpp是总程序文件,下面的是游戏处理文件gamemain.cpp。
Gamemain()
{
Case1:
擦新游戏卷动画面;break;
Case2:
显示战斗画面;break;
Case3:
显示游戏开始菜单;break;
}
擦新游戏卷动画面
voidFleshGame()
{
FleshMap();//擦地图
FleshEvent();//擦情景
FleshNBC();
FleshMy();
if(talkbar)TalkBar();//进入谈话主程序
if(mainbar)MainBar();//进入对话菜单主程序
lpDDSPriMary->Flip(NULL,DDFLIP_WAIT);
}
显示战斗画面
voidFleshFightGame()
{
staticboolesc=0;
Scanout(esc);
switch(mydi)
{
case0:
//wofang我方
switch(lastselect)
{
case-1:
FleshA();break;
case0:
A