You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL C++开发Pong游戏:Ball对象无法渲染显示问题

OpenGL Pong游戏中Ball对象无法渲染的问题修复

核心问题:Ball构造函数的变量名冲突

你的Ball类构造函数中,参数名rad与成员变量rad同名,导致rad = rad;语句只是将局部参数赋值给自己,成员变量rad完全没有被初始化,值为未定义的垃圾数据(大概率是0),因此球无法被绘制出来。

修复方案

有两种方式解决这个问题:

  1. 使用this->明确指定成员变量:
Ball(float x, float y, float rad, float xv, float yv)
{
    xpos = x;
    ypos = y;
    this->rad = rad; // 明确指向成员变量
    xvel = xv;
    yvel = yv;
}
  1. 修改参数名(更清晰),并使用初始化列表(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:33:08