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

📄 map.cpp

📁 凌星科技_2004-5-17_《圣剑英雄传II》的源代码scr2
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						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 + -