【问题标题】:Need help in Bowling Game in OpenGL C++在 OpenGL C++ 中需要保龄球游戏的帮助
【发布时间】:2013-06-23 10:49:34
【问题描述】:

我正在用 openGL C++ 创建一个保龄球游戏。

到目前为止,我做了什么,我画了一个碗和三个点(障碍物)。

碗在按键时移动。

我想制造当碗撞到这些障碍物时,它们应该被扔掉的错觉。为此,我有类似当球的X和Y坐标时的代码并且这些障碍物是相同的,那么障碍物的 X 和 Y 坐标会增加,以制造它们被丢弃的错觉。

建议一些逻辑。

这是我的代码:-

    #include <GL/glut.h>
    #include <cmath>
    #include <stdio.h>
    float posX = 0.01, posY = -0.1, posZ = 0,

    bx1 = 0.01, by1 = 0.1,
    bx2 = 0.06, by2 = 0.1,
    bx3 = 0.10, by3 = 0.1;

    GLfloat rotation = 90.0;
    double x, y, angle;
    #define PI 3.1415926535898
    GLint circle_points = 50;

    void bottle() {
        glColor3f(0.0, 0.0, 1.0);
        glPointSize(9.0);
        glBegin(GL_POINTS);
        glVertex3f(bx1, by1, 0.0);
        glEnd();

        glBegin(GL_POINTS);
        glVertex3f(bx2, by2, 0.0);

        glEnd();
        glBegin(GL_POINTS);
        glVertex3f(bx3, by3, 0.0);

        glEnd();

        glFlush();

    }

    void circ() {
        glColor3f(0.0, 0.0, 1.0);
        glBegin(GL_TRIANGLE_FAN);
        for (int i = 0; i <= 300; i++) {
            angle = 2 * PI * i / 300;
            x = cos(angle) / 20;
            y = sin(angle) / 20;
            glVertex2d(x, y);
        }
        glEnd();
    }

    void display() {
        glClearColor(1.0, 1.0, 1.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        glPushMatrix();
        bottle();
        glPopMatrix();

        glPushMatrix();
        glTranslatef(posX, posY, posZ);
        circ();
        glPopMatrix();
    glutSwapBuffers();
}

float move_unit = 0.02f;
void keyboardown(int key, int x, int y) {
    switch (key) {
    case GLUT_KEY_RIGHT:
        posX += move_unit;
        break;
    case GLUT_KEY_LEFT:
        posX -= move_unit;
        break;
    case GLUT_KEY_UP:
        posY += move_unit;
        break;
    case GLUT_KEY_DOWN:
        posY -= move_unit;
        break;
    default:
        break;
    }
    if ( posX == bx1 || posX == bx2  ) {

        bx1 -= 0.02,by1 += 0.06;
        bx2 = 0.02,
        by2 += 0.08;
        bx3 = 0.04,
        by3 += 0.04;

    }

    glutPostRedisplay();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(600, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Practice 1");
    glutDisplayFunc(display);
    glutSpecialFunc(keyboardown);
    glutMainLoop();
}

【问题讨论】:

  • 您是要求完成代码以动画您的引脚掉落还是什么?我从来没有搜索过,但我确信有一些基本的物理引擎可以在这里使用,所以你不需要自己编写代码
  • @Zaiborg 此外,如果我可以在按下向上键时让球自动平稳地滑向障碍物,那就太好了。

标签: c++ opengl graphics glut game-development


【解决方案1】:

您可以调用

,而不是在 display 中调用 circ() 函数
glutIdleFunc(nameOfYourChoice);

在键盘功能之后的主要功能中。所以该函数一次又一次地调用。 在上面的函数 (nameOfYourChoice) 中,您可以为 x 和 y 操作您想要的任何变量。因此,在该函数中,您可以检查对象之间是否存在碰撞,如果出现碰撞,您可以通过该函数中的 x 和 y 在此示例框中“丢弃”东西。 在该函数结束时,您必须调用

glutPostRedisplay();

现在,如果您想再次启动这些盒子,您可以使用计时器(也可以使用您的时间步长),然后在一定时间后,您可以通过 x 和 y 再次放置这些盒子。为此,您还将需要 bool 变量来了解是否有碰撞。

所以碰撞发生了:

bool flagBox1 = true;

时间过去了:

bool flagBox1 = false;
//code to put back the dropped object

(nameOfYourChoice) 函数中的代码:

if(flagBox1){
//proceed to your actions...
}

您将在显示函数中传递所有这些更改,就像您对 circ 所做的那样

glTranslatef(box1posX, box1posY, box1posZ);
glTranslatef(box2posX, box2posY, box2posZ);
glTranslatef(box3posX, box3posY, box3posZ);

然后渲染它们。

一个好的做法是使用像时间步长这样的步骤来更改所有“可变”变量。 这样,孔的运动将取决于该时间步长。

【讨论】:

    【解决方案2】:

    首先,以离散间隔移动对象(例如“posX += move_unit;”)现在并不是动画制作的方式。相反,您应该测量自上次更新/帧以来经过的时间,并据此移动对象。因此,如果您想以每秒 50 个单位的速度移动您的球,您可以编写“posX += 50.0 *passedTime;”。这保证了如果 fps 发生变化,运动不会变得更快或更慢。

    其次,您要问的是旋转矢量。最通用的方法是创建一个旋转矩阵并将其与向量相乘,只需 google 旋转矩阵。在您的简单情况下,使用 sin() 和 cos() 计算极点坐标就足够了。你也可以使用OpenGL的Matrix-Stack,看看glRotate()、glPushMatrix()等。

    第三,你的问题很笼统,代码sn-p不能再叫sn-p了。确保您的问题准确无误,sn-ps 简短。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多