⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 编辑.cpp

📁 学游戏不错的实例教程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*********************************
[学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 + -