📄 mapedit.cpp
字号:
}
}
//如果是点选的话,就是连发模式
else if( Key.KeyDown(DIK_LSHIFT) || Key.KeyDown(DIK_LCONTROL)
|| Key.KeyDown(DIK_LALT) || Beg_Ground==-1
|| x1>x2 || y1>y2 || (x1==x2 && y1==y2))
{
bFillCell=true;
}
else //块填充
{
for(int i=0; i<=x2-x1; i++)
for(int j=0; j<=y2-y1; j++)
{
switch( Cur_Level )
{
case CL_OBJECT:
map.Cell[(cy+j)*map.Width+cx+i].Obj=Beg_Ground+(j*ShowCellW)+i;
map.Cell[(cy+j)*map.Width+cx+i].ObjPic=Cur_GroundPic;
break;
case CL_OBJECT2:
map.Cell[(cy+j)*map.Width+cx+i].Obj2=Beg_Ground+(j*ShowCellW)+i;
map.Cell[(cy+j)*map.Width+cx+i].Obj2Pic=Cur_GroundPic;
break;
}
}
}
}
//左键松开
if( Button==LB_UP )
{
bFillCell=false;
cx2=-1;
}
//点击效果
if( bFillCell && (cx!=cx2 || cy!=cy2) )
{
switch( Cur_Level )
{
case CL_OBJECT:
{
if( Key.KeyDown( DIK_LALT ) ) //改变阻挡关系
{
int t=cy*map.Width+cx;
map.Cell[t].Block=1-map.Cell[t].Block;
}
else if( Key.KeyDown( DIK_LCONTROL ) ) //删除
{
map.Cell[cy*map.Width+cx].Obj=BLOCK_CELL;
map.Cell[cy*map.Width+cx].Block=false;
}
else if( Key.KeyDown( DIK_SPACE) ) //改变层次
{
int t=cy*map.Width+cx;
map.Cell[t].Level=1-map.Cell[t].Level;
}
else //放置
{
map.Cell[cy*map.Width+cx].Obj=Cur_Ground;
map.Cell[cy*map.Width+cx].ObjPic=Cur_GroundPic;
map.Cell[cy*map.Width+cx].Block=true;
}
}
break;
case CL_OBJECT2:
{
if( Key.KeyDown( DIK_LALT ) ) //改变阻挡关系
{
int t=cy*map.Width+cx;
map.Cell[t].Block=1-map.Cell[t].Block;
}
else if( Key.KeyDown( DIK_LCONTROL ) ) //删除
{
map.Cell[cy*map.Width+cx].Obj2=BLOCK_CELL;
}
else if( Key.KeyDown( DIK_SPACE) ) //改变层次
{
int t=cy*map.Width+cx;
map.Cell[t].Level2=1-map.Cell[t].Level2;
}
else //放置
{
map.Cell[cy*map.Width+cx].Obj2=Cur_Ground;
map.Cell[cy*map.Width+cx].Obj2Pic=Cur_GroundPic;
}
}
break;
}
cx2=cx;
cy2=cy;
//设置undo
memcpy( UndoMap, map.Cell, sizeof(Cell_Struct)*map.Width*map.Height);
}
//弹出菜单
if( Button==RB_UP && !Key.KeyDown( DIK_LCONTROL ) )
{
PopupMenu();
}
//显示地图
map.ShowEditMap();
//显示网格
if( bShowCell )
ShowCell(lpDDSBack);
//预显当前物体
if( bShowCurrent && Cur_GroundPic!=BLOCK_CELL )
{
static Alpha=8;
int x= (cx-map.SX) * CellWidth + map.DX;
int y= (cy-map.SY) * CellHeight + map.DY;
if( Key.KeyDown( DIK_LSHIFT ) ) //获取
{
ABlt(lpDDSBack, x, y, lpDDSTools,
map._GetRectangle(4, ShowCellW), ColorKey16, 0);
}
else if( Key.KeyDown(DIK_LALT) ) //阻挡关系
{
ABlt(lpDDSBack, x, y, lpDDSTools,
map._GetRectangle(5, ShowCellW), ColorKey16, 15);
}
else if( Key.KeyDown(DIK_LCONTROL) ) //删除
{
ABlt(lpDDSBack, x, y, lpDDSTools,
map._GetRectangle(3, ShowCellW), ColorKey16, 0);
}
else if( Key.KeyDown(DIK_SPACE) ) //层次
{
ABlt(lpDDSBack, x, y, lpDDSTools,
map._GetRectangle(6, ShowCellW), ColorKey16, 0);
}
//如果是点选的话,就是连发模式
else if( Beg_Ground==-1 || x1>x2 || y1>y2 || (x1==x2 && y1==y2))
{
if( Cur_GroundPic >= 60 )
{
RECT rect;
long page = map.GetAniPage(Cur_Ground, rect);
ABlt(lpDDSBack, x, y, lpDDSMap[page], rect, 0, 16);
}
else
{
ABlt(lpDDSBack, x, y, lpDDSMap[Cur_GroundPic],
map._GetRectangle(Cur_Ground, ShowCellW), ColorKey16, Alpha);
}
}
else
{
for(int i=0; i<=x2-x1; i++)
for(int j=0; j<=y2-y1; j++)
{
if( Cur_GroundPic >= 60 )
{
RECT rect;
long page = map.GetAniPage(Beg_Ground+ShowCellW*j+i, rect);
ABlt(lpDDSBack, x+CellWidth*i, y+CellHeight*j,
lpDDSMap[page], rect, 0, 16);
}
else
{
ABlt(lpDDSBack, x+CellWidth*i, y+CellHeight*j,lpDDSMap[Cur_GroundPic],
map._GetRectangle(Beg_Ground+ShowCellW*j+i, ShowCellW),
ColorKey16, 16);
}
}
}
}
if( bShowEditInfo )
{
int n=map.GetCell(point.x, point.y);
if( n < 0 ) n = 0;
font.SetColor(RGB(255,255,255));
font.PrintText(lpDDSBack, 0, 0, "坐标:(%d,%d)", point.x, point.y);
font.PrintText(lpDDSBack, 0, 14, "格子:(%d,%d)=%d", cx, cy, n);
font.PrintText(lpDDSBack, 150, 0, "物体:%4d[%4d(%d)][%4d(%d)]", Cur_Ground, map.Cell[n].Obj, map.Cell[n].ObjPic, map.Cell[n].Obj2, map.Cell[n].Obj2Pic);
font.PrintText(lpDDSBack, 150, 14, "地面:%4d[%4d(%d)]", Cur_Ground, map.Cell[n].Ground, map.Cell[n].GroundPic);
font.PrintText(lpDDSBack, 80, 460, "当前层:%d[%s]", Cur_Level, Level[Cur_Level]);
font.PrintText(lpDDSBack, 550, 0, "Beg:%d", Beg_Ground);
font.PrintText(lpDDSBack, 550, 20, "End:%d", Cur_Ground);
font.PrintText(lpDDSBack, 550, 40, "Sel:%d", Sel_Ground);
}
}
////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////
//选择静态图素
void SelectGround(char Button)
{
//上翻页
if( key==DIK_A )
{
Cur_GroundPic--;
if( Cur_GroundPic < 0 )
Cur_GroundPic=Max_GroundPic-1;
Cur_GroundY=0;
}
//下翻页
if( key==DIK_Z )
{
Cur_GroundPic++;
if( Cur_GroundPic >= Max_GroundPic )
Cur_GroundPic=0;
Cur_GroundY=0;
}
//上下滚动
if( point.y>ScreenHeight-3 )
{
if( Cur_GroundY+ScreenHeight < GetSurfaceHeight(lpDDSMap[Cur_GroundPic]) )
Cur_GroundY+=CellHeight;
}
if( point.y < 3 )
{
if( Cur_GroundY >0 )
Cur_GroundY-=CellHeight;
}
static bShowSelect=false;
//左键按下
if( Button==LB_DOWN )
{
Beg_Ground=map._GetCell(point.x, Cur_GroundY+point.y, ShowCellW);
bShowSelect=true;
}
//左键松开
if( Button==LB_UP )
{
Cur_Ground=map._GetCell(point.x, Cur_GroundY+point.y, ShowCellW);
Sel_Ground=0;
Cur_Level=Cur_EditLevel; //返回编辑
bShowSelect=false;
}
if( Button==RB_UP )
{
Cur_Level=Cur_EditLevel;
bShowSelect=false;
}
//显示
RECT rect={0, Cur_GroundY, ScreenWidth, Cur_GroundY+ScreenHeight};
Blt(lpDDSBack, 0, 0, lpDDSMap[Cur_GroundPic], rect, false);
//显示网格
if( bShowCell )
ShowCell(lpDDSBack);
//块选计算
int x1=Beg_Ground % ShowCellW;
int y1=Beg_Ground / ShowCellW;
int x2=map._GetCellX(point.x, point.y+Cur_GroundY);
int y2=map._GetCellY(point.x, point.y+Cur_GroundY);
//显示选择方框
int x= map._GetCellX(point.x, point.y) * CellWidth;
int y= map._GetCellY(point.x, point.y) * CellHeight;
if( !bShowSelect || (Beg_Ground==-1 || x1>x2 || y1>y2 || (x1==x2 && y1==y2) ) )
{
ABlt(lpDDSBack, x, y, lpDDSTools, map._GetRectangle(0, ShowCellW), 0, 15);
}
else
{
for(int i=0; i<=x2-x1; i++)
for(int j=0; j<=y2-y1; j++)
{
ABlt(lpDDSBack, CellWidth*(x1+i), CellHeight*(y1+j)-Cur_GroundY,
lpDDSTools, map._GetRectangle(0, ShowCellW), 0, 16);
}
}
font.SetColor(RGB(255,255,255));
font.PrintText(lpDDSBack, 5, 5, "[A]=上一页 [Z]=下一页");
font.PrintText(lpDDSBack, 80, 460, "当前层:%d[%s]", Cur_Level, Level[Cur_Level]);
font.PrintText(lpDDSBack, 260, 460, "当前格子: %d / %d 页", map._GetCell(point.x, point.y+Cur_GroundY, ShowCellW), Cur_GroundPic);
font.PrintText(lpDDSBack, 550, 0, "Beg:%d", Beg_Ground);
font.PrintText(lpDDSBack, 550, 20, "End:%d", Cur_Ground);
}
//选择动态图素
void SelectAni(char Button)
{
if( Button==RB_UP )
{
Cur_Level=Cur_EditLevel;
}
static bShowSelect=false;
//左键按下
if( Button==LB_DOWN )
{
Beg_Ground=map._GetCell(point.x, Cur_GroundY+point.y, ShowCellW);
bShowSelect=true;
}
//左键松开
if( Button==LB_UP )
{
Cur_Ground=map._GetCell(point.x, Cur_GroundY+point.y, ShowCellW);
Sel_Ground=0;
Cur_GroundPic = 60;
Cur_Level=Cur_EditLevel; //返回编辑
bShowSelect=false;
}
if( Button==RB_UP )
{
Cur_Level=Cur_EditLevel;
bShowSelect=false;
}
// 重读anilist
if( key == DIK_R )
{
map.LoadAniCell("ini\\anicell.ini", "");
}
//显示
Clrscr(lpDDSBack);
for(int num=0; num<CMap::AniCellNum; num++)
{
RECT rect = {0,0,0,0};
long page = map.GetAniPage(num, rect);
BltFast(lpDDSBack, num%20*CellWidth, num/20*CellWidth, lpDDSMap[ page ], rect, true);
}
//显示网格
if( bShowCell )
ShowCell(lpDDSBack);
font.SetColor(RGB(255,255,255));
font.PrintText(lpDDSBack, 80, 460, "当前层:%d[%s]", Cur_Level, Level[Cur_Level]);
font.PrintText(lpDDSBack, 260, 460, "当前格子: %d / %d 页", map._GetCell(point.x, point.y+Cur_GroundY, ShowCellW), Cur_GroundPic);
font.PrintText(lpDDSBack, 550, 0, "Beg:%d", Beg_Ground);
font.PrintText(lpDDSBack, 550, 20, "End:%d", Cur_Ground);
font.PrintText(lpDDSBack, 550, 40, "R : 重读动画图块列表");
map.AniLoop();
}
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
//显示网格
void ShowCell(LPDIRECTDRAWSURFACE ds)
{
int i;
for(i=1; i<ShowCellH; i++)
{
Line(lpDDSBack, 0, i*CellWidth, ScreenWidth, i*CellWidth, RGB16(128,128,128));
}
for(i=1; i<ShowCellW; i++)
{
Line(lpDDSBack, i*CellHeight, 0, i*CellHeight, ScreenHeight, RGB16(128,128,128));
}
}
//清空编辑数据
void ClearEditData()
{
}
//弹出菜单
void PopupMenu()
{
int l,t;
if( WindowMode == 0 )
{
l=t=0;
}
else
{
l=RectWindow.left;
t=RectWindow.top;
}
pmmParent=LoadMenu(hInst, "IDR_MENU_POP");
HMENU pmm=GetSubMenu(pmmParent, 0);
//显示网格
if( bShowCell )
CheckMenuItem(pmm, ID_MENUITEM_ShowCell, MF_CHECKED);
//显示物体
if( bShowObject )
CheckMenuItem(pmm, ID_MENUITEM_ShowObject, MF_CHECKED);
//显示阻挡关系
if( bShowBlock )
CheckMenuItem(pmm, ID_MENUITEM_ShowBlock, MF_CHECKED);
//显示当前图块
if( bShowCurrent )
CheckMenuItem(pmm, ID_MENUITEM_ShowCurrent, MF_CHECKED);
//显示其他
if( bShowEdit )
CheckMenuItem(pmm, ID_MENUITEM_ShowEdit, MF_CHECKED);
//只显示物体
if( bShowOnlyObject )
CheckMenuItem(pmm, ID_MENUITEM_ShowObjectOnly, MF_CHECKED);
//地面层
if( Cur_Level == CL_GROUND )
CheckMenuItem(pmm, ID_MENUITEM_Ground, MF_CHECKED);
//物体层1
if( Cur_Level == CL_OBJECT )
CheckMenuItem(pmm, ID_MENUITEM_Object, MF_CHECKED);
//物体层1
if( Cur_Level == CL_OBJECT2 )
CheckMenuItem(pmm, ID_MENUITEM_Object2, MF_CHECKED);
TrackPopupMenu(pmm, TPM_LEFTALIGN|TPM_RIGHTBUTTON,
point.x+l, point.y+t,
0,
hWnd,
NULL);
bMenuPop=true;
}
//处理编辑器右键菜单消息
void MapEditProc(long msg)
{
switch (msg)
{
//选择静态图素
case ID_MENUITEM_SelGround:
if( Cur_Level < 3 ) Cur_EditLevel = Cur_Level;
Cur_Level=CL_PIC_SEL;
if( Cur_GroundPic >= 60 )
{
Cur_GroundPic = 0;
Cur_Ground = 0;
}
break;
//选择动态图素
case ID_MENUITEM_SelAni:
if( Cur_Level < 3 )
Cur_EditLevel = Cur_Level;
Cur_Level=CL_ANI_SEL;
break;
//设置敌人
case ID_MENUITEM_Enemy:
CreateDlg(IDD_DIALOG_EnemySet, DialogEnemySetListProc);
break;
//格子属性
case ID_MENUITEM_Cell:
CreateDlg(IDD_DIALOG_Object, DialogObjectProc);
break;
//设置陷阱
case ID_MENUITEM_SetHook:
CreateDlg(IDD_DIALOG_Hook, (DLGPROC)DialogChangePointListProc);
break;
//删除陷阱
case ID_MENUITEM_DelHook:
map.Cell[map.Width*cy+cx].CP=BLOCK_CP;
break;
//主菜单
case ID_MENUITEM_Map:
CreateDlg(IDD_DIALOG_Main, (DLGPROC)DialogProc);
break;
//显示缩略图
case ID_MENUITEM_FullMap:
map.ShowFullMap();
break;
//显示网格
case ID_MENUITEM_ShowCell:
bShowCell=!bShowCell;
break;
//显示物体
case ID_MENUITEM_ShowObject:
bShowObject=!bShowObject;
break;
//显示阻挡关系
case ID_MENUITEM_ShowBlock:
bShowBlock=!bShowBlock;
break;
//显示当前图块
case ID_MENUITEM_ShowCurrent:
bShowCurrent=!bShowCurrent;
break;
//显示其他
case ID_MENUITEM_ShowEdit:
bShowEdit=!bShowEdit;
break;
//只显示物体
case ID_MENUITEM_ShowObjectOnly:
bShowOnlyObject=!bShowOnlyObject;
break;
//编辑层次-地面
case ID_MENUITEM_Ground:
Cur_Level=CL_GROUND;
break;
//编辑层次-物体1
case ID_MENUITEM_Object:
Cur_Level=CL_OBJECT;
break;
//编辑层次-物体2
case ID_MENUITEM_Object2:
Cur_Level=CL_OBJECT2;
break;
//存取地图-new
case ID_MENUITEM_New:
_NewMap(hWnd);
break;
//存取地图-open
case ID_MENUITEM_Load:
_LoadMap(hWnd);
break;
//存取地图-save
case ID_MENUITEM_Save:
_SaveMap(hWnd);
break;
//存取地图-saveas
case ID_MENUITEM_SaveAs:
_SaveAsMap(hWnd);
break;
//退出
case ID_MENUITEM_Exit:
RunGame=false;
break;
//反悔
case ID_MENUITEM_Undo:
{
Cell_Struct *tmp=map.Cell;
map.Cell=UndoMap;
UndoMap=tmp;
}
break;
//取消
case ID_MENUITEM_Cancel:
break;
//退出
case IDM_Exit:
RunGame=false;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -