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

📄 mapedit.cpp

📁 map editer地图编辑器
💻 CPP
字号:
//		████████████████████████████
//		██╭--------------------------------------------╮██
//		█╭╯			★游 戏 地 图 编 缉 器★		  ╰╮█
//		█|											    |█
//		█|												|█
//		█|		Welcome to http://witsun.myrice.com	  	|█
//		█|	由 WitSun 于 2002 年 4~5月 在 福 建 完 成	|█
//		█╰------------------------------------------------╯█
//		████████████████████████████

//------ Include Files ------//
#include "stdafx.h"
#include <stdio.h>
#include "DirectDraw.h"
#include "Menu.h"

//------ Window Class Information ------//
static char szClass[] = "地 图 编 缉 器";
static char szCaption[] = "地 图 编 缉 器";

#define Tile0NumX 6						//地形Tile 的X,Y个数 
#define Tile0NumY 6
#define Tile0MaxNum Tile0NumX*Tile0NumY	//地形Tile 总数
#define Tile1NumX 6						//地表Tile 的X,Y个数 
#define Tile1NumY 100
#define Tile1MaxNum Tile1NumX*Tile1NumY	//地表Tile 总数

#define MapWidth 40		//游戏地图的大小
#define MapHeight 30

LPDIRECTDRAWSURFACE7 AllTile1=NULL;
LPDIRECTDRAWSURFACE7 AllTile0=NULL;
LPDIRECTDRAWSURFACE7 Tile0[Tile0MaxNum];
LPDIRECTDRAWSURFACE7 Tile1[Tile1MaxNum];


LPDIRECTDRAWSURFACE7 BMPToSurface(LPCTSTR file_name);	//加载图片的函数
LPDIRECTDRAWSURFACE7 CreateBlankSurface(int nWidth, int nHeight);	//创建空白页

bool MapMove=true;	//地图中的元素是否呆经过?
bool LeftButton=false;		//if left mouse down?
bool MenuMoveable=false;	//if Menu can be move?
int nowx=0,nowy=0,lastx=0,lasty=0;	//mouse now and old point.
int Menu0=0,Menu1=0;	//the Tile in Menu's point

DDCOLORKEY key;	//colore key

HWND hWnd;//句柄

//地图头
struct MapHeadData
{
	int MapHead_Width;
	int MapHead_Height;
};
//地图数据
struct MapData
{
	bool Moveablo;	//是否可移过
	int ID0;	//地形ID
	int ID1;	//地表ID
};
MapHeadData MapHead;//地图头
MapData Map[MapWidth][MapHeight];//地图数据
int TileID=0;//图地ID 

void InitTilePic();//初始化Tile
void InitMap();//初始化地图
void TileMenu0();//Tile选择菜单
void TileMenu1();//Tile选择菜单
void MenuMove();//菜单移动
void ShowMap(int& mapx,int& mapy);//显示地图
void ChangeTile();//改变Tile
void Exit();//Ready to out EditMap?
void Info();//信息
void SaveMap();//保存地图
void LoadMap();//Read地图

int mapx=0,mapy=0;

CDirectDraw* DirectDraw=NULL;
CMenu* Menu=NULL;

//------ 清除与重载的宏 -------//
#define SafeRelease(x) if (x) { x->Release(); x=NULL;}
#define SafeDelete(x) if (x) {delete x;x=NULL;}

void Cleanup()
{
	SafeDelete(DirectDraw);
	SafeDelete(Menu);

}

//------ Windows Message Handler ------//
LRESULT CALLBACK WindowProc(HWND hWnd, unsigned uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
	case WM_MOUSEMOVE:
		MenuMove();
		Menu->MouseMove();
		break;

	case WM_LBUTTONDOWN:
		LeftButton=true;
		Menu->MouseDown();
		break;

	case WM_LBUTTONUP:
		LeftButton=false;
		MenuMoveable=false;
		break;

	case WM_DESTROY:
		Cleanup();
		PostQuitMessage(0);
		break;
	
	case WM_KEYDOWN:
		switch (wParam) 
            {

		case VK_F1:
			TileMenu0();
			break;

		case VK_F2:
			TileMenu1();
			break;

		case VK_F4://保存地图
			SaveMap();
			break;

		case VK_F5:
			LoadMap();//读取地图
			break;

		case VK_F12:
			Menu->CreateMenu("About",220,140,false);
			break;

		case VK_LEFT:
			mapx--;
			break;
		
		case VK_RIGHT:
			mapx++;
			break;

		case VK_UP:
			mapy--;
			break;

		case VK_DOWN:
			mapy++;
			break;
		
		case VK_ESCAPE:
			if (Menu->IsEmpty())
				Exit();
			else
				Menu->DelMenu();

			break;
			
			// Process other non-character keystrokes. 
		default:
			break;
		}

		default:
			return DefWindowProc(hWnd, uMsg, wParam, lParam);
	}
	return 0L;
}

//------ Function to Initialize DirectDraw and the Application ------//
static BOOL MainInit(HINSTANCE hInstance, int nCmdShow)
{
    WNDCLASS                    wc;

    // Set up and register window class
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC) WindowProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = sizeof(DWORD);
    wc.hInstance = hInstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName =NULL;// MAKEINTRESOURCE(IDR_MENU);
    wc.lpszClassName = szClass;
    if (!RegisterClass(&wc))
        return FALSE;

    // Get dimensions of display
    int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);

    // Create a window and display
    hWnd = CreateWindow(szClass,							// class
                        szCaption,							// caption
						WS_VISIBLE|WS_POPUP,				// style 
						0,									// left
						0,									// top
						ScreenWidth,						// width
						ScreenHeight,						// height
                        NULL,								// parent window
                        NULL,								// menu 
                        hInstance,							// instance
                        NULL);								// parms
    if (!hWnd)
        return FALSE;

//	MessageBox(hWnd,"使用方法:打开图库(F1)、移到地图(↑↓→←方向键)、退出(Alt+F4)","紫星工作室----Http://www.jqjz.com",NULL);


    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);



	DirectDraw=new CDirectDraw;
	if (!DirectDraw->Create(hWnd))
		return FALSE;

	Menu= new CMenu;

	//创建Tile总文件
	AllTile0=BMPToSurface("pic\\alltile0.BMP");
	AllTile1=BMPToSurface("pic\\alltile1.BMP");

	key=DirectDraw->GKeyColor();//设制色键

	//初始化TILE图片
	InitTilePic();
	//初始化地图
	InitMap();

//	ShowCursor(FALSE);//隐藏鼠标
	// return success to caller
	return TRUE;
}

//------ Application Loop ------//
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	// initialize the application, exit on failure
    if (!MainInit(hInstance, nCmdShow)) {
		Cleanup();
        return FALSE;
	}

	MSG msg;

	while(1)
	{
		if (PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
		{
			if (!GetMessage(&msg,NULL,0,0))
				return msg.wParam;
			// dispatch the message 
			TranslateMessage(&msg);
			DispatchMessage(&msg); 
		}
		else
		{
			ShowMap(mapx,mapy);

			Menu->Show();

			Info(); //信息

			DirectDraw->lpDDSPrimary->Flip(0,DDFLIP_WAIT);
		}
	}

}



///////////////////////////////////////////////////加载图片的函数
LPDIRECTDRAWSURFACE7 BMPToSurface(LPCTSTR file_name)
{
	HDC hdc;
	HBITMAP bit;
	LPDIRECTDRAWSURFACE7 surf;

	// load the interface bitmap
	bit=(HBITMAP) LoadImage(NULL,file_name,IMAGE_BITMAP,0,0,
								LR_DEFAULTSIZE|LR_LOADFROMFILE);
	if (!bit)
		
		// failed to load, return failure to caller
		return NULL;

	// get bitmap dimensions
	BITMAP bitmap;
    GetObject( bit, sizeof(BITMAP), &bitmap );
	int surf_width=bitmap.bmWidth;
	int surf_height=bitmap.bmHeight;

	// create surface
	HRESULT ddrval;
	DDSURFACEDESC2 ddsd;
	ZeroMemory(&ddsd,sizeof(ddsd));
	ddsd.dwSize = sizeof(DDSURFACEDESC2);
	ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT ;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
	ddsd.dwWidth = surf_width;
	ddsd.dwHeight = surf_height; 

	// attempt to create surface
	ddrval=DirectDraw->lpDD->CreateSurface(&ddsd,&surf,NULL);

	// created ok?
	if (ddrval!=DD_OK) {

		// no, release the bitmap and return failure to caller
		DeleteObject(bit);
		return NULL;

	} else {

		// yes, get a DC for the surface
		surf->GetDC(&hdc);

		// generate a compatible DC
		HDC bit_dc=CreateCompatibleDC(hdc);

		// blit the interface to the surface
		SelectObject(bit_dc,bit);
		BitBlt(hdc,0,0,surf_width,surf_height,bit_dc,0,0,SRCCOPY);

		// release the DCs
		surf->ReleaseDC(hdc);
		DeleteDC(bit_dc);

	}

	// clear bitmap 
	DeleteObject(bit);

	// return pointer to caller
	return surf;
}

void InitTilePic()
{
	RECT stcRect;
	int n=0;

	//初始化地形
	for (int i=Menu0;i<Tile0NumY;i++)
		for (int j=0;j<Tile0NumX;j++)
	{
		stcRect.top=i*40;
		stcRect.left=j*40;
		stcRect.right=stcRect.left+40;
		stcRect.bottom=stcRect.top+40;

		Tile0[n]=CreateBlankSurface(40,40);

		Tile0[n]->BltFast(0,0,AllTile0,&stcRect,NULL);
		n++;
	}

	//初始化地表
	n=0;
	for (int i1=Menu1;i1<Tile1NumY;i1++)
		for (int j1=0;j1<Tile1NumX;j1++)
	{
		stcRect.top=i1*40;
		stcRect.left=j1*40;
		stcRect.right=stcRect.left+40;
		stcRect.bottom=stcRect.top+40;

		Tile1[n]=CreateBlankSurface(40,40);

		Tile1[n]->BltFast(0,0,AllTile1,&stcRect,NULL);
		n++;
	}

	SafeRelease(AllTile0)
	SafeRelease(AllTile1)
}

////////////////////////////////////创建空白页
LPDIRECTDRAWSURFACE7 CreateBlankSurface(int nWidth, int nHeight)
{
	LPDIRECTDRAWSURFACE7 pBitmap;

	// create surface for load
	DDSURFACEDESC2 ddsd;
	ZeroMemory( &ddsd, sizeof(ddsd) );
	ddsd.dwSize         = sizeof(ddsd);
	ddsd.dwFlags        = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY;
	ddsd.dwWidth        = nWidth;		// tga file width
	ddsd.dwHeight       = nHeight;		// tga file height
	DirectDraw->lpDD->CreateSurface(&ddsd, &pBitmap, NULL ) ;

	return pBitmap;
}

//初始化地图
void InitMap()
{
	MapHead.MapHead_Width=MapWidth;
	MapHead.MapHead_Height=MapHeight;

  	for (int y=0;y<MapHeight;y++)
		for (int x=0;x<MapWidth;x++)
		{
			Map[x][y].Moveablo=true;//初始化为可移到
			Map[x][y].ID0=0;//初始化地形为第一个
			Map[x][y].ID1=599;//初始化地图为透明
		}
}



//显示地图
void ShowMap(int& mapx,int& mapy)
{
	RECT destRect;

	if (mapx<0)
		mapx=0;
	if (mapx>MapWidth-20)
		mapx=MapWidth-20;
	if (mapy<0)
		mapy=0;
	if (mapy>MapHeight-15)
		mapy=MapHeight-15;

	int tempx=mapx,tempy=mapy;

	for(int i=0;i<15;i++)
	{
		for(int j=0;j<20;j++)
	{
		destRect.top=i*40;
		destRect.left=j*40;
		destRect.right=destRect.left+40;
		destRect.bottom=destRect.top+40;

		DirectDraw->lpDDSBack->Blt(&destRect,Tile0[Map[tempx][tempy].ID0],NULL,
									DDBLT_WAIT,NULL);

		Tile1[Map[tempx][tempy].ID1]->SetColorKey(DDCKEY_SRCBLT, &key);

		DirectDraw->lpDDSBack->Blt(&destRect,Tile1[Map[tempx][tempy].ID1],NULL,
									DDBLT_WAIT | DDBLT_KEYSRC ,NULL);

		tempx++;
	}
		tempx=mapx;
		tempy++;
	}
}



//Tile选择菜单
void TileMenu1()
{
	if (!Menu->IsEmpty())
	{
		Menu->DelMenu();
		return;
	}

	if (Menu->IsEmpty())
	{
		Menu->CreateMenu("TileMenu1",100,100,true);
		Menu->CreateButton("End",270,5);
		Menu->CreateButton("Move",270,324);
		Menu->CreateButton("Up",270,347);
		Menu->CreateButton("Down",270,370);


		for (int n=0;n<Tile1MaxNum;n++)
				Menu->CreateTile(Tile1[n]);

		int n1=Menu1;
		for (int i=0;i<8;i++)
			for (int j=0;j<6;j++)
			{

				Menu->top->ButtonX[4+n1]=j*43+10;
				Menu->top->ButtonY[4+n1]=i*45+32;

				Menu->top->ButtonSurface[4+n1]->SetColorKey(DDCKEY_SRCBLT, &key);

				Menu->top->MenuSurface->BltFast(Menu->top->ButtonX[4+n1],
												Menu->top->ButtonY[4+n1],
												Menu->top->ButtonSurface[4+n1],
												NULL,
												DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
				n1++;
			}

	}
}

//Tile选择菜单
void TileMenu0()
{
	if (!Menu->IsEmpty())
	{
		Menu->DelMenu();
		return;
	}

	if (Menu->IsEmpty())
	{
		Menu->CreateMenu("TileMenu0",100,100,true);
		Menu->CreateButton("End",270,5);
		Menu->CreateButton("Move",270,324);
		Menu->CreateButton("Down",270,370);
		Menu->CreateButton("Up",270,347);

		for (int n=0;n<Tile0MaxNum;n++)
				Menu->CreateTile(Tile0[n]);

		int n1=0;
		for (int i=0;i<6;i++)
			for (int j=0;j<6;j++)
			{

				Menu->top->ButtonX[4+n1]=j*43+10;
				Menu->top->ButtonY[4+n1]=i*45+32;

				Menu->top->ButtonSurface[4+n1]->SetColorKey(DDCKEY_SRCBLT, &key);

				Menu->top->MenuSurface->BltFast(Menu->top->ButtonX[4+n1],
												Menu->top->ButtonY[4+n1],
												Menu->top->ButtonSurface[4+n1],
												NULL,
												DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
				n1++;
			}

	}
}


///菜单移动
void MenuMove()
{
	if (MenuMoveable)
	{
	POINT point;
	GetCursorPos(&point);

	lastx=point.x;
	lasty=point.y;

	int tempx=nowx-lastx;
	int tempy=nowy-lasty;

	Menu->top->MenuX-=tempx;
	Menu->top->MenuY-=tempy;
	
	if (Menu->top->MenuX<0)
		Menu->top->MenuX=0;
	if (Menu->top->MenuX>800-Menu->top->MenuWidth)
		Menu->top->MenuX=800-Menu->top->MenuWidth;
	if (Menu->top->MenuY<0)
		Menu->top->MenuY=0;
	if (Menu->top->MenuY>600-Menu->top->MenuHeight)
		Menu->top->MenuY=600-Menu->top->MenuHeight;

	Menu->destRect.top=Menu->top->MenuY;
	Menu->destRect.left=Menu->top->MenuX;
	Menu->destRect.right=Menu->destRect.left+Menu->top->MenuWidth;
	Menu->destRect.bottom=Menu->destRect.top+Menu->top->MenuHeight;
	}

}


//改变Tile
void ChangeTile()
{
	POINT point;
	GetCursorPos(&point);
	static bool Tile1=false; //判断是地形还是地表
	
	int x,y;
	x=point.x/40;
	y=point.y/40;

	if (!Menu->IsEmpty() && strcmp(Menu->top->MenuName,"TileMenu1")==0)
		Tile1=true;

	else if (!Menu->IsEmpty() && strcmp(Menu->top->MenuName,"TileMenu0")==0)
		Tile1=false;

	if (Tile1)
		Map[mapx+x][mapy+y].ID1=TileID-4;
	else
		Map[mapx+x][mapy+y].ID0=TileID-4;

	Map[mapx+x][mapy+y].Moveablo=MapMove; //设置地图元素是否可以移过

}

//Ready out to the EditMap?
void Exit()
{
	Menu->CreateMenu("Exit",240,200,true);
	Menu->CreateButton("Yes",45,140);
	Menu->CreateButton("No",180,140);
}

//信息
void Info()
{
	HDC hdc;
//	char temp[32];
	DirectDraw->lpDDSBack->GetDC(&hdc);
	SetBkMode(hdc, TRANSPARENT);
	SetTextColor(hdc, RGB(255,0,0)); 
//	itoa(Menu1,temp,10);
//	TextOut(hdc, 0, 0, temp, strlen(temp));
	if (MapMove)
		TextOut(hdc, 0, 0, "可移过√", 8);
	else
		TextOut(hdc, 0, 0, "不可移过╳", 10);

	DirectDraw->lpDDSBack->ReleaseDC(hdc);
}

void SaveMap()//保存地图
{
	FILE *fp;
	if ((fp=fopen("map\\map.map","wb"))==NULL)
		MessageBox(hWnd,"不能打开map.map文件","错误",NULL);
	else
	{
		fwrite(&MapHead,sizeof(MapHead),1,fp);
		fwrite(Map,sizeof(Map),1,fp);
		fclose(fp);
	}

}


void LoadMap()//Read地图
{
	FILE *fp;
	if ((fp=fopen("map.map","rb"))==NULL)
		MessageBox(hWnd,"不能打开map.map文件","错误",NULL);
	else
	{
		fread(&MapHead,sizeof(MapHead),1,fp);
		fread(Map,sizeof(Map),1,fp);
		fclose(fp);
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -