📄 monitor.cpp
字号:
}
glEnd();
}
text_x = x + radius*cosDeg((ang1 + ang2) / 2);
text_y = y + radius*sinDeg((ang1 + ang2) / 2);
text_z = 0.1;
// print out the text information
glColor4f(0, 0, 0, 1.0);
mGLServer.DrawText3D(buff, Vector3(text_x, text_y, text_z));
}
}
}
void
Monitor::DrawStatusText()
{
stringstream sl, sc, sr;
sl << mGameState.GetTeamnameLeft() << " " << mGameState.GetScoreLeft();
sr << mGameState.GetScoreRight() << " " << mGameState.GetTeamnameRight();
/* sc << "(" << ((mGameState.GetHalf() == GH_FIRST) ?
"first" : "second") << " half) ";*/
int play_mode = mGameState.GetPlayMode();
switch (play_mode)
{
case PM_KickOff_Left:
mKickOff = CommServerBase::eRight;
break;
case PM_KickOff_Right:
mKickOff = CommServerBase::eLeft;
break;
};
sc << mGameState.PlayMode2Str(play_mode) << " ";
sc << "t=" << setiosflags(ios::fixed) << setprecision(2) << mGameState.GetTime();
glColor3f(1.0, 1.0, 1.0);
mGLServer.DrawTextPix(sl.str().c_str(),
Vector2( 0, mGLServer.GetTextHeight()));
mGLServer.DrawTextPix(sc.str().c_str(),
Vector2( 0, mGLServer.GetTextHeight()),
GLServer::eCENTER);
mGLServer.DrawTextPix(sr.str().c_str(),
Vector2( 0, mGLServer.GetTextHeight()),
GLServer::eRIGHT);
}
void
Monitor::DrawStatusLine()
{
glColor4dv(sTeamColorLeft);
mGLServer.DrawSphere(Vector3(-0.97,0.93,0.0), 0.025, 20);
glColor4dv(sTeamColorRight);
mGLServer.DrawSphere(Vector3( 0.97,0.93,0.0), 0.025, 20);
int play_mode = mGameState.GetPlayMode();
if (play_mode == PM_BeforeKickOff)
{
glColor4dv(sSphereDefaultColor);
switch (mKickOff)
{
case CommServerBase::eRandom:
mGLServer.DrawSphere(Vector3( 0.0,0.93,0.0), 0.025, 20);
break;
case CommServerBase::eLeft:
mGLServer.DrawSphere(Vector3( -0.92,0.93,0.0), 0.025, 20);
break;
case CommServerBase::eRight:
mGLServer.DrawSphere(Vector3( 0.92,0.93,0.0), 0.025, 20);
break;
}
}
}
Vector3 Monitor::Get2DPos(const Vector3& pos)
{
return Vector3
(
-1.0 + s2DLowX + s2DScale * (pos.x + mGameState.GetFieldLength()/2),
1.0 - s2DLowY - (s2DScale * mGameState.GetFieldWidth()) +
s2DScale * (pos.y + mGameState.GetFieldWidth()/2),
0.0
);
}
void
Monitor::DrawOverview()
{
// radius of player
double pl_radius = 0.01;
// = sSzY / mGameState.GetFieldWidth() *
// mGameState.GetAgentRadius();
// radius of ball
double b_radius = 0.005;
// sSzY / mGameState.GetFieldWidth() *
// mGameState.GetBallRadius();
// resolution of a sphere
int res = 8;
const double& fl = mGameState.GetFieldLength();
const double& fw = mGameState.GetFieldWidth();
// const double& fh = mGameState.GetFieldHeight();
// const double& lw = mGameState.GetLineWidth();
// const double& bs = mGameState.GetBorderSize();
const double& gw = mGameState.GetGoalWidth();
// field rect
glColor4dv(sLineColor);
glBegin(GL_LINE_STRIP);
glVertex3dv(Get2DPos(Vector3(-fl/2,-fw/2,0)).GetData());
glVertex3dv(Get2DPos(Vector3(fl/2,-fw/2,0)).GetData());
glVertex3dv(Get2DPos(Vector3(fl/2,fw/2,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2,fw/2,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2,-fw/2,0)).GetData());
glEnd();
// middle line
glBegin(GL_LINES);
glVertex3dv(Get2DPos(Vector3(0,-fw/2,0)).GetData());
glVertex3dv(Get2DPos(Vector3(0,fw/2,0)).GetData());
glEnd();
// middle circle
mGLServer.DrawCircle(Get2DPos(Vector3(0,0,0)),sCenterRadius*s2DScale);
// left goal box
glBegin(GL_LINE_STRIP);
glVertex3dv(Get2DPos(Vector3(-fl/2,gw/2+sGoalBoxLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2+sGoalBoxLength,gw/2+sGoalBoxLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2+sGoalBoxLength,-gw/2-sGoalBoxLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2,-gw/2-sGoalBoxLength,0)).GetData());
glEnd();
// right goal box
glBegin(GL_LINE_STRIP);
glVertex3dv(Get2DPos(Vector3(+fl/2,gw/2+sGoalBoxLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(+fl/2-sGoalBoxLength,gw/2+sGoalBoxLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(+fl/2-sGoalBoxLength,-gw/2-sGoalBoxLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(+fl/2,-gw/2-sGoalBoxLength,0)).GetData());
glEnd();
// penalty area left
glBegin(GL_LINE_STRIP);
glVertex3dv(Get2DPos(Vector3(-fl/2,gw/2+sPenaltyLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2+sPenaltyLength,gw/2+sPenaltyLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2+sPenaltyLength,-gw/2-sPenaltyLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(-fl/2,-gw/2-sPenaltyLength,0)).GetData());
glEnd();
// penalty area right
glBegin(GL_LINE_STRIP);
glVertex3dv(Get2DPos(Vector3(+fl/2,gw/2+sPenaltyLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(+fl/2-sPenaltyLength,gw/2+sPenaltyLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(+fl/2-sPenaltyLength,-gw/2-sPenaltyLength,0)).GetData());
glVertex3dv(Get2DPos(Vector3(+fl/2,-gw/2-sPenaltyLength,0)).GetData());
glEnd();
Vector3 pos;
double size;
if (mGameState.GetBall(pos, size))
{
glColor4dv(sBallColor);
mGLServer.DrawSphere(Get2DPos(pos), b_radius, res);
}
int i = 0;
int unum;
TTeamIndex side;
while (mGameState.GetPlayer(i, pos, side, unum, size))
{
switch (side)
{
case TI_LEFT:
glColor4dv(sTeamColorLeft);
break;
case TI_RIGHT:
glColor4dv(sTeamColorRight);
break;
default:
glColor4dv(sSphereDefaultColor);
}
mGLServer.DrawSphere(Get2DPos(pos), pl_radius, res);
if (mDrawUnums)
{
glColor4dv(sUnumColor);
stringstream ss;
ss << unum;
mGLServer.DrawText3D(ss.str(), Get2DPos(pos));
}
++i;
}
}
void
Monitor::DrawFlag(GameState::EFlagType i, Vector3 pos, int pass)
{
TFlagInfoMap::const_iterator j = mFlagInfo.find(i);
FlagInfo fi;
if (j == mFlagInfo.end())
{
memcpy(&fi, &mDefaultFlagInfo, sizeof(FlagInfo));
} else {
memcpy(&fi, &(j->second), sizeof(FlagInfo));
}
// pass=0, first pass with depth test disabled
if (pass == 0)
{
mGLServer.DrawShadowOfSphere(pos + fi.mOffset, fi.mRadius);
}
else
// pass=1, second pass with depth test
{
glColor4dv(fi.mColor);
mGLServer.DrawSphere(pos + fi.mOffset, fi.mRadius);
}
}
void
Monitor::DrawPlayer(TTeamIndex side,
int unum, const Vector3& pos, double size, int pass)
{
if (unum < 0) {
return;
}
if (pass == 0)
{
mGLServer.DrawShadowOfSphere(pos, size);
}
else
// pass=1, second pass with depth test
{
GLdouble tmp[4];
switch (abs(side))
{
case TI_LEFT:
memcpy(tmp, sTeamColorLeft, sizeof(tmp));
if (side < 0) {
tmp[0]/=3; tmp[1]/=3; tmp[2]/=3; tmp[3] = 0.8;
}
glColor4dv(tmp);
break;
case TI_RIGHT:
memcpy(tmp, sTeamColorRight, sizeof(tmp));
if (side < 0) {
tmp[0]/=3; tmp[1]/=3; tmp[2]/=3; tmp[3] = 0.8;
}
glColor4dv(tmp);
break;
case TI_NOSEEN:
glColor4dv(sTeamColorNoSeen);
break;
default:
glColor4dv(sSphereDefaultColor);
}
mGLServer.DrawSphere(pos, size);
if (mDrawUnums && unum > 0)
{
glColor4dv(sUnumColor);
stringstream ss;
ss << unum;
mGLServer.DrawText3D(ss.str(), pos);
}
}
}
void
Monitor::DrawBall(const Vector3& pos, double size, int pass, const Vector3& color)
{
if (pass == 0)
{
mGLServer.DrawShadowOfSphere(pos, size);
}
else
// pass=1, second pass with depth test
{
glColor4f(color.x, color.y, color.z, 1.0);
mGLServer.DrawSphere(pos, size);
}
}
void
Monitor::DrawBall(const Vector3& pos, double size, int pass)
{
if (pass == 0)
{
mGLServer.DrawShadowOfSphere(pos, size);
}
else
// pass=1, second pass with depth test
{
glColor4dv(sBallColor);
mGLServer.DrawSphere(pos, size);
}
}
void
Monitor::Display(vector<string>& geoDebug, bool showReal, bool monitorOnly, WM& wm)
{
const Vector3 szGoal1 = mGameState.GetGoalSize(false);
const Vector3 szGoal2 = mGameState.GetGoalSize(true);
glClearColor(0.15f,0.15f,0.3f,1.0f);
glClear (GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT,GL_NICEST);
glColor3f (1, 1, 1);
glLoadIdentity();
mGLServer.ApplyCamera();
const double& fl = mGameState.GetFieldLength();
const double& fw = mGameState.GetFieldWidth();
const double& fh = mGameState.GetFieldHeight();
const double& lw = mGameState.GetLineWidth();
const double& bs = mGameState.GetBorderSize();
const double& gw = mGameState.GetGoalWidth();
// ground
glColor4dv(sGroundColor);
// left half
mGLServer.DrawGroundRectangle(Vector3(-fl/2 + lw, -fw/2 + lw, 0),
fl/2 - lw - lw/2, fw - 2*lw, 0);
// right half
mGLServer.DrawGroundRectangle(Vector3(lw/2, -fw/2 + lw, 0),
fl/2 - lw - lw/2, fw - 2*lw, 0);
// border
glColor4dv(sBorderColor);
glDisable (GL_DEPTH_TEST);
// border at left goal
mGLServer.DrawGroundRectangle(Vector3(-fl/2-bs,-fw/2-bs,0),
bs, fw+2*bs, 0);
// border at right goal
mGLServer.DrawGroundRectangle(Vector3(fl/2,-fw/2-bs,0),
bs, fw+2*bs, 0);
// long top border
mGLServer.DrawGroundRectangle(Vector3(-fl/2,-fw/2-bs,0),
fl, bs, 0);
// long bottom border
mGLServer.DrawGroundRectangle(Vector3(-fl/2,fw/2,0),
fl, bs, 0);
// lines
glColor4dv(sLineColor);
// left goal
mGLServer.DrawGroundRectangle(Vector3(-fl/2,-fw/2,0), lw, fw, 0);
// right goal
mGLServer.DrawGroundRectangle(Vector3(fl/2 - lw,-fw/2,0), lw, fw, 0);
// long top border
mGLServer.DrawGroundRectangle(Vector3(-fl/2 + lw,-fw/2,0),
fl - 2*lw, lw, 0);
// long bottom border
mGLServer.DrawGroundRectangle(Vector3(-fl/2 + lw,fw/2 - lw,0),
fl - 2*lw, lw, 0);
// middle line
mGLServer.DrawGroundRectangle(Vector3(-lw/2,-fw/2 + lw,0),
lw, fw - 2*lw, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -