我的opengl项目有问题。我必须创建移动三角形alonge x轴。它也必须改变颜色并转身。我创造了这个,但我不知道加速会发生什么......
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include <math.h>
#include<iomanip>
#include <time.h>
#include "glut.h"
#include "math.h"
using namespace std;
float x = 0, y = 0, angle = 0, anglen = 0,q=1,w=1,e=1,qn=0,wn=0,en=0;
double xn = 0,c=0;
int licznik = 0;
int zmiana = 0,a=0;
bool flaga = true;
static void timerCallback(int value)
{
if (xn!=x)
{
licznik++; //odliczanie kolejnych klatek
x += xn / 100.0;
angle += anglen / 100.0;
q += qn / 100.0;
w += wn / 100.0;
e += en / 100.0;
if (q > 1){ q = 0; }
if (w > 1){ w = 0; }
if (e > 1){ e = 0; }
glutPostRedisplay();
glutTimerFunc(50, timerCallback, value); //ustawienie ponownego wywołania naszej funkcji "timerCallback" po 100 ms
}
if (licznik==100)
{
if (a == 0){ x = -0.8; glutPostRedisplay(); }
else if (a == 1){ x = 0; glutPostRedisplay(); }
else if (a == 2){ x = 0.8; glutPostRedisplay(); }
else if (a == 3){ x = 0; glutPostRedisplay(); }
xn = 0;
anglen = 0;
licznik = 0;
zmiana = 1;
}
}
void trojkat(float x, float y, float angle)
{
glColor3f(q, w, e);
glPushMatrix();
glTranslatef(x, y, 0);
glRotatef(angle, 0, 0, 1);
glBegin(GL_POLYGON);
glVertex2f(0, 0.2);
glVertex2f(-0.2, -0.2);
glVertex2f(0.2, -0.2);
glEnd();
glPopMatrix();
}
void przesuwanie()
{
a++;
if (a >3){ a = 0; };
if ((a == 1) || (a == 2)){ flaga = true; }
else if ((a == 0) || (a == 3)){flaga = false;}
if (flaga == true)
{
xn += .8; anglen += 360;
qn += .1;
wn += .7;
en += .3;
}
else if (flaga == false)
{
xn -= .8; anglen += 360;
qn += .8;
wn += .4;
en += .3;
}
zmiana = 4;
//wyzerowanie zliczania klatek
timerCallback(0); //wywołanie funkcji która będzie się okresowo powtarzać
}
void przesuwanie_w_lewo()// pierwsze przesuniecie o połowe jednostki
{
xn = 0;
xn -= .8;
anglen += 360;
qn -= .9;
wn -= .7;
en -= .3;
zmiana = 4;
timerCallback(0);
//wywołanie funkcji która będzie się okresowo powtarzać
}
void display(void)
{
/* clear window */
glClear(GL_COLOR_BUFFER_BIT);
trojkat(x, y, angle);
glFlush();
if ((zmiana == 0) || (zmiana == 1) || (zmiana == 2))
{
if (zmiana == 0)
{
przesuwanie_w_lewo();
}
else if (zmiana==1)
{
przesuwanie();
}
}
}
void init()
{
/* set clear color to black */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* set fill color to white */
/* set up standard orthogonal view with clipping */
/* box as cube of side 2 centered at origin */
/* This is default view and these statement could be removed */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(400, 400);
glutInitWindowPosition(0, 0);
glutCreateWindow("trojkat");
glutDisplayFunc(display);
init();
glutMainLoop();
return 0;
}