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

📄 guiradarctrl.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:


//#include "platform/platform.h"
//#include "math/mrect.h"
#include "console/console.h"
#include "console/consoleTypes.h"
#include "dgl/dgl.h"
#include "game/game.h"
#include "gui/game/guiRadarCtrl.h"
#include "game/gameConnection.h"
#include "terrain/terrData.h"
#include "rpg/gobjects/RPGBase.h"
#include "game/gameTSCtrl.h"


using namespace RPG;

IMPLEMENT_CONOBJECT(GuiRadarCtrl);

GuiRadarCtrl::GuiRadarCtrl(void)
{
	mBitmapName = StringTable->insert("");
	mRadius		= 50.0F;				//  Radar Range
	mZoomAngle	= 90;				//  Viewing Angle
	mRState		= 1;					//  Radar On/Off
	mMState		= 1;					//  Map On/Off
	m_fRoleRadius	= 3.f;
	m_fUnitRadius	= 2.f;

   m_clrRole.set(0., 1., 1.0);		//蓝
	m_clrPlayer.set(0.0,1.0,0.);		//绿色
	m_clrTeam.set(1.,0.,1.0);			//紫色
	m_clrNPC.set(1.0,1.0,1.0);			//白色
   m_clrShop.set(1., 1., 0.0);		//黄
   m_clrMonster.set(1., 0., 0.0);	//红
   m_clrBalk.set(1., 1., 1.0,0.5);	//半白
	m_clrNull.set(0.5,0.5,0.5);		//灰色
	m_clrOther.set(1.0,1.0,1.0);		//白色

	m_clrTaskNpc.set(113,53,166);		//紫色
	m_clrTaskLock.set(248,239,80);	//亮黄色


}

void GuiRadarCtrl::initPersistFields()
{
	Parent::initPersistFields();
}

static void cRadarSetBitmap(SimObject *obj, S32, const char **argv)
{
	GuiRadarCtrl *ctrl = static_cast<GuiRadarCtrl*>(obj);
	ctrl->setBitmap(argv[2]);
}

void GuiRadarCtrl::consoleInit()
{
	Con::addCommand("GuiRadarCtrl", "setMapBitmap",  cRadarSetBitmap,   "guiRadarCtrl.setBitmap(blah)", 3, 3);
}


//////////////////////////////////////////////////////////////
void GuiRadarCtrl::setBitmap(const char *name)
{
	//mBitmapName = StringTable->insert(name);
	//if (*mBitmapName) 
	//	mMap = TextureHandle(mBitmapName, BitmapTexture, true);
	//else
	//	mMap = initSceneBalkTexture();

	//if(bool(mMap))
	{
		// Path to radar images
		mCompass			= TextureHandle("ui/img/radar/compass", BitmapTexture, true);
		mTextureHandle	= TextureHandle("ui/img/radar/radar_base", BitmapTexture, true);
	}
	//else 
	//{
	//	// Reset handles if UI object is hidden
	//	mTextureHandle	= NULL;
	//	mCompass			= NULL;
	//	mMap				= NULL;
	//}
	setUpdate();
}



bool GuiRadarCtrl::onWake()
{   
	if (! Parent::onWake())
		return false;

	setActive(true);
	setBitmap(mBitmapName);

	calcCenterPos();

	return true;
}

void GuiRadarCtrl::onSleep()
{
	mTextureHandle = NULL;
	mCompass = NULL;
	mMap = NULL;
	Parent::onSleep();
}

void GuiRadarCtrl::resize(const Point2I &newPosition, const Point2I &newExtent)
{
	Parent::resize(newPosition,newExtent);
	calcCenterPos();
}

void GuiRadarCtrl::calcCenterPos()
{
	Point2I point(mBounds.point); 
	GuiControl*	pParent = getParent();
	if(pParent)
		point = pParent->localToGlobalCoord(mBounds.point);

	m_posRadarCenter.set(point.x ,point.y); 
	m_posRadarCenter.x += mBounds.extent.x *0.5f;
	m_posRadarCenter.y += mBounds.extent.y *0.5f;
}



