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