Почему программа работает только при значении таймера (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;
}
Другие языки программирования и технологии
Вопрос по С++ OpenGL
> Да что за бред не копируется текст!
Чтобы код не протухал, его надо публиковать на сайте 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(). Это можно сделать либо в самой функции-обработчике таймера, а можно где-нибудь в другом месте. Получается вот такая псевдорекурсия, которая на самом деле рекурсией не является.
Чтобы код не протухал, его надо публиковать на сайте 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(). Это можно сделать либо в самой функции-обработчике таймера, а можно где-нибудь в другом месте. Получается вот такая псевдорекурсия, которая на самом деле рекурсией не является.
ничего не понял
Timer будет себя передавать в вызов функции glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая.. .
или я что-то не так понял?
Timer будет себя передавать в вызов функции glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая будет опять же дёргать таймер, который вызовет функцию glutTimerFunc, которая.. .
или я что-то не так понял?
Похожие вопросы
- Что лучше изучать OpenGL или DirectX?
- Как заставить работать OpenGL?
- Сможет ли школьник освоить OpenGL?
- Как нарисовать прямоугольник с границами в OpenGL?
- OpenGL vs DirectX. Трехмерная графика
- хочу использовать средства OpenGL в DevC++ в частности библ. GLUT как это сделать, помогите буду признателен.
- Кто-нибудь знает хорошие учебники по OpenGL или DirectX для C++? Дайти плз ссылки)
- Чем отличаються OpenGL и DirectX? Что лучше? Что легче? (для програмирование игр)
- Что более производительно Opengl или Directx?
- Вопрос ПРОФЕССИОНАЛЬНЫМ или просто ОПЫТНЫМ программистам