K多媒体111朱在吉综合作业报告.docx
《K多媒体111朱在吉综合作业报告.docx》由会员分享,可在线阅读,更多相关《K多媒体111朱在吉综合作业报告.docx(37页珍藏版)》请在冰豆网上搜索。
K多媒体111朱在吉综合作业报告
成绩
南京工程学院
游戏编程基础课程
综合作业说明书
题目RPG游戏游戏设计
班级K多媒体111
学生姓名朱在吉
学号240111338
2014年12月30日
一、程序功能与设计思路
整体设计目标:
含有游戏场景、游戏角色、动作控制、动画、交战(可选)、人工智能、音效(可选)、网络支持(可选)等各部分内容,界面风格及应用方法自己根据游戏的特色综合考虑。
1.游戏实现功能说明:
1.切换至战斗场景
2.切换至特殊战斗场景(完成后加载下一地图)
3.切换至商店场景。
4.切换至结束场景。
5.关卡偏移,重读关卡场景(一般用于门)。
6.升级场景。
7.死亡场景。
2.界面效果显示:
3.主界面设计思路(简单结构框图):
游戏主要界面
升级场景
两种战斗场景
第二关场景
第一关场景
最终胜利
死亡场景
二、相关原理知识介绍
实现的原理说明:
游戏程序中计算机角色的思考与行为,实际上是对各种不同事件进行分析思考,然后根据不同的情况作出相应的反应。
我们可以利用“if-else”条件句以及“switch-case”语句这类的判断式来完成。
voidSenceMove(HWNDhwnd,HDChdc,HDCmemDC,intScreen)
{
switch(Screen)
{
case1:
//战?
斗·场?
景°
{
PaintBattle(hwnd,hdc,memDC);
}break;
case2:
//特?
殊篴战?
斗·场?
景°
{
PaintBattle(hwnd,hdc,memDC);
toolgate++;
_sleep(500);
InvalidateRect(hwnd,NULL,FALSE);
ZeroMemory(maps,sizeof(maps));
TCHARtogate[256];
ZeroMemory(togate,sizeof(togate)/sizeof(TCHAR));
wsprintf(togate,TEXT("%d.map"),toolgate);
FILE*fp;
fp=fopen(togate,"r+");
fread(maps,sizeof(MAP),320,fp);
fclose(fp);
LoadMap(hdc,memDC);
SenceMove(hwnd,hdc,memDC,maps[hero.x][hero.y].Global);
}break;
case3:
//商Θ?
店台?
读á取?
{
}break;
case4:
{
PaintEnd(hwnd,hdc,memDC);//读á取?
结á束?
场?
景°
}break;
case5:
//关?
卡¨偏?
移?
门?
楼¥梯琘,?
场?
景°读á取?
{
switch(maps[hero.x][hero.y].Events)
{
case35:
toolgate++;
break;
case36:
toolgate--;
break;
default:
break;
}
ZeroMemory(maps,sizeof(maps));
TCHARtogate[256];
ZeroMemory(togate,sizeof(togate)/sizeof(TCHAR));
wsprintf(togate,TEXT("%d.map"),toolgate);
FILE*fp;
fp=fopen(togate,"r+");
fread(maps,sizeof(MAP),320,fp);
fclose(fp);
LoadMap(hdc,memDC);
InvalidateRect(hwnd,NULL,FALSE);
}break;
case99:
//升级?
场?
景°
{
_sleep(500);
PaintLevel(hwnd,hdc,memDC);
}break;
case100:
//死à亡?
场?
景°
{
PaintDead(hwnd,hdc,memDC);
}break;
default:
break;
}
}
voidHeroPaint(HDChdc,HDCmemDC)//英?
雄?
行D走?
voidLoadMap(HDChdc,HDCmemDC)//读á取?
地?
图?
voidMain_OnKey(HWNDhwnd,UINTvk,BOOLfDown,intcRepeat,UINTflags)//Main_OnKey
voidSenceMove(HWNDhwnd,HDChdc,HDCmemDC,intScreen)//场?
景°偏?
移?
voidEnemyPaint(HWNDhwnd,HDChdc,HDCmemDC)//场?
景°怪?
物?
读á取?
voidBattleEnemyPaint(HDChdc,HDCmemDC)//战?
斗·画-面?
怪?
物?
读á取?
功能流程图:
游戏开始
第二关
第一关
战斗
失败胜利
英雄死亡场景
英雄加经验
特殊战斗
概率
英雄升级
进入商店
与大魔王对战
失败
游戏结束
胜利
三、设计步骤说明
1.开发环境配置(路径、头文件、静态或动态链接库等):
头文件:
resource.h、OEM.h、map.h、stdafx.h
2.全局以及局部的各种变量说明
3.自定义类及其成员函数的说明
怪物
英雄
4.实现功能的关键代码及代码含义。
POINThero;//英?
雄?
坐?
标
MAPmaps[20][16];
inttoolgate=1;
intMkeydown=0;//0无T1下?
2左哩?
3上?
4右?
intidown=0,iup=0,ileft=0,iright=0;
TCHARmoney[256];
TCHARlose[256];
voidMain_OnPaint(HWNDhwnd)
{
HINSTANCEhi=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
PAINTSTRUCTps;
HDChdc;
hdc=BeginPaint(hwnd,&ps);
HDCmemDC=CreateCompatibleDC(hdc);
HDCmemDC2=CreateCompatibleDC(hdc);
if(maps[hero.x][hero.y].Events!
=0)
{
//场?
景°偏?
移?
SenceMove(hwnd,hdc,memDC,maps[hero.x][hero.y].Global);
}
else
{
//Map
HBITMAPBitMap=LoadBitmap(hi,MAKEINTRESOURCE(IDB_WALL));
SelectObject(memDC,BitMap);
LoadMap(hdc,memDC);
DeleteObject(BitMap);
//Hero
HBITMAPHero=LoadBitmap(hi,MAKEINTRESOURCE(IDB_HERO));
SelectObject(memDC,Hero);
HeroPaint(hdc,memDC);
DeleteObject(Hero);
//Enemy
EnemyPaint(hwnd,hdc,memDC);
}
ReleaseDC(hwnd,memDC);
EndPaint(hwnd,&ps);
}
//////////////////////////////////////////////////////////////////////////
//英?
雄?
行D走?
voidHeroPaint(HDChdc,HDCmemDC)
{
switch(Mkeydown)
{
case0:
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERODOWN,RGB(0,0,0));
}break;
case1:
//下?
{
if(idown%3==0)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERODOWN,RGB(0,0,0));
}
elseif(idown%3==1)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERODOWN1,RGB(0,0,0));
}
elseif(idown%3==2)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERODOWN2,RGB(0,0,0));
}
}break;
case2:
//左哩?
{
if(ileft%3==0)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HEROLEFT,RGB(0,0,0));
}
elseif(ileft%3==1)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HEROLEFT1,RGB(0,0,0));
}
elseif(ileft%3==2)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HEROLEFT2,RGB(0,0,0));
}
}break;
case3:
//上?
{
if(iup%3==0)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HEROUP,RGB(0,0,0));
}
elseif(iup%3==1)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HEROUP1,RGB(0,0,0));
}
elseif(iup%3==2)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HEROUP2,RGB(0,0,0));
}
}break;
case4:
//右?
{
if(iright%3==0)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERORIGHT,RGB(0,0,0));
}
elseif(iright%3==1)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERORIGHT1,RGB(0,0,0));
}
elseif(iright%3==2)
{
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERORIGHT2,RGB(0,0,0));
}
}break;
default:
TransparentBlt(hdc,32*hero.x,32*hero.y,32,31,memDC,HERODOWN,RGB(0,0,0));
break;
}
}
//读á取?
地?
图?
voidLoadMap(HDChdc,HDCmemDC)
{
inti,j;
for(i=0;i<20;i++)
{
for(j=0;j<15;j++)
{
switch(maps[i][j].Expect)
{
case0:
TransparentBlt(hdc,32*i,32*j,32,32,memDC,EXPECT1,RGB(255,255,255));
break;
case1:
TransparentBlt(hdc,32*i,32*j,32,32,memDC,EXPECT2,RGB(255,255,255));
break;
......
......
case8:
TransparentBlt(hdc,32*i,32*j,32,32,memDC,EXPECT9,RGB(255,255,255));
break;
case9:
//////////////////////////////////////////////////////////////////////////
//树骸?
背?
景°此?
处鋦错洙?
误ó
TransparentBlt(hdc,32*i,32*j,32,32,memDC,EXPECT7,RGB(255,255,255));
//////////////////////////////////////////////////////////////////////////
TransparentBlt(hdc,32*i,32*j,32,32,memDC,EXPECT10,RGB(255,255,255));
break;
default:
break;
}
}
}
}
//Main_OnKey
//E2(材?
质ê2)30生Θ?
命ü药?
水?
31攻¥+32防え?
33武?
器÷34防え?
具?
35上?
楼¥梯琘36下?
楼¥梯琘
voidMain_OnKey(HWNDhwnd,UINTvk,BOOLfDown,intcRepeat,UINTflags)
{
InvalideHero.left=32*(hero.x-2);
InvalideHero.right=32*(hero.x+2);
InvalideHero.top=32*(hero.y-2);
InvalideHero.bottom=32*(hero.y+2);
switch(vk)
{
caseVK_DOWN:
{
if(maps[hero.x][hero.y].Events==0)
{
Mkeydown=1;
if((hero.y<14)&&(!
maps[hero.x][hero.y+1].Block))//碰?
撞?
路·径?
检ì测a
{
hero.y++;
idown++;
if(maps[hero.x][hero.y].Events!
=0)
{
InvalidateRect(hwnd,FALSE,NULL);
return;
}
InvalidateRect(hwnd,&InvalideHero,FALSE);
}
else
{
}
}
elseif(maps[hero.x][hero.y].Events>29)
{
switch(maps[hero.x][hero.y].Events)
{
case30:
{
if(hr.Life<400)
{
hr.Life+=100;
}
else
{
hr.Life=500;
}
}
break;
case31:
{
hr.attack+=20;
}break;
case32:
{
hr.recover+=5;
}break;
case33:
{
hr.addedattack+=20;
}break;
case34:
{
hr.addrecover+=5;
}break;
......
......
case36:
{
HDChdc=GetDC(hwnd);
HDCmemDC=CreateCompatibleDC(hdc);
LoadMap(hdc,memDC);
ReleaseDC(hwnd,memDC);
ReleaseDC(hwnd,hdc);
}break;
default:
break;
}
maps[hero.x][hero.y].Events=0;
InvalidateRect(hwnd,&InvalideHero,FALSE);
}
}break;
caseVK_LEFT:
{
.....
.....
.....
}break;
caseVK_RIGHT:
{
if(maps[hero.x][hero.y].Events==0)
{
Mkeydown=4;
if((hero.x<19)&&(!
maps[hero.x+1][hero.y].Block))
{
hero.x++;
iright++;
if(maps[hero.x][hero.y].Events!
=0)
{
InvalidateRect(hwnd,FALSE,NULL);
return;
}
InvalidateRect(hwnd,&InvalideHero,FALSE);
}
else
{
}
}
elseif(maps[hero.x][hero.y].Events>29)
{
switch(maps[hero.x][hero.y].Events)
{
case30:
......
......
}break;
default:
break;
}
maps[hero.x][hero.y].Events=0;
InvalidateRect(hwnd,&InvalideHero,FALSE);
}
}break;
caseVK_UP:
{
.....
.....
}break;
caseVK_RETURN:
{
if((hr.Life>0)&&(maps[hero.x][hero.y].Events!
=0))
{
maps[hero.x][hero.y].Events=0;
maps[hero.x][hero.y].Global=0;
InvalidateRect(hwnd,NULL,FALSE);
}
}break;
caseVK_ESCAPE:
{
if(IDYES==MessageBox(hwnd,TEXT("确ā?
认?
退?
出?
?
"),TEXT("确ā?
认?
信?
息¢"),MB_YESNO|MB_ICONINFORMATION|MB_DEFBUTTON2))
{
PostQuitMessage(0);
}
}break;
default:
break;
}
}
//////////////////////////////////////////////////////////////////////////
//场?
景°偏?
移?
voidSenceMove(HWNDhwnd,HDChdc,HDCmemDC,intScreen)
{
switch(Screen)
{
case1:
//战?
斗·场?
景°
{
PaintBattle(hwnd,hdc,memDC);
}break;
case2:
//特?
殊篴战?
斗·场?
景°
{
PaintBattle(hwnd,hdc,memDC);
toolgate++;
_sleep(500);
InvalidateRect(hwnd,NULL,FALSE);
ZeroMemory(maps,sizeof(maps));
TCHARtogate[256];
ZeroMemory(togate,sizeof(togate)/sizeof(TCHAR));
wsprintf(togate,TEXT("%d.map"),toolgate);
FILE*fp;
fp=fopen(togate,"r+");
fread(maps,sizeof(MAP),320,fp);
fclose(fp);
LoadMap(hdc,memDC);
SenceMove(hwnd,hdc,memDC,maps[hero.x][hero.y].Global);
}break;
case3:
//商Θ?
店台?
读á取?
{
}break;
case4:
{
PaintEnd(hwnd,hdc,memDC);//读á取?
结á束?
场?
景°
}break;