TextureHandle GuiRadarCtrl::initSceneBalkTexture()
{
	//生成地图障碍区域
	mTextureHandle		= NULL;

	// Must have a connection
	GameConnection* conn = GameConnection::getConnectionToServer();
	if (!conn) 
		return TextureHandle();

	if(!g_pTerrainBlock)
		return TextureHandle();

	GBitmap* pBitmap;
	S32		x,y;
	U8			*pBmpAddr;
	U32		sceneW,sceneH;
	TerrainScene*	pScene;


	pScene	= g_pTerrainBlock->getTerrainScene();
	if(!pScene)
		return TextureHandle();

	sceneW	= pScene->GetWidth();
	sceneH	= pScene->GetHeight();
	pBitmap	= new GBitmap(sceneW, sceneH, 0, GBitmap::Alpha);
	pBmpAddr	= pBitmap->getAddress(0,0); 

	for(y=sceneH-1; y >= 0; y--) 
	{
		for(x=0; x < sceneW; x++) 
		{
			*pBmpAddr = pScene->isBlockAt(x,y)? 255 : 0;
		}
	}

	// Set texture handle
	return TextureHandle("radarBalkMap", pBitmap, true);
}



// Conversion function, (used to find the angle of the camera and angle of the object from the client)
inline float Vector3dToDegree(Point3F vector)
{
	float angle;
	if (vector.x == 0.0F)
	{
		if (vector.y > 0.0F)
			return 0.0F;
		else if (vector.y == 0.0F)
			return -1.0F;
		else
			return 180.0F;
	}
	if (vector.y == 0.0F)
	{
		if (vector.x < 0.0F)
			return 270.0F;
		else
			return 90.0F;
	}
	angle = atanf((vector.x) / (-vector.y)) * (180.0F / M_PI);
	if ((-vector.y) < 0.0F)
		return angle + 180.0F;
	else
	{
		if (vector.x > 0.0F)
			return angle;
		else
			return angle + 360.0F;
	}
}


// Conversion function, Degrees to vector (used after manipulating camera angle to represent angle of object on radar)
inline void DegreeToVector2d(float angle, float length, Point3F &vector)
{
	angle = (angle / 180.0F) * M_PI;
	vector.x = length * (sin(angle) );
	vector.y = length * (-cos(angle) );
}


//static void findObjectsCallback(SceneObject* obj, void * val)
//{
//	Vector<SceneObject*> * list = (Vector<SceneObject*>*)val;
//	list->push_back(obj);
//}


void GuiRadarCtrl::onRender(Point2I offset, const RectI &updateRect) 
{ 

	// Must have a connection
	GameConnection* conn = GameConnection::getConnectionToServer();
	if (!conn) return;

	//if(GameTSCtrl::ms_arGameBases.size() == 0)
	//	return;

	
	MatrixF cam;
	Point3F cameraRot;

	conn->getControlCameraTransform(0,&cam);
	conn->getControlCameraFov(&mZoomAngle);  //  Get Camera FOV
	cam.getRow(1,&cameraRot);
	cameraRot.neg(); 


	// get angle that camera is facing
	float cameraAngle = Vector3dToDegree(cameraRot);
	F32 HWidth			= mBounds.extent.x/2.0;
	F32 HHeight			= mBounds.extent.y/2.0;
	F32 HW				= HWidth * 0.9;  //  slightly smaller than the compass ring
	F32 mapsize			= TerrainBlock::BlockSize* 8;  //  Get Map Scaling Factor (8 usually)


	//原点移动到雷达中心
	glPushMatrix();
	glTranslatef(m_posRadarCenter.x, m_posRadarCenter.y , 0);  //  Center of Radar Control
	glEnable(GL_TEXTURE_2D);
	glEnable(GL_BLEND);
	glColor4f(1.0, 1.0, 1.0, 1.0);  //  Background transparency control


	// Draw static radar background pBitmap
	//else 
	if (mTextureHandle && mRState) 
	{ 
		TextureObject* texture = (TextureObject *) mTextureHandle; 
		glBindTexture(GL_TEXTURE_2D, texture->texGLName);

		glBegin(GL_QUADS);
		glTexCoord2f(0, 0);  glVertex2f(-HWidth, -HHeight);
		glTexCoord2f(1, 0);  glVertex2f( HWidth, -HHeight);
		glTexCoord2f(1, 1);  glVertex2f( HWidth,  HHeight);
		glTexCoord2f(0, 1);  glVertex2f(-HWidth,  HHeight);
		glEnd();					
	} 



	if (mRState) 
	{
		Point3F		newCoord;
		GameBase*	pObject;
		RPGBase*		pRPGObject;
		U32			i;
		F32			objectAngle;
		F32			length;


		glDisable(GL_TEXTURE_2D);  //  Plot the Dots...
		glDisable(GL_BLEND);	

		///////////////////////////////////////////////////
		//绘画普通点
		if(GameTSCtrl::ms_arNormals.size())
		{
			glPointSize(m_fUnitRadius*2.0f);
			glBegin(GL_POINTS);

			for(i = 0; i < GameTSCtrl::ms_arNormals.size(); i++)
			{
				pObject		= GameTSCtrl::ms_arNormals[i];
				pRPGObject	= pObject->getRPGBase();

				//位置偏移量调整
				newCoord		= pObject->getPosition();
				newCoord.x -= GameTSCtrl::ms_posMainRole.x;
				newCoord.y -= GameTSCtrl::ms_posMainRole.y;
				newCoord.y = -newCoord.y;  //  Engine Bug Fix
				newCoord.z = 0;

				//旋转位置
				objectAngle = Vector3dToDegree(newCoord);
				length		= newCoord.len()*HW/mRadius;
				DegreeToVector2d( ( (360.f - objectAngle)+(cameraAngle) ), length, newCoord);
				newCoord.x			= -newCoord.x;

				//颜色调整
				if(pRPGObject->IsPlayer())
					glColor4f(m_clrPlayer.red, m_clrPlayer.green, m_clrPlayer.blue, m_clrPlayer.alpha);
				else if(pRPGObject->IsNpc())
					glColor4f(m_clrNPC.red, m_clrNPC.green, m_clrNPC.blue, m_clrNPC.alpha);
				else if(pRPGObject->IsMonster())
					glColor4f(m_clrMonster.red, m_clrMonster.green, m_clrMonster.blue, m_clrMonster.alpha);
				else
					glColor4f(m_clrOther.red, m_clrOther.green, m_clrOther.blue, m_clrOther.alpha);

				glVertex2f(newCoord.x,newCoord.y);
			}//for(U32 i = 0; i < objects.size(); i++)
			glEnd();
		}//if(GameTSCtrl::ms_arNormals.size())


		///////////////////////////////////////////////////
		//绘画TaskLock点
		if(GameTSCtrl::ms_arTaskLocks.size())
		{
			glPointSize(m_fUnitRadius*2.5f);
			glBegin(GL_POINTS);
			glColor4ub(m_clrTaskLock.red, m_clrTaskLock.green, m_clrTaskLock.blue, m_clrTaskLock.alpha);
			for(i = 0; i < GameTSCtrl::ms_arTaskLocks.size(); i++)
			{
				pObject		= GameTSCtrl::ms_arTaskLocks[i];
				pRPGObject	= pObject->getRPGBase();

				//位置偏移量调整
				newCoord		= pObject->getPosition();
				newCoord.x -= GameTSCtrl::ms_posMainRole.x;
				newCoord.y -= GameTSCtrl::ms_posMainRole.y;
				newCoord.y = -newCoord.y;  //  Engine Bug Fix
				newCoord.z = 0;

				//旋转位置
				objectAngle = Vector3dToDegree(newCoord);
				length		= newCoord.len()*HW/mRadius;
				DegreeToVector2d( ( (360.f - objectAngle)+(cameraAngle) ), length, newCoord);
				newCoord.x			= -newCoord.x;

				glVertex2f(newCoord.x,newCoord.y);
			}//for
			glEnd();
		}//		if(GameTSCtrl::ms_arTaskLocks.size())


		///////////////////////////////////////////////////
		//绘画TaskLock点
		if( GameTSCtrl::ms_arTaskNpcs.size())
		{
			glPointSize(m_fUnitRadius*3.0f);
			glBegin(GL_POINTS);
			glColor4ub(m_clrTaskNpc.red, m_clrTaskNpc.green, m_clrTaskNpc.blue, m_clrTaskNpc.alpha);
			for(i = 0; i < GameTSCtrl::ms_arTaskNpcs.size(); i++)
			{
				pObject		= GameTSCtrl::ms_arTaskNpcs[i];
				pRPGObject	= pObject->getRPGBase();

				//位置偏移量调整
				newCoord		= pObject->getPosition();
				newCoord.x -= GameTSCtrl::ms_posMainRole.x;
				newCoord.y -= GameTSCtrl::ms_posMainRole.y;
				newCoord.y = -newCoord.y;  //  Engine Bug Fix
				newCoord.z = 0;

				//旋转位置
				objectAngle = Vector3dToDegree(newCoord);
				length		= newCoord.len()*HW/mRadius;
				DegreeToVector2d( ( (360.f - objectAngle)+(cameraAngle) ), length, newCoord);
				newCoord.x			= -newCoord.x;

				glVertex2f(newCoord.x,newCoord.y);
			}//for
			glEnd();
		}//if( GameTSCtrl::ms_arTaskNpcs.size())


		/////////////////////////////////////////////////////////////
		//绘画主角
		glBegin(GL_LINE_LOOP);
		//glBegin(GL_POINTS);
		//glPointSize(5.0);
		glColor4f(m_clrRole.red, m_clrRole.green, m_clrRole.blue, m_clrRole.alpha);
		//glVertex2f(0,0);
		glVertex2f(-m_fRoleRadius,-m_fRoleRadius);
		glVertex2f(-m_fRoleRadius,m_fRoleRadius);
		glVertex2f(m_fRoleRadius,m_fRoleRadius);
		glVertex2f(m_fRoleRadius,-m_fRoleRadius);
		glEnd();

		//恢复默认
		glPointSize(1.0f);


	}  //  if mRState



	if (mCompass)
	{			
		glEnable(GL_TEXTURE_2D);
		glEnable(GL_BLEND);
		//glDepthFunc(GL_ALWAYS);
		TextureObject* texture = (TextureObject *) mCompass; 
		glBindTexture(GL_TEXTURE_2D, texture->texGLName);

		glPushMatrix();
		glRotatef(-cameraAngle, 0, 0, 1);
		glColor4f(1.0, 1.0, 1.0, 0.7);  //  Compass Ring
		glBegin(GL_QUADS);
		glTexCoord2f(0, 0);  glVertex2f(-HWidth, -HHeight);
		glTexCoord2f(1, 0);  glVertex2f( HWidth, -HHeight);
		glTexCoord2f(1, 1);  glVertex2f( HWidth,  HHeight);
		glTexCoord2f(0, 1);  glVertex2f(-HWidth,  HHeight);
		glEnd();

		glDisable(GL_TEXTURE_2D);
		glDisable(GL_BLEND);
		glPopMatrix();  //  Undo glRotate
	}	

	glPopMatrix();  //  Undo glTranslate


	renderChildControls(offset, updateRect); 
} 

⌨️ 快捷键说明

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