/*********************************
[学VC编游戏]
编著、程序设计:唐明理 2004.7
E-mail: cqtml@163.com
**********************************/
#include "stdafx.h"
#include "game.h"
JCDZ zjdz[6]={0,5,40,10,120,10,200,10,280,10,360,5};//人动作结构400幅
//0站,1走, 2刺, 3劈, 4倒 5尸
JCDZ zjdw[6]={0,5,40,10,120,10,200,10,280,10,360,5};//兽动作结构400幅
//0站,1走, 2跑, 3斗, 4倒, 5尸
unsigned short dw[7][6]={0,1,1,3,4,5, //0豹,无跑
0,1,2,3,4,5, //1狼,
0,1,1,3,4,5, //2猪,无跑
0,1,2,3,4,5, //3鹿,
0,2,2,2,4,5, //4马,无走、斗
0,1,1,1,4,5, //5羊,无跑、斗
0,1,1,3,4,5 //6雀,无跑
};
unsigned short smz[2][7]={60,50,30,20,40,10,15,//生命值
10 ,8 ,6 ,3 ,5 ,1 ,2 };//攻击力
//兽[0豹1狼2猪3鹿4马5雀6羊]
////////////////////////////////////////////////////////////////////////////
game:: game(){} //构造函数
game::~game(){} //析构函数
//****************************************************************
// A、 init() 初始化,建立图形处理环境
// BkDC0-装载背景地面
// BkDC1-在此生成即时场景,在1个时钟周期后翻转到当前显示屏。
// MemDC-调入的对象图片。
//****************************************************************
BOOL game::init()//初始化
{ if(!InitDDraw()) //初始化DirectDraw环境。
return FALSE;
hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL); //创建屏幕设备句柄
MemDC =CreateCompatibleDC(hScrDC); //创建对象设备句柄
hBMP0 =CreateCompatibleBitmap(hScrDC,100,100); //创建位图内存
hBMP1 =CreateCompatibleBitmap(hScrDC,100,100); //创建位图内存
hDC0 =CreateCompatibleDC(hScrDC);
hDC1 =CreateCompatibleDC(hScrDC);
SelectObject(hDC0, hBMP0);
SelectObject(hDC1, hBMP1);
/////////////////////////////////////////////////////////////////////////
GetCurrentDirectory(256,appdir);
Font.CreateFont(-4,0,0,0,400,0,0,0,134,0,0,0,0,LPCTSTR("impact"));
mansmz[0]=200;mansmz[1]=5;mansmz[2]=10;mansmz[3]=20;mansmz[4]=0;
da=0;
dir=appdir;
if(dir.Right(8)=="运行程序")
dir="图片/";
else
dir="../运行程序/图片/"; //图片路径
sys=getsys(); //取当前系统
rs=0; //对象数置0
edi=0; //非编辑态
scrx=0;scry=0;
stmp=NULL;rtmp=NULL;jtmp=NULL;
find_p=0; //无搜索0有搜索1
SCRP0=5; //默认地图的是显示区5倍
rBlend.BlendOp = AC_SRC_OVER; //
rBlend.BlendFlags = 0; //
rBlend.AlphaFormat = 0; //
rBlend.SourceConstantAlpha=140;
return TRUE;
}
//**************************************************
// exit() 退出, 删除图形处理环境
//**************************************************
void game::exit()//退出
{ if(stmp!=NULL) delete[] stmp;//删除兽资源包
if(rtmp!=NULL) delete[] rtmp;//删除人资源包
if(jtmp!=NULL) delete[] jtmp;//删除景资源包
DeleteDC(hDC0);
DeleteDC(hDC1);
DeleteObject(hBMP0);
DeleteObject(hBMP1);
DeleteDC(MemDC); //删除对象设备句柄
DeleteDC(hScrDC); //删除屏幕设备句柄
}
//****************************************************
// getsys()//识别操作系统
// 使用TransparentBlt()透明显示的需要;
// 是WIN2000,直接调用TransparentBlt();否则调用自编的。
//****************************************************
int game::getsys()//识别操作系统
{ OSVERSIONINFO stOSVI ;
ZeroMemory(&stOSVI , sizeof ( OSVERSIONINFO )) ;
stOSVI.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO ) ;
GetVersionEx ( &stOSVI);
int a=0;
if (stOSVI.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS &&
(stOSVI.dwMajorVersion>4||(stOSVI.dwMajorVersion==4
&& stOSVI.dwMinorVersion>0)))
a=1;// rec="Windows98";
if (VER_PLATFORM_WIN32_NT==stOSVI.dwPlatformId&&stOSVI.dwMajorVersion>=5)
a=2;// rec="Windows2000";
if (VER_PLATFORM_WIN32_NT==stOSVI.dwPlatformId&&stOSVI.dwMajorVersion==4)
a=3;// rec="WindowsNT4.0";
if (VER_PLATFORM_WIN32_NT==stOSVI.dwPlatformId)
a=4;// rec="WindowsNT";
return a;
}
//**********************************************************
// inscreer(int i)//在显示区?
//**********************************************************
BOOL game::inscreer(int i)//在显示区?
{ int xs=man[i].xix-scrx-man[i].w/2; //x当前位置
int ys=man[i].xiy-scry-man[i].h; //y当前位置
if(xs>(-man[i].w+2)&&xs<WIDTH&&ys>(-man[i].h+10)&&ys<HEIGHT)
return TRUE;
else return FALSE;
}
//**************************************************
// setobj(int q) 对象显示
// 调入由man[q].lb指出的,不同的man[q].p图片,和偏移值。
// 将对象q在各自的当前位置x,y上以透明方式TransparentBlt2显示。
// 之后进行移动或方位转换的功能。
// 为防止闪烁,所有对象先显示在暂存区BkDC1,一屏完成后再翻转到主屏上。
//**************************************************
void game::Alphasetobj(int q,int a)//对象显示
{ if(a==1&&man[q].lb==2) return;
if(man[q].zs>5) //生命值
{Delete(q);return;} //删除对象返回
CString cc;
int x=man[q].xix-scrx-man[q].w/2; //x当前位置
int y=man[q].xiy-scry-man[q].h; //y当前位置
if(inscreer(q))//在显示区?
{if(getpic(q,0)==FALSE) return; //调图形,出错返回
if(man[q].lb<2)//调角色的偏移位置
{int x0=0,y0=0;
if(man[q].lb==0) {x0=rbufx[man[q].p];y0=rbufy[man[q].p];}
if(man[q].lb==1) {x0=sbufx[man[q].p];y0=sbufy[man[q].p];}
if(man[q].fw>4) x0=w-x0;//是东北、东、东南方位
x=man[q].xix-scrx-x0;
y=man[q].xiy-scry-y0;
}
rect.left=0,rect.top=0,rect.right=w,rect.bottom=h;
if(a==0)//DX
{if(DXSBack1->BltFast(x+SCRW,y+SCRH,DXSgonh,&rect,
DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)!=DD_OK) return;//在缓存区1上透明显示
return;
}
else Alpha(x,y);
mans++;
}
///////////////////////////////////////////////////////////////////////
if(man[q].lb>=2) return;
else manmove(q); //活动对象的移动
//生命值==================================================================
if(man[q].zd==1) setxtx(q,x,y); //正在打时,调显示生命值函数
if(man[q].zs>4)//生命值
{man[q].smz=man[q].smz-1; //动物死后,smz用于尸体消失计数
if(man[q].smz<-200) {man[q].smz=0;man[q].p++;}
}
else
//========================================================================
man[q].p++; //下一动作
if(man[q].p>=man[q].m1) {bianfw(q);}//本动作完成,进行方位转换
}
void game::Alpha(int x,int y)//DX
{ HDC hdc;
if ( DXSBack1->GetDC(&hdc) != DD_OK) return;
BitBlt(hDC0,0,0,w,h,hdc,x+SCRW,y+SCRH,SRCCOPY);
BitBlt(hDC1,0,0,w,h,hdc,x+SCRW,y+SCRH,SRCCOPY);
DXSBack1->ReleaseDC(hdc);
if ( DXSgonh->GetDC(&hdc) != DD_OK) return;
TransparentBlt2(hDC1,0,0,w,h,hdc,0,0,w,h,RGB(255,255,255));//透明显示
AlphaBlend(hDC1,0,0,w,h,hDC0,0,0,w,h,rBlend);//半透明处理
BitBlt(hdc,0,0,w,h,hDC1,0,0,SRCCOPY);
DXSgonh->ReleaseDC(hdc);
if(DXSBack1->BltFast
(x+SCRW,y+SCRH,DXSgonh,&rect,DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY)!=DD_OK) return;//在缓存区1上透明显示
}
///////////////////////////////////////////
//setxtx(int q,int x,int y)显示生命值函数
// 在[x,y]位置显示当前对象q的生命值和攻击力
// 生命值用颜色表示;按赤、橙、黄、绿、蓝、青、紫、从低到高表示。
// 攻击力用星表示;星越多攻击力越高。
///////////////////////////////////////////
void game::setxtx(int q,int x,int y)//显示生命值函数
{ if(man[q].lb==0) return;
CString cc;
COLORREF col;
if(smz[1][man[q].js]>8) {cc="●●●●●";goto aa;}//攻击力
if(smz[1][man[q].js]>6) {cc="●●●● ";goto aa;}
if(smz[1][man[q].js]>4) {cc="●●● ";goto aa;}
if(smz[1][man[q].js]>2) {cc="●● ";goto aa;}
cc="● ";
aa: if(man[q].smz>=60) {col=RGB(0x0,0x00,0xff);goto bb;}//生命值
if(man[q].smz>=50) {col=RGB(0x0,0x88,0xff);goto bb;}
if(man[q].smz>=40) {col=RGB(0x0,0xff,0xff);goto bb;}
if(man[q].smz>=30) {col=RGB(0x0,0xff,0x88);goto bb;}
if(man[q].smz>=20) {col=RGB(0xff,0xff,0x0);goto bb;}
if(man[q].smz>=10) {col=RGB(0xff,0x88,0x0);goto bb;}
col=RGB(0xff,0x0,0x0);
bb: HDC hdc; //设备环境句柄
if (DXSBack1->GetDC(&hdc) != DD_OK) return;//打开DXSBack1面
CDC* dc = CDC::FromHandle (hdc);
CFont *pOldFont;
pOldFont=dc->SelectObject(&Font); //设置字体为4号impact体
dc->SetBkColor(col); //字底色
dc->SetTextColor(RGB(0x0,0x0,0x0));//
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
VC++人物格斗游戏模块代码,编写此功能需要使用以下知识: 1.对象的新属性:生命值、攻击力。 2.对象生命值的显示。 3.打斗时生命值的改变。 4.在场景中添加物品。 游戏测试操作的方法: A、在场景内点任意点,指挥主角移动。 B、将鼠标移到场景外,可以移动地图。 C、在微缩地图上点一下,可以快速定位。 D、ESC键,退出游戏。 你可以指挥主角去打猎了。
资源推荐
资源详情
资源评论
收起资源包目录
Yeah-really-fight.rar (61个子文件)
真的打呀
DX游戏类库
game_地图.h 811B
Game.cpp 23KB
常数定义.h 1KB
Game.h 9KB
搜索算法.CPP 3KB
搜索算法.H 2KB
game_地图.cpp 8KB
game_寻路.h 672B
game_寻路.cpp 10KB
游戏类库
编辑.h 790B
game_地图.h 933B
Game.cpp 19KB
常数定义.h 875B
Game.h 3KB
搜索算法.CPP 3KB
搜索算法.H 2KB
game_地图.cpp 8KB
game_寻路.h 667B
编辑.cpp 14KB
game_寻路.cpp 9KB
真的打呀.h 1KB
GETMAP.CPP 3KB
真的打呀.dsw 541B
RES
再快一点.rc2 400B
CURSOR2.CUR 2KB
CURSOR3.CUR 2KB
再快一点.ico 3KB
CURSOR0.CUR 766B
真的打呀.ico 3KB
CURSOR1.CUR 2KB
真的打呀.rc2 400B
BITMAP1.BMP 1KB
地图
12X12.MAP 36KB
bb.map 1KB
5X5.MAP 6KB
5X5.BMP 31KB
2X2.BMP 31KB
aaa.map 2KB
12X12.BMP 31KB
GAME0.MAP 295B
GAME0.DAT 68B
Music1.mid 24KB
XMUSIC3.MID 31KB
2X2.MAP 1KB
aaa.dat 72B
2X2.DAT 2KB
5X5.DAT 5KB
bb.dat 192B
12X12.DAT 10KB
真的打呀Dlg.h 2KB
真的打呀.rc 7KB
StdAfx.cpp 248B
GETMAP.H 1KB
真的打呀.cpp 2KB
真的打呀.dsp 5KB
RESOURCE.H 1KB
StdAfx.h 1KB
TEST.DSW 541B
TEST.positions 142B
真的打呀.clw 2KB
真的打呀Dlg.cpp 11KB
共 61 条
- 1
资源评论
APei
- 粉丝: 63
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功