小游戏制作具体实现方案.docx
- 文档编号:11452065
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:40
- 大小:62.54KB
小游戏制作具体实现方案.docx
《小游戏制作具体实现方案.docx》由会员分享,可在线阅读,更多相关《小游戏制作具体实现方案.docx(40页珍藏版)》请在冰豆网上搜索。
小游戏制作具体实现方案
游戏制作
虽然说的很简洁,但这些都是我自己理解之后,一字字打出来的,都是在互联网上找到并总结的。
具体的程序在网上有很多的下载,我也不会很正规的说一大堆。
如果可以写完上面那四个例子,我就可以详细地设计一个龙与地下城风格的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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小游戏 制作 具体 实现 方案