我正在使用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();
}
答案 0 :(得分:0)
首先,以离散间隔移动物体(类似'posX + = move_unit;')这些日子不是动画的完成方式。相反,您应该测量自上次更新/帧以来经过的时间,并根据该时间移动对象。因此,如果你想每秒移动你的球50个单位,你会写'posX + = 50.0 *传递时间;'。如果fps改变,这可以保证移动不会变得更快或更慢。
其次,你要问的是旋转矢量。最常见的做法是创建一个旋转矩阵并将其与向量相乘,只需google rotation-matrix。在你的简单情况下,使用sin()和cos()计算极点的坐标就足够了。您也可以使用OpenGL的Matrix-Stack,查看glRotate(),glPushMatrix()等。
第三,您的问题非常笼统,代码段不能再被称为代码段。保持您的问题的准确性和短片的简短。
答案 1 :(得分:0)
您可以调用
而不是在显示内部调用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...
}
您将在显示功能中传递所有这些更改,就像您使用
进行的那样glTranslatef(box1posX, box1posY, box1posZ);
glTranslatef(box2posX, box2posY, box2posZ);
glTranslatef(box3posX, box3posY, box3posZ);
然后渲染它们。
一个好的做法是使用类似时间步的步骤来更改所有“可更改”变量。 通过这种方式,洞的移动将取决于时间步长。