📄 编辑.cpp
字号:
/*********************************
[学VC编游戏]
编著、程序设计:唐明理 2004.7
E-mail: cqtml@163.com
**********************************/
#include "stdafx.h"
#include "编辑.h"
#define PALVERSION 0x300
#define WIDTHBYTES_E(bits) (((bits)+31)/32*4)
int PalEntriesOnDevice(HDC hDC); // 获取颜色位
HPALETTE GetSystemPalette(); // 获取系统调色板
WORD PaletteSize(LPBYTE lpDIB); // 计算调色板长度
HANDLE BitmapToDIB(HBITMAP hBitmap, HPALETTE hPal); // DDB->DIB转化
gmedit:: gmedit(){} //构造函数
gmedit::~gmedit(){} //析构函数
//地图编辑用/////////////////////////////////////////
void gmedit::initedit()//初始化
{ pen. CreatePen(PS_SOLID,1,RGB(0x80,0x80,0x80)); //编辑方格灰色画笔
penz.CreatePen(PS_SOLID,1,RGB(0x80,0x0,0x0)); //障碍点褐色画笔
initmap();//初始化地图参数
}
void gmedit::exitedit()//返回
{ DeleteObject(pen); //删除编辑方格灰色画笔
DeleteObject(penz); //删除障碍点褐色画笔
exitmap();
}
//**************************************************
// Insert(int no,int dorj) //插入
// 插入第no号对象,dorj=0是景;dorj=1是兽
//**************************************************
void gmedit::Insert(int no,int dorj) //插入
{ //dorj选择0景物或1动物
if(rs>SU_LIANG-2)
{AfxMessageBox("对象数超出!"); return;}
int i=rs;
man[i].jisu=i+1; //序号
if(dorj==0) man[i].lb=2; //类别:2景
else man[i].lb=1; //类别:1兽
man[i].fw=1; //方位1西南
man[i].zs=0; //动作0站
man[i].p=no; //静物图形号
man[i].js=dorj*(no-tml); //兽[0豹1狼2鹿3马4雀5羊6猪]
if(man[i].lb!=2) setman(i); //设置活动对象初值
getobjwh(i); //取对象的尺寸
man[i].xix=scrx+WIDTH/2; //当前位置x
man[i].xiy=scry+HEIGHT/2; //当前位置y
man[i].x0=man[i].xix; //目标位置x
man[i].y0=man[i].xiy; //目标位置y
if(dorj==1) //加入的是兽,马上走开
{ int x=man[i].x0+(100-rand()%200);//x随机位移
int y=man[i].y0+(100-rand()%200);//y随机位移
FindPath(i,x,y);
}
rs++;//对象数加1
}
//**************************************************
// Delete() //删除
// 删除选 中的gno号对象。并重整序号
//**************************************************
void gmedit::Delete() //删除
{ if(gno==0||rs<2) return;
for(int i=0;i<rs;i++)
if(man[i].jisu==gno)
{for (int j=i;j<rs-1;j++) man[j]=man[j+1];//删除gno
rs--;//对象数减1
for(int k=0;k<rs;k++)//重整序号
if(man[k].jisu!=0) man[k].jisu=k+1;
return;
}
}
//**************************************************
// getno(int x,int y)选择对象
//入口参数,x,y为按左键时的坐标。
//出口参数,类变量gno中为选中对象的序号。
// 类变量x1,y1选中对象的坐标。
//在主显区根据图形的位置选中对象;用于移动或删除对象。
//**************************************************
void gmedit::getno(int x,int y)//选择对象,编辑地图用
{ gno=-1;//对象选择重置
for(int i=0;i<rs;i++)
{if((x+scrx)>(man[i].xix-man[i].w/2+2)&&(x+scrx)<(man[i].xix+man[i].w/2+2)&&
(y+scry)>(man[i].xiy-man[i].h+10)&&(y+scry)<(man[i].xiy+10))
{gno=man[i].jisu; //保存选中对象的序号
x1=man[i].xix; //保存选中对象的坐标
y1=man[i].xiy; //
return;
}
}
}
//**************************************************
// getobj(HDC hdc,int i)//加入选择
// 在对象选择栏中选择对象。
//**************************************************
void gmedit::getobj(HDC hdc,int i)//加入选择,编辑地图用
{ int x,y=HEIGHT+19,w=48,h=47;
CDC* bc = CDC::FromHandle (hdc);
CPen *old;
old=bc->SelectObject(&pen0);
for(int j=0;j<12;j++)
{x=j*50+2;
bc->MoveTo(x,y); //全部刷新
bc->LineTo(x+w,y); bc->LineTo(x+w,y+h);
bc->LineTo(x,y+h); bc->LineTo(x,y);
}
bc->SelectObject(old);
if(i<0) return;
old=bc->SelectObject(&pen1);
x=(i-tml)*50+2;
bc->MoveTo(x,y); //选择框
bc->LineTo(x+w,y); bc->LineTo(x+w,y+h);
bc->LineTo(x,y+h); bc->LineTo(x,y);
bc->SelectObject(old);
CDC::DeleteTempMap( );
BitBlt(hdc,WIDTH+10-1, SCRHE-100-1,w+1,h+1,hdc,x,y,SRCCOPY);//选中对象拷贝到被选框
}
//**************************************************
// getwp(HDC hdc)//显示选择对象,编辑地图用
// 调图形在选择栏缩放居中透明显示。
//
//**************************************************
void gmedit::getwp(HDC hdc,int dorj)//显示选择对象
{ CString cc;
int xx=2; int yy=HEIGHT+18;//显示栏定位
int wh=50;
if(edi==0)//非编辑态,选择栏底板呈灰色
{CBrush Brush(RGB(0xd0,0xd0,0xd0));
SelectObject(hdc,Brush);
PatBlt(hdc,xx,yy,WIDTH,wh,PATCOPY); //选择栏
PatBlt(hdc,WIDTH+8, SCRHE-102,50,50,PATCOPY); //被选框
return;
}
else //编辑态,选择栏调地图块
BitBlt(hdc,xx,yy,WIDTH,wh,BkDC0,0,0,SRCCOPY);//选择栏
int p=0;//计数指针
int tml0;
if(dorj==1) tml0=0;
else tml0=tml;
for(int i=tml0;i<tml0+12;i++)
{int p0;
if(dorj==0){cc="景";p0=i;}
else {cc="兽";p0=i*400+1*5;}
if(getpic(cc,p0)==FALSE)
{getobj(hdc,-1);return;}
//图形缩放居中
float wi0=(float)w,he0=(float)h;
float bl=wi0/he0;
if(wi0<wh&&he0<wh) goto aa;
if(bl>1) {wi0=(float)wh;he0=wi0/bl;}
else {he0=(float)wh;wi0=he0*bl;}
aa: int x0=(int)(wh-wi0)/2+p*wh+xx;
int y0=(int)(wh-he0)/2+yy;
TransparentBlt2(hdc,x0,y0,(int)wi0,(int)he0,MemDC,0,0,w,h,RGB(255,255,255));
p++;
}
getobj(hdc,-1);
}
//**************************************************
// showline()//显示编辑方格
// 在编辑态显示编辑方格和障碍格
//**************************************************
void gmedit::showline()//显示编辑方格
{ CDC* bc = CDC::FromHandle (BkDC1);
CPen *old;
old=bc->SelectObject(&pen);
for(int i=GY;i<HEIGHT;i=i+GY)//横条
{bc->MoveTo(0,i); bc->LineTo(WIDTH,i); }
for(int j=GX;j<WIDTH;j=j+GX)//竖条
{bc->MoveTo(j,0); bc->LineTo(j,HEIGHT);}
bc->SelectObject(old);
//------------------------------------------
old=bc->SelectObject(&penz);//显示障碍格
for(i=0;i<WIDTH+GX;i=i+GX)
for(j=0;j<HEIGHT+GY;j=j+GY)
{int x=(i+scrx)/GX-1,y=(j+scry)/GY-1;
if(m_fid.map[x][y]=='1')//画障碍格
{ bc->MoveTo(i,j); bc->LineTo(i-GX,j-GY);//叉
bc->MoveTo(i-GX,j); bc->LineTo(i,j-GY);
bc->MoveTo(i,j); //方格
bc->LineTo(i,j-GY); bc->LineTo(i-GX,j-GY);
bc->LineTo(i-GX,j); bc->LineTo(i,j);
}
}
//------------------------------------------
for(i=0;i<rs;i++)//显示选中的对象
if(gno==man[i].jisu)
{int w=man[i].w;
int h=man[i].h;
int x=man[i].xix-scrx-w/2; //x当前位置
int y=man[i].xiy-scry-h; //y当前位置
old=bc->SelectObject(&pen1);
bc->MoveTo(x,y);
bc->LineTo(x+w,y); bc->LineTo(x+w,y+h);
bc->LineTo(x,y+h); bc->LineTo(x,y);
bc->SelectObject(old);
}
bc->SelectObject(old);
CDC::DeleteTempMap( );
}
//**************************************************
// savemap(CString name)//保存地图
// A、保存编制好的对象场景(.dat)
// 场景文件(.dat)的格式:
// 第1行,为背景图形
// 第2行,对象数,后面一行是一个对象。
// 序号,类别,角色,静物图形号,x,y位置6个数据
// B、保存 障碍表(.map),障碍表的格式:
// 第1行,障碍表的行列值,以后1 行就是障碍表1行的数据。
//**************************************************
void gmedit::savemap(CString name)//保存地图
{// A、保存对象场景(.dat)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -