OpenGL C++开发Pong游戏:Ball对象无法渲染显示问题
OpenGL Pong游戏中Ball对象无法渲染的问题修复
核心问题:Ball构造函数的变量名冲突
你的Ball类构造函数中,参数名rad与成员变量rad同名,导致rad = rad;语句只是将局部参数赋值给自己,成员变量rad完全没有被初始化,值为未定义的垃圾数据(大概率是0),因此球无法被绘制出来。
修复方案
有两种方式解决这个问题:
- 使用
this->明确指定成员变量:
Ball(float x, float y, float rad, float xv, float yv) { xpos = x; ypos = y; this->rad = rad; // 明确指向成员变量 xvel = xv; yvel = yv; }
- 修改参数名(更清晰),并使用初始化列表(C++推荐写法):
Ball(float x, float y, float radius, float xv, float yv) : GameObject{x, y}, rad{radius}, xvel{xv}, yvel{yv} {}
次要优化:GL_TRIANGLE_FAN的顶点绘制规范
使用GL_TRIANGLE_FAN绘制圆形时,应该先添加中心顶点,再绘制外围顶点,这样图形闭合性更好,渲染更规范:
void draw() { glPushMatrix(); glTranslatef(xpos, ypos, 0.0f); glColor3f(1.0f, 1.0f, 1.0f); glBegin(GL_TRIANGLE_FAN); glVertex2f(0.0f, 0.0f); // 添加中心顶点 for (int i = 0; i <= 360; i++) // 循环到360度,确保图形闭合 { float theta = i * 3.14159 / 180; glVertex2f(rad * cos(theta), rad * sin(theta)); } glEnd(); glPopMatrix(); }
其他注意点
- 当前Game构造函数中Ball的初始速度设为
(0.0f, 0.0f),修复后球会静止在屏幕中心,后续可以调整速度参数让球运动起来。 - GLUT默认的正交投影范围是
[-1, 1],你的坐标设置符合这个范围,无需额外调整投影矩阵。
内容的提问来源于stack exchange,提问作者Chris Nippert
相关产品推荐
相关产品推荐

