📄 table.cpp
字号:
#include "table.h"
// Draw()
// desc: draws the ball at its current location
void CTable::Draw()
{
// draw hockey table
glPushMatrix();
glTranslatef(position.x, position.y, position.z);
// draw table floor
glColor3f(1.0, 1.0, 1.0);
glBindTexture(GL_TEXTURE_2D, iceTex.texID);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(1.0, 1.0);
glVertex3fv(&tableCorners[3][0]);
glTexCoord2f(0.0, 1.0);
glVertex3fv(&tableCorners[2][0]);
glTexCoord2f(1.0, 0.0);
glVertex3fv(&tableCorners[0][0]);
glTexCoord2f(0.0, 0.0);
glVertex3fv(&tableCorners[1][0]);
glEnd();
// enable blending for walls
glEnable(GL_BLEND);
glDepthMask(GL_FALSE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glColor4f(0.0, 0.1, 0.3, 1.0);
// left side
glBegin(GL_TRIANGLE_STRIP);
glVertex3fv(&tableCorners[1][0]);
glVertex3f(tableCorners[1][0], 10.0,
tableCorners[1][2]);
glVertex3fv(&tableCorners[0][0]);
glVertex3f(tableCorners[0][0], 10.0,
tableCorners[0][2]);
glEnd();
// right side
glBegin(GL_TRIANGLE_STRIP);
glVertex3fv(&tableCorners[3][0]);
glVertex3f(tableCorners[3][0],
10.0, tableCorners[3][2]);
glVertex3fv(&tableCorners[2][0]);
glVertex3f(tableCorners[2][0], 10.0,
tableCorners[2][2]);
glEnd();
// opposite side
glBegin(GL_TRIANGLE_STRIP);
glVertex3fv(&tableCorners[2][0]);
glVertex3f(tableCorners[2][0],
10.0,
tableCorners[2][2]);
glVertex3fv(&tableCorners[1][0]);
glVertex3f(tableCorners[1][0],
10.0,
tableCorners[1][2]);
glEnd();
// player side (transparent)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0, 0.1, 0.3, 0.6);
glBegin(GL_TRIANGLE_STRIP);
glVertex3fv(&tableCorners[3][0]);
glVertex3f(tableCorners[3][0],
10.0,
tableCorners[3][2]);
glVertex3fv(&tableCorners[0][0]);
glVertex3f(tableCorners[0][0],
10.0,
tableCorners[0][2]);
glEnd();
// renable depth testing, disable blending
glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
glPopMatrix();
}
// Animate()
// desc: handles the physics calculations (none for a table)
void CTable::Animate(scalar_t deltaTime) {}
// SetupTexture()
// desc: initialize the texture with OpenGL
void CTable::SetupTexture()
{
// set the proper parameters for an MD2 texture
glGenTextures(1, &iceTex.texID);
glBindTexture(GL_TEXTURE_2D, iceTex.texID);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
switch (iceTex.textureType)
{
case BMP:
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, iceTex.width, iceTex.height,
GL_RGB, GL_UNSIGNED_BYTE, iceTex.data);
break;
case PCX:
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, iceTex.width, iceTex.height,
GL_RGBA, GL_UNSIGNED_BYTE, iceTex.data);
case TGA: // no TGA support
break;
default:
break;
}
}
// Load()
// desc: initialize table info and setup texture
void CTable::Load()
{
// Initialize table corner coordinates (300x500)
tableCorners[0][0] = 0.0;
tableCorners[0][1] = 0.0;
tableCorners[0][2] = 0.0;
tableCorners[1][0] = 0.0;
tableCorners[1][1] = 0.0;
tableCorners[1][2] = -500.0;
tableCorners[2][0] = 300.0;
tableCorners[2][1] = 0.0;
tableCorners[2][2] = -500.0;
tableCorners[3][0] = 300.0;
tableCorners[3][1] = 0.0;
tableCorners[3][2] = 0.0;
// Initialize the table walls (planes)
// 0 = left, 2 = opposite, 1 = right, 3 = player
// 1,0 left
// 3,2 right
// 2,1 opposite
// 3,0 player
tableWalls[0] = CPlane(
CVector(tableCorners[0][0], tableCorners[0][1], tableCorners[0][2]),
CVector(tableCorners[1][0], tableCorners[1][1], tableCorners[1][2]),
CVector(tableCorners[1][0], 10.0, tableCorners[1][2])
);
tableWalls[1] = CPlane(
CVector(tableCorners[2][0], tableCorners[2][1], tableCorners[2][2]),
CVector(tableCorners[3][0], tableCorners[3][1], tableCorners[3][2]),
CVector(tableCorners[3][0], 10.0, tableCorners[3][2])
);
tableWalls[2] = CPlane(
CVector(tableCorners[1][0], tableCorners[1][1], tableCorners[1][2]),
CVector(tableCorners[2][0], tableCorners[2][1], tableCorners[2][2]),
CVector(tableCorners[2][0], 10.0, tableCorners[2][2])
);
tableWalls[3] = CPlane(
CVector(tableCorners[3][0], tableCorners[3][1], tableCorners[3][2]),
CVector(tableCorners[0][0], tableCorners[0][1], tableCorners[0][2]),
CVector(tableCorners[0][0], 10.0, tableCorners[0][2])
);
// Load and initialize the texture
iceTex.LoadTexture("table.bmp");
SetupTexture();
}
// Unload()
// desc: free texture
void CTable::Unload()
{
iceTex.Unload();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -