📄 mapedit.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 + -