?? 走四方dlg.cpp
字號(hào):
DeleteObject(bit); //刪除暫存設(shè)備相關(guān)位圖
DeleteDC(DCBak); //刪除地圖設(shè)備場(chǎng)景
//////////////////////////////////
CDialog::OnCancel();
}
void CMyDlg::OnTimer(UINT nIDEvent) //時(shí)鐘函數(shù),[類向?qū)е卸x生成]
{ CClientDC dc(this);
//A、用地圖刷新窗口;將DCBak指向的位圖拷貝到dc.m_hDC指向的當(dāng)前窗口內(nèi)存
int wid=rect.Width(); //當(dāng)前窗口寬
int hei=rect.Height(); //當(dāng)前窗口高
BitBlt(dc.m_hDC,0,0,wid,hei,DCBak,0,0,SRCCOPY);//用地圖刷新窗口
//B、角色移動(dòng)
manmove(0); //角色移動(dòng)
//C、調(diào)角色圖片到MemDC
if(getpic("人",man[0].p)==FALSE) //調(diào)角色圖片
{AfxMessageBox(cc+"沒(méi)找到!");return;}
SelectObject(MemDC,bit); //調(diào)入的位圖關(guān)聯(lián)到角色設(shè)備場(chǎng)景
//D、調(diào)角色的位置偏移位置
int x,y;
if(man[0].lb!=2)//不是景,景是靜物沒(méi)有偏移位置
{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; //對(duì)象顯示的x位置
y=man[0].xiy-y0; //對(duì)象顯示的y位置
}
//E、透明顯示
TransparentBlt2(dc.m_hDC,x,y,w,h,MemDC,0,0,w,h,RGB(255,255,255));//透明顯示
//F、下一動(dòng)作
man[0].p++; //下一動(dòng)作
if(man[0].p>=man[0].m1) //若本動(dòng)作完成
bianfw(0); //進(jìn)行方位轉(zhuǎn)換
CDialog::OnTimer(nIDEvent);
}
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point)//取針對(duì)主角的目標(biāo)位置,[類向?qū)е卸x生成]
{
int x=point.x,y=point.y;
man[0].x0=x; //獲得目標(biāo)位置x
man[0].y0=y; //獲得目標(biāo)位置y
man[0].p=man[0].m1-1; //中止當(dāng)前動(dòng)作
CDialog::OnLButtonDown(nFlags, point);
}
//**************************************************
// getpic(CString cc,int p) 調(diào)圖片到相關(guān)位圖
// 由p得到將調(diào)的圖形文件名。
// 在指定目錄中調(diào)入圖形到相關(guān)位圖bit
// 調(diào)入動(dòng)物的圖形偏移值
//**************************************************
BOOL getpic(CString cc,int p)//調(diào)圖片到相關(guān)位圖[3章]
{ char name[256];
//A、調(diào)cc指定的圖形
SetCurrentDirectory(appdir); //置當(dāng)前目錄
sprintf(name,"%s%s/c%05d.bmp",dir,cc,p);//生成將調(diào)的圖形文件名
loadbmp(name); //調(diào)BMP圖片
//B、調(diào)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)//調(diào)BMP圖片
// 調(diào)cc指定的圖形;取得的圖形在設(shè)備相關(guān)位圖bit中
// 圖形的寬、高存于全局變量w,h中
//**************************************************
BOOL loadbmp(CString cc)//調(diào)BMP圖片[2章]
{ DeleteObject(bit); //刪除上次的位圖內(nèi)存。
bit=(HBITMAP)LoadImage //調(diào)入cc指定的圖形
(AfxGetInstanceHandle(),//
cc, //文件名
IMAGE_BITMAP, //位圖方式
0, //圖形寬
0, //圖形高
LR_LOADFROMFILE|LR_CREATEDIBSECTION//方式
);
if(bit==NULL) return FALSE; //調(diào)圖失敗
DIBSECTION ds; //
BITMAPINFOHEADER &bm = ds.dsBmih; //
GetObject(bit,sizeof(ds),&ds); //取位圖的信息->bminfo
w = bm.biWidth; //得到位圖寬度值
h = bm.biHeight; //得到位圖高度值
return TRUE;
}
//**************************************************
// TransparentBlt2 (......)透明顯示
// 根據(jù)關(guān)鍵色,將hdc1中的圖形在hdc0中
// 自動(dòng)生成掩模,并生成透明圖形。
//注:TransparentBlt(......)是一個(gè)WIN API函數(shù),功能和這里的相同。在WIN2000和
// 以后的系統(tǒng)上可用。在WIN98中有嚴(yán)重的資源泄漏,根本不能用。
// 所謂的資源泄漏:
// 你把下面TransparentBlt2最后6句注釋掉就可看到。
// 要使用TransparentBlt(......)前,請(qǐng)引用:
// #include <wingdi.h>
// #pragma comment (lib,"msimg32.lib")
//**************************************************
void TransparentBlt2( HDC hdc0, // 目標(biāo)DC
int nX0,int nY0,// 目標(biāo)偏移
int nW0,int nH0,// 目標(biāo)寬高度
HDC hdc1, // 源DC
int nX1,int nY1,// 源起點(diǎn)
int nW1,int nH1,// 源寬高度
UINT Tcol // 透明色,COLORREF類型
) //透明顯示[4章]
{ HBITMAP hBMP =CreateCompatibleBitmap(hdc0,nW0, nH0); // 創(chuàng)建位圖內(nèi)存
HBITMAP mBMP =CreateBitmap(nW0,nH0,1,1,NULL); // 創(chuàng)建單色掩碼位圖
HDC hDC =CreateCompatibleDC(hdc0); //創(chuàng)建設(shè)備句柄
HDC mDC =CreateCompatibleDC(hdc0); //創(chuàng)建設(shè)備句柄
HBITMAP oldBMP =(HBITMAP)SelectObject(hDC, hBMP);
HBITMAP oldmBMP=(HBITMAP)SelectObject(mDC, mBMP);
// 將源DC中的位圖拷貝到臨時(shí)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);// 設(shè)置透明色
BitBlt(mDC,0,0,nW0,nH0,hDC,0,0,SRCCOPY);//生成透明區(qū)域?yàn)榘咨?其它區(qū)域?yàn)楹谏难诖a位圖
SetBkColor(hDC, RGB(0,0,0)); //生成透明區(qū)域?yàn)楹谏?其它區(qū)域保持不變的位圖
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); //"與"運(yùn)算,在hdc0生成掩模
BitBlt(hdc0,nX0,nY0,nW0,nH0,hDC,0,0,SRCPAINT); //"或"運(yùn)算,生成最終透明效果
SelectObject(hDC, oldBMP); //以下為釋放資源
DeleteDC(hDC); //
SelectObject(mDC, oldmBMP); //
DeleteDC(mDC); //
DeleteObject(hBMP); //
DeleteObject(mBMP); //
}
//**************************************************
// manmove(int i) 活動(dòng)對(duì)象的移動(dòng)
// 由當(dāng)前、目標(biāo)位置的差,計(jì)算當(dāng)前位置向不同方位的改變。
//**************************************************
void manmove(int i)//活動(dòng)對(duì)象的移動(dòng)[5章]
{ int stx,sty,qx,qy;
switch(man[i].zs)
{case 2: {stx=9;sty=6;break;}//跑步長(zhǎng)
case 1: {stx=4;sty=2;break;}//走步長(zhǎng)
default:{stx=2;sty=1;break;}
}
qx=man[i].x0-man[i].xix; //x當(dāng)前、目標(biāo)位置差
qy=man[i].y0-man[i].xiy; //y當(dāng)前、目標(biāo)位置差
if (qx==0&&qy==0)
{
return ; //到達(dá)返回
}
int qxa=abs(qx); //x位置差絕對(duì)值
int qya=abs(qy); //y位置差絕對(duì)值
if(qxa<stx) stx=qxa; //位置差不足步長(zhǎng),步長(zhǎng)為差
if(qya<sty) sty=qya; //
if(qx!=0) man[i].xix+=qxa/qx*stx;//當(dāng)前位置加步長(zhǎng)
if(qy!=0) man[i].xiy+=qya/qy*sty;//[qya/qy]單位絕對(duì)值
//以下是不同方位位置變化的直觀表示,作用與上式相同
/* 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)//方位轉(zhuǎn)換
// 由當(dāng)前、目標(biāo)位置的差,計(jì)算活動(dòng)圖形的方向取向。
//**************************************************
void bianfw(int q)//方位轉(zhuǎn)換[5章]
{ int qx=man[q].x0-man[q].xix; //x當(dāng)前,目標(biāo)位置差
int qy=man[q].y0-man[q].xiy; //y當(dāng)前,目標(biāo)位置差
if(qx==0&&qy==0)
{man[q].zs=0; //為0,動(dòng)作為站,方位保留
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); //設(shè)置活動(dòng)對(duì)象初值
}
//**************************************************
// setman(int q) 設(shè)置活動(dòng)對(duì)象初值
// 由給定的對(duì)象、方位、動(dòng)作計(jì)算出圖形的位置和數(shù)量。
//**************************************************
void setman(int q)//設(shè)置活動(dòng)對(duì)象初值[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; //計(jì)數(shù)
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -