Другие языки программирования и технологии

Вопрос по С++ OpenGL

Почему программа работает только при значении таймера (1000, Timer, 0) (1 секунда) или больше, когда я прописываю (500, Timer, 0) не работает, любое значение меньше 1000 не работает. Как это исправить, в чем проблема?

#include <gl\glut.h>
#include <iostream>
#include <time.h>
#include <windows.h>

using namespace std;

float krd1=-20.0, krd2=-20.0, x[100], y[100], WinWid=400.0, WinHid=400.0;
int fr1=20.0, fr2=-20.0, dl=1, Npr=1, score=0;
void Push(float a, float b)
{ dl++;
{
for (int i=dl-2; i>-1; i--)
{
x[i+1]=x;
y[i+1]=y;
}
x[0]=a;
y[0]=b;
}
for (int i=0; i<dl;i++)>, y);
glVertex2f(x-20.0, y);
glVertex2f(x-20.0, y-20.0);
glVertex2f(x, y-20.0);
glEnd();
}
}
void Run (float a, float b)
{
for (int i=dl-2; i>-1; i--)
{
x[i+1]=x;
y[i+1]=y;
}
x[0]=a;
y[0]=b;
for (int i=0; i<dl;>, y);
glVertex2f(x-20.0, y);
glVertex2f(x-20.0, y-20.0);
glVertex2f(x, y-20.0);
glEnd();
}
}
float RdmF ()
{
int a;
a=(rand()-9)*20;
return a;
}
void DrawF(float z, float z1)
{
glBegin(GL_QUADS);
glColor3ub(0,255,0); // зеленый
glVertex2f(z, z1);
glVertex2f(z-20.0, z1);
glVertex2f(z-20.0, z1-20.0);
glVertex2f(z, z1-20.0);
glEnd();
}

void score1()
{
cout<<score<<endl;>199||krd1<-199||krd2>199||krd2<-199)
{
dl=1;
krd1=-20.0, krd2=-20.0;
score-=100;
}
glutTimerFunc(1000, Timer, 0);
Draw();
}

void Initialize()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-WinWid/2, WinWid/2, -WinHid/2, WinHid/2, -200.0, 200.0);
glMatrixMode(GL_MODELVIEW);
}

int main(int argc, char** argv)
{
srand(time(0));
cout<<"Hello\n";
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(WinWid, WinHid);
glutInitWindowPosition(100,200);
glutCreateWindow("Snake");
glutDisplayFunc(Draw);
glutTimerFunc(1000, Timer, 0);
glutSpecialFunc(SKeyboard);
Initialize();
glutMainLoop();
return 0;
}
> Да что за бред не копируется текст!
Чтобы код не протухал, его надо публиковать на сайте pastebin.com, а сюда вместе с вопросом ссылку на pastebin.

> когда я прописываю (500, Timer, 0) не работает, любое значение меньше 1000 не работает.
А вы попробуйте нужное время срабатывания таймера прописывать не только в функции main, но и в функции Timer():

void Timer(int)
{
    switch(Npr)
    {
        case 1: krd2+=20.0;
        break;
        case 2: krd2-=20.0;
        break;
        case 3: krd1-=20.0;
        break;
        case 4: krd1+=20.0;
        break;
    }
    if (krd1>199||krd1<-199||krd2>199||krd2<-199)
    {
        dl=1;
        krd1=-20.0, krd2=-20.0;
        score-=100;
    }
    glutTimerFunc(500, Timer, 0);
    Draw();
}

и все должно работать.

А лучше определите константу для значения таймера и используйте ее в обеих функциях

> Александр
> ничего не понял
> Timer будет себя передавать в вызов функции glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер.. .
Да, так и есть.
Там таймеры однократные (срабатывают только один раз) , и чтобы его опять запустить, надо снова вызвать glutTimerFunc(). Это можно сделать либо в самой функции-обработчике таймера, а можно где-нибудь в другом месте. Получается вот такая псевдорекурсия, которая на самом деле рекурсией не является.
ИК
Игорь Кузнецов
66 825
Лучший ответ
ничего не понял

Timer будет себя передавать в вызов функции glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая.. .

или я что-то не так понял?