📄 走四方dlg.cpp
字号:
DeleteObject(bit); //删除暂存设备相关位图
DeleteDC(DCBak); //删除地图设备场景
//////////////////////////////////
CDialog::OnCancel();
}
void CMyDlg::OnTimer(UINT nIDEvent) //时钟函数,[类向导中定义生成]
{ CClientDC dc(this);
//A、用地图刷新窗口;将DCBak指向的位图拷贝到dc.m_hDC指向的当前窗口内存
int wid=rect.Width(); //当前窗口宽
int hei=rect.Height(); //当前窗口高
BitBlt(dc.m_hDC,0,0,wid,hei,DCBak,0,0,SRCCOPY);//用地图刷新窗口
//B、角色移动
manmove(0); //角色移动
//C、调角色图片到MemDC
if(getpic("人",man[0].p)==FALSE) //调角色图片
{AfxMessageBox(cc+"没找到!");return;}
SelectObject(MemDC,bit); //调入的位图关联到角色设备场景
//D、调角色的位置偏移位置
int x,y;
if(man[0].lb!=2)//不是景,景是静物没有偏移位置
{int x0=0,y0=0;
if(man[0].lb==0) {x0=rbufx[man[0].p];y0=rbufy[man[0].p];}
if(man[0].lb==1) {x0=sbufx[man[0].p];y0=sbufy[man[0].p];}
if(man[0].fw>4) x0=w-x0; //是东北、东、东南方位
x=man[0].xix-x0; //对象显示的x位置
y=man[0].xiy-y0; //对象显示的y位置
}
//E、透明显示
TransparentBlt2(dc.m_hDC,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));//透明显示
//F、下一动作
man[0].p++; //下一动作
if(man[0].p>=man[0].m1) //若本动作完成
bianfw(0); //进行方位转换
CDialog::OnTimer(nIDEvent);
}
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)//取针对主角的目标位置,[类向导中定义生成]
{
int x=point.x,y=point.y;
man[0].x0=x; //获得目标位置x
man[0].y0=y; //获得目标位置y
man[0].p=man[0].m1-1; //中止当前动作
CDialog::OnLButtonDown(nFlags, point);
}
//**************************************************
// getpic(CString cc,int p) 调图片到相关位图
// 由p得到将调的图形文件名。
// 在指定目录中调入图形到相关位图bit
// 调入动物的图形偏移值
//**************************************************
BOOL getpic(CString cc,int p)//调图片到相关位图[3章]
{ char name[256];
//A、调cc指定的图形
SetCurrentDirectory(appdir); //置当前目录
sprintf(name,"%s%s/c%05d.bmp",dir,cc,p);//生成将调的图形文件名
loadbmp(name); //调BMP图片
//B、调cc指定的图形的偏移值。
sprintf(name,"%s%s/c%05d.txt",dir,cc,p);
FILE *f;
f=fopen(name,"r");
if(f!=NULL)
{if(cc=="人") fscanf(f,"%d,%d",&rbufx[p],&rbufy[p]);//人的偏移量
if(cc=="兽") fscanf(f,"%d,%d",&sbufx[p],&sbufy[p]);//兽的偏移量
fclose(f);
}
return TRUE;
}
//**************************************************
// loadbmp(CString cc)//调BMP图片
// 调cc指定的图形;取得的图形在设备相关位图bit中
// 图形的宽、高存于全局变量w,h中
//**************************************************
BOOL loadbmp(CString cc)//调BMP图片[2章]
{ DeleteObject(bit); //删除上次的位图内存。
bit=(HBITMAP)LoadImage //调入cc指定的图形
(AfxGetInstanceHandle(),//
cc, //文件名
IMAGE_BITMAP, //位图方式
0, //图形宽
0, //图形高
LR_LOADFROMFILE|LR_CREATEDIBSECTION//方式
);
if(bit==NULL) return FALSE; //调图失败
DIBSECTION ds; //
BITMAPINFOHEADER &bm = ds.dsBmih; //
GetObject(bit,sizeof(ds),&ds); //取位图的信息->bminfo
w = bm.biWidth; //得到位图宽度值
h = bm.biHeight; //得到位图高度值
return TRUE;
}
//**************************************************
// TransparentBlt2 (......)透明显示
// 根据关键色,将hdc1中的图形在hdc0中
// 自动生成掩模,并生成透明图形。
//注:TransparentBlt(......)是一个WIN API函数,功能和这里的相同。在WIN2000和
// 以后的系统上可用。在WIN98中有严重的资源泄漏,根本不能用。
// 所谓的资源泄漏:
// 你把下面TransparentBlt2最后6句注释掉就可看到。
// 要使用TransparentBlt(......)前,请引用:
// #include <wingdi.h>
// #pragma comment (lib,"msimg32.lib")
//**************************************************
void TransparentBlt2( HDC hdc0, // 目标DC
int nX0,int nY0,// 目标偏移
int nW0,int nH0,// 目标宽高度
HDC hdc1, // 源DC
int nX1,int nY1,// 源起点
int nW1,int nH1,// 源宽高度
UINT Tcol // 透明色,COLORREF类型
) //透明显示[4章]
{ HBITMAP hBMP =CreateCompatibleBitmap(hdc0,nW0, nH0); // 创建位图内存
HBITMAP mBMP =CreateBitmap(nW0,nH0,1,1,NULL); // 创建单色掩码位图
HDC hDC =CreateCompatibleDC(hdc0); //创建设备句柄
HDC mDC =CreateCompatibleDC(hdc0); //创建设备句柄
HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
// 将源DC中的位图拷贝到临时DC中
if (nW0==nW1&&nH0==nH1)
BitBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,SRCCOPY);
else
StretchBlt(hDC,0,0,nW0,nH0,hdc1,nX1,nY1,nW1,nH1,SRCCOPY);
SetBkColor(hDC, Tcol);// 设置透明色
BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);//生成透明区域为白色,其它区域为黑色的掩码位图
SetBkColor(hDC, RGB(0,0,0)); //生成透明区域为黑色,其它区域保持不变的位图
SetTextColor(hDC, RGB(255,255,255)); //白色
BitBlt(hDC,0,0,nW0,nH0,mDC,0,0,SRCAND);
SetBkColor(hdc0,RGB(255,255,255)); //透明部分保持屏幕不变,其它部分变成黑色
SetTextColor(hdc0,RGB(0,0,0)); //黑色
BitBlt(hdc0,nX0,nY0,nW0,nH0,mDC,0,0,SRCAND); //"与"运算,在hdc0生成掩模
BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT); //"或"运算,生成最终透明效果
SelectObject(hDC, oldBMP); //以下为释放资源
DeleteDC(hDC); //
SelectObject(mDC, oldmBMP); //
DeleteDC(mDC); //
DeleteObject(hBMP); //
DeleteObject(mBMP); //
}
//**************************************************
// manmove(int i) 活动对象的移动
// 由当前、目标位置的差,计算当前位置向不同方位的改变。
//**************************************************
void manmove(int i)//活动对象的移动[5章]
{ int stx,sty,qx,qy;
switch(man[i].zs)
{case 2: {stx=9;sty=6;break;}//跑步长
case 1: {stx=4;sty=2;break;}//走步长
default:{stx=2;sty=1;break;}
}
qx=man[i].x0-man[i].xix; //x当前、目标位置差
qy=man[i].y0-man[i].xiy; //y当前、目标位置差
if (qx==0&&qy==0)
{
return ; //到达返回
}
int qxa=abs(qx); //x位置差绝对值
int qya=abs(qy); //y位置差绝对值
if(qxa<stx) stx=qxa; //位置差不足步长,步长为差
if(qya<sty) sty=qya; //
if(qx!=0) man[i].xix+=qxa/qx*stx;//当前位置加步长
if(qy!=0) man[i].xiy+=qya/qy*sty;//[qya/qy]单位绝对值
//以下是不同方位位置变化的直观表示,作用与上式相同
/* if(qx>0) man[i].xix+=stx; //向东走;若下面qy>0,就是东南方向了。
if(qy>0) man[i].xiy+=sty; //向南走
if(qx<0) man[i].xix-=stx; //向西走
if(qy<0) man[i].xiy-=sty; //向北走*/
}
//**************************************************
// bianfw(int q)//方位转换
// 由当前、目标位置的差,计算活动图形的方向取向。
//**************************************************
void bianfw(int q)//方位转换[5章]
{ int qx=man[q].x0-man[q].xix; //x当前,目标位置差
int qy=man[q].y0-man[q].xiy; //y当前,目标位置差
if(qx==0&&qy==0)
{man[q].zs=0; //为0,动作为站,方位保留
goto aa;
}
man[q].zs=1;
if(qx<0&&qy>0) {man[q].fw=1;goto aa;}//取西南向
if(qx<0&&qy<0) {man[q].fw=3;goto aa;}//取西北向
if(qx>0&&qy<0) {man[q].fw=5;goto aa;}//取东北向
if(qx>0&&qy>0) {man[q].fw=7;goto aa;}//取东南向
if (qy>0) {man[q].fw=0;goto aa;}//取南向
if(qx<0) {man[q].fw=2;goto aa;}//取西向
if (qy<0) {man[q].fw=4;goto aa;}//取北向
if(qx>0) {man[q].fw=6;goto aa;}//取东向
aa: setman(q); //设置活动对象初值
}
//**************************************************
// setman(int q) 设置活动对象初值
// 由给定的对象、方位、动作计算出图形的位置和数量。
//**************************************************
void setman(int q)//设置活动对象初值[5章]
{ int a=400;
man[q].m0=man[q].js*a+zjdz[man[q].zs].qi
+man[q].fw*zjdz[man[q].zs].bc;//位置初值
man[q].m1=zjdz[man[q].zs].bc+man[q].m0; //位置终值
man[q].p=man[q].m0; //计数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -