📄 map.cpp
字号:
rect=_GetRectangle(obj2, ShowCellW);
Blt(surf, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].Obj2Pic], rect, TRUE);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj2(cellnum, rect);
Blt(surf, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, TRUE);
}
}
}
}
//显示NPC
bool bShowPlayer = false;
//NPC按y坐标排序,使下面的NPC挡住上面的NPC
SortNpc();
for(int n=0; n<m_vSortNpc.size(); n++)
{
//插入的方式显示显示主角,实现遮挡关系
if( !bShowPlayer && role[0].State.y < m_vSortNpc[n]->State.y && role[0].State.bShow )
{
role[0].Show(j, i);
bShowPlayer = true;
}
if( m_vSortNpc[n]->State.bShow )
{
m_vSortNpc[n]->ShowNpcPic(j, i, n);
}
}
//如果上面没有显示主角,就显示主角。原因是因为主角的y坐标比所有的NPC都大
if( !bShowPlayer && role[0].State.bShow )
{
role[0].Show(j, i);
}
for(i=starty; i<endy ; i++)
for(j=startx; j<endx ; j++)
{
//TILE坐标
cellnum=Width * i + j;
//画能遮挡主角的物体 level1
//一样的逻辑
level=Cell[ cellnum ].Level;
if( level==OL_UP )
{
obj=Cell[ cellnum ].Obj;
if( obj != BLOCK_CELL )
{
if( Cell[ cellnum ].ObjPic < 60 )
{
rect=_GetRectangle(obj, ShowCellW);
Blt(surf, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].ObjPic], rect, TRUE);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj(cellnum, rect);
Blt(surf, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, TRUE);
}
}
}
//画能遮挡主角的物体 level2
level=Cell[ cellnum ].Level2;
if( level==OL_UP )
{
obj2=Cell[ cellnum ].Obj2;
if( obj2 != BLOCK_CELL )
{
if( Cell[ cellnum ].Obj2Pic < 60 )
{
rect=_GetRectangle(obj2, ShowCellW);
Blt(surf, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].Obj2Pic], rect, TRUE);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj2(cellnum, rect);
Blt(surf, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, TRUE);
}
}
}
}
//人物到物体后面的半透明显示
if( role[0].State.Y < map.Height && role[0].State.X < map.Width )
{
//两层物体都不是空的
if( map.Cell[map.Width*role[0].State.Y+role[0].State.X].Obj != BLOCK_CELL ||
map.Cell[map.Width*role[0].State.Y+role[0].State.X].Obj2 != BLOCK_CELL )
//Alpha显示主角
role[0].ShowRole(24);
}
//显示当前地图名字
if( ShowNameCount>0 )
{
ShowNameCount--;
if( ShowNameCount > 16 && ShowNameAlpha >0 )
ShowNameAlpha-=2; //淡入
if( ShowNameCount < 16 )
ShowNameAlpha+=2; //淡出
//阴影显示
ShowNameFont.SetColor(0);
ShowNameFont.PrintAlphaText(surf, 17, 15, ShowNameAlpha, Name);
ShowNameFont.SetColor(RGB(225,255,225));
ShowNameFont.PrintAlphaText(surf, 15, 13, ShowNameAlpha, Name);
}
// 动画
AniLoop();
}
//*******************
//显示编辑时的地图,和ShowMap一样的逻辑
void CMap::ShowEditMap()
{
int i,j, cellnum, obj, obj2, level, level2, block;
RECT rect;
// 显示背景
if( m_pBackBmp )
{
int w, h;
GetSurfaceSize(m_pBackBmp, w, h);
rect.right = w;
rect.bottom = h;
BltFast(lpDDSBack, 0, 0, m_pBackBmp, rect, false);
}
//主角移动
role[0].Move(role[0].State.X, role[0].State.Y);
CurrentNpc=-1;
for(i=0; i<m_vNpc.size(); i++)
{
//获取当前指向NPC
if( cx == m_vNpc[i]->State.X && cy == m_vNpc[i]->State.Y )
{
CurrentNpc=i;
}
//NPC移动
if( m_vNpc[i]->State.bActive && !m_vNpc[i]->bMoving )
{
if( random(100)>98 )
{
m_vNpc[i]->MoveTo(random(Width)*CellWidth, random(Height)*CellHeight);
}
}
m_vNpc[i]->Move(m_vNpc[i]->State.X, m_vNpc[i]->State.Y);
}
//计算显示坐标 startx\endx\starty\endy
CountDisplayGrid();
//显示地面
int ground=Width * starty + startx;
if( bShowOnlyObject ) //只显示物体
Clrscr(lpDDSBack, 0);
else
for(i=starty; i<endy ; i++)
{
for(j=startx; j<endx ; j++)
{
if( Cell[ ground ].GroundPic < 60 )
{
rect=_GetRectangle(Cell[ ground ].Ground, ShowCellW);
BltFast(lpDDSBack, DX+_point_x(j-SX), DY+_point_y(i-SY),
lpDDSMap[ Cell[ ground ].GroundPic ], rect, true);
ground++;
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPage(ground, rect);
BltFast(lpDDSBack, DX+_point_x(j-SX), DY+_point_y(i-SY),
lpDDSMap[ page ], rect, true);
ground++;
}
}
ground=ground+Width-(endx-startx);
}
//显示物体和人物
for(i=starty; i<endy ; i++)
for(j=endx-1; j>=startx; j--)
{
if( bShowObject ) //显示物体
{
cellnum=Width * i + j;
//画不能遮挡主角的物体
level=Cell[ cellnum ].Level;
if( level==OL_NORMAL )
{
obj=Cell[ cellnum ].Obj;
if( obj != BLOCK_CELL )
{
if( Cell[ cellnum ].ObjPic < 60 )
{
rect=_GetRectangle(obj, ShowCellW);
if( bShowOnlyObject && Cur_Level == CL_OBJECT )//NOCOLORKEY
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].ObjPic], rect, false);
else
if( !bShowOnlyObject ) //SRCCOLORKAY
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].ObjPic], rect, true);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj(cellnum, rect);
if( bShowOnlyObject && Cur_Level == CL_OBJECT )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, false);
else
if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, true);
}
}
}
level=Cell[ cellnum ].Level2;
if( level == OL_NORMAL )
{
obj2=Cell[ cellnum ].Obj2;
if( obj2 != BLOCK_CELL )
{
if( Cell[ cellnum ].Obj2Pic < 60 )
{
rect=_GetRectangle(obj2, ShowCellW);
if( bShowOnlyObject && Cur_Level == CL_OBJECT2 )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].Obj2Pic], rect, false);
else
if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].Obj2Pic], rect, true);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj2(cellnum, rect);
if( bShowOnlyObject && Cur_Level == CL_OBJECT2 )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, false);
else
if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, true);
}
}
}
}
}
//显示NPC
bool bShowPlayer = false;
SortNpc();
for(int n=0; n<m_vSortNpc.size(); n++)
{
//显示主角
if( !bShowPlayer && role[0].State.y < m_vSortNpc[n]->State.y && role[0].State.bShow )
{
role[0].Show(j, i);
bShowPlayer = true;
}
if( m_vSortNpc[n]->State.bShow )
{
m_vSortNpc[n]->ShowNpcPic(j, i, n);
}
}
for(i=starty; i<endy ; i++)
for(j=startx; j<endx ; j++)
{
cellnum=Width * i + j;
level=Cell[ cellnum ].Level;
level2=Cell[ cellnum ].Level2;
block=Cell[ cellnum ].Block;
if( bShowObject ) //显示物体
{
obj=Cell[ cellnum ].Obj;
obj2=Cell[ cellnum ].Obj2;
//画能遮挡主角的物体
if( level==OL_UP )
{
if( obj != BLOCK_CELL )
{
if( Cell[ cellnum ].ObjPic < 60 )
{
rect=_GetRectangle(obj, ShowCellW);
if( bShowOnlyObject && Cur_Level == CL_OBJECT )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].ObjPic], rect, false);
else
if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].ObjPic], rect, true);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj(cellnum, rect);
if( bShowOnlyObject && Cur_Level == CL_OBJECT )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, false);
else
if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, true);
}
}
}
if( level2==OL_UP )
{
if( obj2 != BLOCK_CELL )
{
if( Cell[ cellnum ].Obj2Pic < 60 )
{
rect=_GetRectangle(obj2, ShowCellW);
if( bShowOnlyObject && Cur_Level == CL_OBJECT2 )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].Obj2Pic], rect, false);
else if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[Cell[ cellnum ].Obj2Pic], rect, true);
}
else // 动态图素
{
RECT rect = {0,0,0,0};
long page = GetAniCellPageObj2(cellnum, rect);
if( bShowOnlyObject && Cur_Level == CL_OBJECT2 )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, false);
else
if( !bShowOnlyObject )
Blt(lpDDSBack, DX+ _point_x(j-SX), DY+ _point_y(i-SY),
lpDDSMap[page], rect, true);
}
}
}
}
if( g_ePlayState == PS_EDIT ) //显示状态
{
//显示阻挡关系
if( bShowBlock && Cell[cellnum].Block==1||Block[cellnum]==1)
FillCell(j-startx, i-starty, 1);
//显示陷阱
if( bShowEdit && Cell[cellnum].CP != BLOCK_CP )
{
FillCell(j-startx, i-starty, 2);
font.SetColor(RGB(255,255,0));
font.PrintText(lpDDSBack, _point_x(j-startx)+DX, _point_y(i-starty)+DY, "%d", Cell[cellnum].CP );
font.PrintText(lpDDSBack, _point_x(j-startx)+DX+16, _point_y(i-starty)+DY+16, "%d", Cell[cellnum].CPType );
}
//显示鼠标状态
if( bShowEdit && Cell[cellnum].MouseType != CCursor::CS_NORMAL )
{
font.SetColor(RGB(255,255,255));
font.PrintText(lpDDSBack, _point_x(j-startx)+DX, _point_y(i-starty)+DY+16, "%d", Cell[cellnum].MouseType );
}
//显示物体层次
if( bShowEdit )
if( bShowOnlyObject )
{
if( Cur_Level == CL_OBJECT && Cell[cellnum].Level == OL_UP )
{
FillCell(j-startx, i-starty, 7);
}
if( Cur_Level == CL_OBJECT2 && Cell[cellnum].Level2 == OL_UP )
{
FillCell(j-startx, i-starty, 8);
}
}
else
{
if( Cell[cellnum].Level==OL_UP )
{
FillCell(j-startx, i-starty, 7);
}
if( Cell[cellnum].Level2==OL_UP )
{
FillCell(j-startx, i-starty, 8);
}
}
}
}
//人物到物体后面的半透明显示
if( map.Cell[map.Width*role[0].State.Y+role[0].State.X].Obj != BLOCK_CELL )
role[0].ShowRole(24);
//显示当前地图名字
if( ShowNameCount>0 )
{
ShowNameCount--;
if( ShowNameCount > 16 && ShowNameAlpha >0 ) ShowNameAlpha-=2; //淡入
if( ShowNameCount < 16 ) ShowNameAlpha+=2; //淡出
ShowNameFont.SetColor(0);
ShowNameFont.PrintAlphaText(lpDDSBack, 7, 5, ShowNameAlpha, Name);
ShowNameFont.SetColor(RGB(255,255,255));
ShowNameFont.PrintAlphaText(lpDDSBack, 5, 3, ShowNameAlpha, Name);
}
// 动画
AniLoop();
}
//-----------------------------------------------------------------
//淡入
void CMap::FadeIn(int Style, int time, WORD color)
{
if( g_eDisplayState == DS_NIGHT )
GetPrimarySurface(lpDDSBack);
//特效淡入
switch( Style )
{
case 0: //无效果
break;
case 1: //百叶窗
ScreenIn(16, time);
break;
case 2: //淡入淡出
ColorIn(time, color);
break;
}
}
//淡出
void CMap::FadeOut(int Style, int time)
{
switch( Style )
{
case 0: //无效果
break;
case 1: //百叶窗
map.ShowMap(true);
if( g_eDisplayState==DS_NIGHT )
Clrscr(lpDDSBackGround, 0);
//更新到lpDDSBackGround
UpdateScreen(lpDDSBackGround, RectScreen);
ScreenOut(lpDDSBackGround, 16, time);
case 2: //淡入淡出
map.ShowMap(true);
if( g_eDisplayState==DS_NIGHT )
Clrscr(lpDDSBackGround, 0);
UpdateScreen(lpDDSBackGround, RectScreen);
ColorOut(lpDDSBackGround, time);
break;
}
}
//设置地图中心点
void CMap::CenterMap(int centx, int centy)
{
SX=centx-10; //向左10个格子
SY=centy-7; //向上7个格子
//边界检查
if( SX >= Width-1-ShowCellW )
SX=Width-1-ShowCellW;
if( SY >= Height-1-ShowCellH )
SY=Height-1-ShowCellH;
if( SX<0 )
SX=0;
if( SY<0 )
SY=0;
//计算当前地图左上角坐标
sx=_point_x(SX)-DX;
sy=_point_y(SY)-DY;
}
//卷动地图到某点
void CMap::ScrollTo(int ox, int oy, int ostep)
{
ScrollX=ox;
ScrollY=oy;
ScrollStep=ostep;
//边界检查
if( ScrollX > Width-ShowCellW-2 )
{
ScrollX=Width-ShowCellW-2;
}
if( ScrollX < 0 )
{
ScrollX=0;
}
if( ScrollY > Height-ShowCellH-2 )
{
ScrollY=Height-ShowCellH-2;
}
if( ScrollY < 0 )
{
ScrollY=0;
}
//进入卷地图状态
if(ScrollX>SX)
m_bScrollRight = TRUE;
else
m_bScrollRight = FALSE;
if(ScrollY>SY)
m_bScrollDown = TRUE;
else
m_bScrollDown = FALSE;
g_ePlayState = PS_SCROLLMAP;
}
//卷动循环
void CMap::ScrollLoop()
{
int ox=ScrollX-SX;
int oy=ScrollY-SY;
//先是DX的移动,超过一个格子后就移动一个格子,DX复位
if( ox > 0 ) //右
{
DX-=ScrollStep;
if( DX <= -32 )
{
DX+=32;
SX++;
}
}
else if( ox < 0 ) //左
{
DX+=ScrollStep;
if( DX >=0 )
{
DX-=32;
SX--;
}
}
else //SX到位,如果是向右边卷,就停止,反之,还卷一个格子
{
if(m_bScrollRight)
DX=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -