?? game_地圖.cpp
字號:
/*********************************
[學VC編游戲]
編著、程序設計:唐明理 2004.7
E-mail: cqtml@163.com
**********************************/
#include "stdafx.h"
#include "game_地圖.h"
extern unsigned short dw[7][6];
gamemap:: gamemap(){} //構造函數
gamemap::~gamemap()
{DeleteObject(pen1); //刪除主角尋路畫筆
} //析構函數
//***********************************************
// B、 設置小地圖的位置、尺寸
// C、 SMAP-裝載小地圖
// 定義4個畫筆pen0、pen1;pen、penz編輯用
// D、 設置幾個初始量。
//***********************************************
void gamemap::initmap()//初始化地圖參數
{ mapt=10,mapb=120; //小地圖上下
maph=mapb-mapt; //小地圖高
mapl=WIDTH+6; //小地圖左
mapr=mapl+maph*WIDTH/HEIGHT;//小地圖右邊是按顯示區比例取得
mapw=mapr-mapl; //小地圖寬
hScrDC=CreateDC("DISPLAY", NULL, NULL, NULL); //創建屏幕設備句柄
SMAP =CreateCompatibleDC(hScrDC); //創建小地圖設備句柄
mapbit=CreateCompatibleBitmap(hScrDC,mapw,maph);//創建小地圖位圖內存
SelectObject(SMAP,mapbit); //小地圖位圖內存與小地圖設備句柄關聯
pen0.CreatePen(PS_SOLID,1,RGB(0x0,0xf0,0xf0)); //小地圖中的方格畫筆
pen1.CreatePen(PS_SOLID,1,RGB(0x60,0x60,0x60)); //主角尋路畫筆
DeleteDC(hScrDC); //刪除屏幕設備句柄
fls=0; //閃爍標志
movemap=0; //地圖移動否?
init();
}
void gamemap::exitmap()//退出
{ DeleteDC(BK);
DeleteObject(bi);
DeleteObject(mapbit);//刪除小地圖位圖內存
DeleteDC(SMAP); //刪除小地圖設備句柄
DeleteObject(pen0); //刪除小地圖中的方格畫筆
exit();
}
//**************************************************
// mlmap()//地圖塊移動拼接
// 這里使用的是單地圖無縫拼接移動算法。
//**************************************************
void gamemap::mlmap()//地圖塊移動拼接
{ if( movemap==0) //地圖移動否?
BitBlt(BkDC1,0,0,WIDTH,HEIGHT,BkDC0,0,0,SRCCOPY);
else
{int gx=scrx%WIDTH,gy=scry%HEIGHT;
BitBlt(BK, 0,0, WIDTH-gx,HEIGHT,BkDC0,gx,0,SRCCOPY);//地圖橫向移動
BitBlt(BK, WIDTH-gx, 0,gx,HEIGHT, BkDC0,0,0, SRCCOPY);
BitBlt(BkDC1,0,0, WIDTH,HEIGHT-gy,BK,0,gy, SRCCOPY);//地圖縱向移動
BitBlt(BkDC1,0,HEIGHT-gy,WIDTH,gy, BK,0,0, SRCCOPY);
}
sort(); //按Y坐標排序,用于在顯示時分出前后位置
movemap=0; //地圖移動否?
}
//**************************************************
// getsmap()//生成小地圖
// A、調地面塊到BkDC0地圖設備句柄
// B、全地圖縮成小地圖到SMAP
// C、全地圖景物微縮到SMAP
//**************************************************
void gamemap::getsmap()//生成小地圖
{//A、調地面塊到BkDC0地圖設備句柄
char name[256];
sprintf(name,"%s%s",dir,mapbak);
loadbmp(name);
SelectObject(BkDC0,bitmap);//
DeleteObject(bitmap); //刪除上次的位圖內存。
//B、全地圖縮成小地圖
int i,j;
COLORREF col=RGB(255,255,255);
for(i=0;i<mapw;i=i+mapw/SCRP0)
for(j=0;j<maph;j=j+maph/SCRP0)
TransparentBlt2
(SMAP,i,j,mapw/SCRP0,maph/SCRP0,
BkDC0,0,0,WIDTH,HEIGHT,col);//透明顯示
//C、全地圖景物微縮
int wi=WIDTH*SCRP0,he=HEIGHT*SCRP0;
for(int q=0;q<rs;q++)
if(man[q].lb==2) //是靜物
{if(getpic("景",man[q].p)==FALSE) continue;//讀取位圖文件cc
int x=(man[q].xix-w/4)*mapw; //x當前位置
int y=(man[q].xiy-h)*maph; //y當前位置
TransparentBlt2
(SMAP,x/wi,y/he,(w*mapw)/(wi*2/3),(h*maph)/(he*2/3),
MemDC,0,0,w,h,col);//透明顯示
}
// OldMak=(HBITMAP)SelectObject(MemDC,bitya);//?????????????????
}
//**************************************************
// movesmap(int x0,int y0)//移動地圖
// 鼠標超過邊界時,改變(scrx,scry)使主顯屏產生相應的移動。
// 每個方向的移動都進行超界檢測。
//**************************************************
void gamemap::movesmap(int x0,int y0)//移動地圖
{ int a=3;
if(edi==1) a=1; //編輯時使算法簡單。
if(x0>SCRWI-10) //鼠標超過右邊界
{scrx=scrx+GX/a;if(scrx>WIDTH*(SCRP0-1)) scrx=WIDTH*(SCRP0-1);}
if(x0<10) //鼠標超過左邊界
{scrx=scrx-GX/a;if(scrx<0) scrx=0;}
if(y0>SCRHE-10) //鼠標超過下邊界
{scry=scry+GY/a;if(scry>HEIGHT*(SCRP0-1)) scry=HEIGHT*(SCRP0-1);}
if(y0<10) //鼠標超過上邊界
{scry=scry-GY/a;if(scry<0) scry=0;}
movemap=1; //地圖移動否?
}
//**************************************************
// BOOL dingweimap(int x,int y)//定位地圖
// 這是由按鼠標左鍵調用的。
// 根據按鍵位置,改變(scrx,scry)使主顯屏快速移動
//**************************************************
BOOL gamemap::dingweimap(int x,int y)//定位地圖
{ if(y>mapt&&y<mapb&&x>mapl&&x<mapr)//在小地圖上按鍵
{scrx=(x-mapl)*WIDTH *SCRP0/mapw-mapw*2;
scry=(y-mapt)*HEIGHT*SCRP0/maph-maph*2;
scrx=(scrx/GX)*GX;
scry=(scry/GY)*GY;
//進行邊界檢測。
if(scrx>WIDTH*(SCRP0-1)) scrx=WIDTH*(SCRP0-1);
if(scrx<0) scrx=0;
if(scry>HEIGHT*(SCRP0-1)) scry=HEIGHT*(SCRP0-1);
if(scry<0) scry=0;
return TRUE;
}
return FALSE;
}
//**************************************************
// smlmap(HDC hdc)//顯示小地圖
// 0、小地圖刷新
// A、在小地圖上顯示主屏框
// B、顯示主角在小地圖的移動
// C、在小地圖上顯示主角尋路的路徑
//**************************************************
void gamemap::smlmap(HDC dc0)//顯示小地圖
{ if(rs<1||SCRP0<1) return;
CDC* dc = CDC::FromHandle (dc0);
//0、小地圖刷新
BitBlt(dc0,mapl,mapt,mapw,maph,SMAP,0,0,SRCCOPY);//小地圖刷新
//A、在小地圖上顯示主屏框
CPen *old;
old=dc->SelectObject(&pen0);//調白色畫筆
int mapw0=mapw/SCRP0,maph0=maph/SCRP0-1;
int scrx0=mapl+(scrx*mapw)/(WIDTH*SCRP0);
int scry0=mapt+(scry*maph)/(HEIGHT*SCRP0);
//用線畫方框
dc->MoveTo(scrx0,scry0); //左上點
dc->LineTo(scrx0+mapw0,scry0); //右上點
dc->LineTo(scrx0+mapw0,scry0+maph0);//右下點
dc->LineTo(scrx0,scry0+maph0); //左下點
dc->LineTo(scrx0,scry0); //左上點
//B、顯示對象在小地圖的移動
for(int q=0;q<rs;q++)
{ COLORREF col=RGB(0x0,0x0,0x0);//
scrx0=(man[q].xix*mapw)/(WIDTH*SCRP0)-1;
scry0=(man[q].xiy*maph)/(HEIGHT*SCRP0)-2;
if(scrx0<1||scry0<1) continue;
if(man[q].jisu==0)
{mann=q; //取動態的主角下標
if(fls==0){fls=1;col=RGB(0xf0,0xf0,0xf0);}//白閃爍
else {fls=0;col=RGB(0xf0,0x0,0x0);} //紅
dc->SetPixel(mapl+scrx0+1,mapt+scry0, col);
dc->SetPixel(mapl+scrx0+1,mapt+scry0+1,col);
}
if(man[q].lb==2) continue;
dc->SetPixel(mapl+scrx0,mapt+scry0, col);
dc->SetPixel(mapl+scrx0,mapt+scry0+1,col);
}
//C、在小地圖上顯示主角尋路的路徑
setfind(dc,old); //有尋路時用,顯示主角尋路的路徑
dc->SelectObject(old);
CDC::DeleteTempMap( );
}
//**************************************************
// int leftdown(HDC hdc,int x,int y)//按左鍵
// 這是由按鼠標左鍵調用的。
// A、在顯示區按鍵,給出主角的目標位置,調A*算法尋路
// B、在小地圖區按鍵,調定位地圖。
// 若是尋路,返回尋路的時間。
//**************************************************
int gamemap::leftdown(HDC hdc,int x,int y)//按左鍵
{ int fidtim=0;
if(x>0&&x<WIDTH&&y>0&&y<HEIGHT&&edi==0) //在顯示區,非編輯態
{int i=mann; //只對主角取目標點
man[i].x0=x-2+scrx;
man[i].y0=y-10+scry;
man[i].p=man[i].m1-1; //中止當前動作
}
if(dingweimap(x,y)==TRUE) //在小地圖上點左鍵,調定位地圖
smlmap(hdc); //顯示小地圖
return fidtim;
}
//////////////////////////////////////////////////////////////////////
void gamemap::setfind(CDC* dc,CPen *old)//有尋路時用,顯示主角尋路的路徑
{//C、在小地圖上顯示主角尋路的路徑
int i=mann;//取主角
dc->SelectObject(old);
if(man[i].pk<1)
{ CDC::DeleteTempMap( );
return;
}
int x,y,x0,y0;
x=man[i].ph[0].x*GX;
y=man[i].ph[0].y*GY;
x0=mapl+(x*mapw)/(WIDTH*SCRP0);
y0=mapt+(y*maph)/(HEIGHT*SCRP0);
old=dc->SelectObject(&pen1);//調紅色畫筆
for (int j=1;j<man[i].pk;j++)
{dc->MoveTo(x0,y0);
x=man[i].ph[j].x*GX;
y=man[i].ph[j].y*GY;
x0=mapl+(x*mapw)/(WIDTH*SCRP0);
y0=mapt+(y*maph)/(HEIGHT*SCRP0);
dc->LineTo(x0,y0);
}
x0=mapl+(man[i].fx*mapw)/(WIDTH*SCRP0);
y0=mapt+(man[i].fy*maph)/(HEIGHT*SCRP0);
dc->LineTo(x0,y0);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -