小游戏制作具体实现方案.docx

上传人:b****4 文档编号:6207377 上传时间:2023-05-09 格式:DOCX 页数:40 大小:62.54KB
下载 相关 举报
小游戏制作具体实现方案.docx_第1页
第1页 / 共40页
小游戏制作具体实现方案.docx_第2页
第2页 / 共40页
小游戏制作具体实现方案.docx_第3页
第3页 / 共40页
小游戏制作具体实现方案.docx_第4页
第4页 / 共40页
小游戏制作具体实现方案.docx_第5页
第5页 / 共40页
小游戏制作具体实现方案.docx_第6页
第6页 / 共40页
小游戏制作具体实现方案.docx_第7页
第7页 / 共40页
小游戏制作具体实现方案.docx_第8页
第8页 / 共40页
小游戏制作具体实现方案.docx_第9页
第9页 / 共40页
小游戏制作具体实现方案.docx_第10页
第10页 / 共40页
小游戏制作具体实现方案.docx_第11页
第11页 / 共40页
小游戏制作具体实现方案.docx_第12页
第12页 / 共40页
小游戏制作具体实现方案.docx_第13页
第13页 / 共40页
小游戏制作具体实现方案.docx_第14页
第14页 / 共40页
小游戏制作具体实现方案.docx_第15页
第15页 / 共40页
小游戏制作具体实现方案.docx_第16页
第16页 / 共40页
小游戏制作具体实现方案.docx_第17页
第17页 / 共40页
小游戏制作具体实现方案.docx_第18页
第18页 / 共40页
小游戏制作具体实现方案.docx_第19页
第19页 / 共40页
小游戏制作具体实现方案.docx_第20页
第20页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

小游戏制作具体实现方案.docx

《小游戏制作具体实现方案.docx》由会员分享,可在线阅读,更多相关《小游戏制作具体实现方案.docx(40页珍藏版)》请在冰点文库上搜索。

小游戏制作具体实现方案.docx

小游戏制作具体实现方案

 

游戏制作

 

虽然说的很简洁,但这些都是我自己理解之后,一字字打出来的,都是在互联网上找到并总结的。

具体的程序在网上有很多的下载,我也不会很正规的说一大堆。

如果可以写完上面那四个例子,我就可以详细地设计一个龙与地下城风格的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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2