Witam,
Mam problem z z wykorzystaniem timerów przy oscylacji trójkąta po osi X. Czym dłużej mój program pracuje tym czestotliwość przesuwania trójkąta się zwiększa. Czy muszę to wyregulować timerem? Czy w czym innym tkwi błąd? Z góry dziękuję za odpowiedź.

`#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "glut.h"
#include "math.h"

float x = 0, y = 0, xn = 0, stoper = 0, angle = 0, anglen = 0;
int licznik = 0;
int zmiana = 0,a=0;
bool flaga = true;

static void timerCallback(int value)
{
if (licznik < 50)
{

    licznik++; //odliczanie kolejnych klatek

    x += xn / 50.0;

    glutPostRedisplay();
    glutTimerFunc(50, timerCallback, value); //ustawienie ponownego wywołania naszej funkcji "timerCallback" po 100 ms
}
if (licznik == 50)
{
    licznik = 0;
    zmiana = 1;

}

}

static void timerCallback1(int value)
{
if (licznik<50)
{

    licznik++; //odliczanie kolejnych klatek
    x += xn / 50.0;

    glutPostRedisplay();//odswieza otwarte okno
    glutTimerFunc(50, timerCallback1, value); //ustawienie ponownego wywołania naszej funkcji "timerCallback" po 100 ms

    if (licznik == 50)
    {
        licznik = 0;
        zmiana = 1;         
    }
}

}

static void timerCallback2(int value)
{
if (licznik<50)
{
licznik++; //odliczanie kolejnych klatek
angle += anglen / 50.0;

    glutPostRedisplay();//odswieza otwarte okno
    glutTimerFunc(50, timerCallback2, value); //ustawienie ponownego wywołania naszej funkcji "timerCallback" po 100 ms

}

}

void trojkat(float x, float y, float angle)
{
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()
{
xn = 0;
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;  }
else if (flaga == false){ xn -= .8; }
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 -= .8;
/////// wywołanie w kodzie głównym
//wyzerowanie zliczania klatek
zmiana = 4;
timerCallback(0);
//wywołanie funkcji która będzie się okresowo powtarzać

}

void obrot()
{
anglen += 270;
licznik = 0; //wyzerowanie zliczania klatek
timerCallback2(0); //wywołanie funkcji która będzie się okresowo powtarzać
glutPostRedisplay();
}
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();
    }
}

}

static void Key(unsigned char key, int x_d, int y_d)
{

obrot();

}

void init()
{
/ set clear color to black /
glClearColor(0.0, 0.0, 0.0, 0.0);
/ set fill color to white /
glColor3f(1.0, 1.0, 1.0);

/* 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);
glutKeyboardFunc(Key);
init();
glutMainLoop();

return 0;

}
`