Модератор: Модераторы разделов
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux
Сообщение
minoru-kun » 13.10.2007 17:07
Имею следующую траблу с программкой под SDL:
Код:
#include <iostream>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <cmath>
#define pi 3.141592653
using namespace std;
class clock_arrow
{
float x,y;
float length;
float angle;
public:
void draw();
void tick();
clock_arrow(float len);
};
clock_arrow::clock_arrow(float len = 1)
{
x = 0;
y = 0;
length = len;
angle = 0;
}
void clock_arrow::draw()
{
glColor3f(1,1,1);
glBegin(GL_LINE_STRIP);
glVertex2f(x,y);
glVertex2f(cos(angle), sin(angle));
glEnd();
}
void clock_arrow::tick()
{
angle += 2*pi / 60;
}
Uint32 draw (Uint32 param, void* i)
{
static clock_arrow clock1;
clock1.tick();
clock1.draw();
SDL_GL_SwapBuffers();
cout << "voom!" << endl;
return(100);
}
int main ()
{
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
SDL_SetVideoMode(640,480,16,SDL_OPENGL);
glLoadIdentity();
glColor3f(1,1,1);
clock_arrow clock2;
clock2.tick();
clock2.draw();
SDL_GL_SwapBuffers();
SDL_TimerID timer1 = SDL_AddTimer (100, draw, NULL);
sleep(3);
}
Стрелка, отрисовываемая clock2, выводится на ура, однако стрелка clock1 ни в какую не хочет отрисовываться. Хотя, сообщение voom наблюдаю. Читая доки по SDL наткнулся, что
The timer callback function may run in a different thread than your main program, and so shouldn't call any functions from within itself. You may always call SDL_PushEvent, however.
В какую сторону копать?
minoru-kun
Сообщения: 621
ОС: Debian GNU/Linux
Сообщение
minoru-kun » 13.10.2007 18:35
Заметил так же, что в этом видоизмененном коде:
Код:
#include <iostream>
#include <SDL/SDL.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <cmath>
#define pi 3.141592653
using namespace std;
class clock_arrow
{
float x,y;
float length;
float angle;
public:
void draw();
void tick();
clock_arrow(float len);
};
clock_arrow::clock_arrow(float len = 1)
{
x = 0;
y = 0;
length = len;
angle = 0;
}
void clock_arrow::draw()
{
glColor3f(1,1,1);
glBegin(GL_LINE_STRIP);
glVertex2f(x,y);
glVertex2f(cos(angle), sin(angle));
glEnd();
}
void clock_arrow::tick()
{
angle += 2*pi / 60;
}
Uint32 draw (Uint32 param, void* i)
{
clock_arrow clock1;
SDL_Event need_tick;
need_tick.type = SDL_USEREVENT;
need_tick.user.code = 5;
SDL_PushEvent(&need_tick);
return(1000);
}
int main ()
{
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
SDL_SetVideoMode(640,480,16,SDL_OPENGL);
glLoadIdentity();
glClearColor (0,0,0,0);
clock_arrow clock1;
// SDL_TimerID timer1 = SDL_AddTimer (1000, draw, NULL);
SDL_Event event;
while (1)
{
while (SDL_PollEvent (&event))
{
}
if (event.type == SDL_KEYDOWN)
{
clock1.tick();
clock1.draw();
}
}
}
Стоит лишь послать одно событие, как оно не убирается из очереди вообще, и программа подвисает. Странно, вроде бы, SDL настолько проверенная библиотека... В чем может быть дело? Раньше такой проблемы не было...