#include
#include
#include "SDL/SDL.h"
#define WIDTH 640
#define HEIGHT 480
#define FPS (33/10)*10
#define EVENT_REDRAW 0
float rtri=0.0f;
float rquad=0.0f;
int done=0;
SDL_TimerID redraw_timer;
void InitGL(int Width, int Height)
{
glViewport(0,0,Width,Height);
glClearColor(0.0f,0.0f,0.0f,0.0f);
glClearDepth(1.0);
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
}
void DrawGLScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glRotatef(rtri,0.0f,1.0f,0.0f);
glBegin(GL_POLYGON);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(rquad,1.0f,0.0f,0.0f);
glColor3f(0.5f,0.5f,1.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
rtri+=15.0f;
rquad-=15.0f;
SDL_GL_SwapBuffers();
}
Uint32 redraw_timer_callback(Uint32 interval, void *param)
{
SDL_Event event;
event.type = SDL_USEREVENT;
event.user.code = EVENT_REDRAW;
event.user.data1 = NULL;
event.user.data2 = NULL;
SDL_PushEvent(&event);
return interval;
}
void GameLoop(void)
{
SDL_Event event;
int t1;
while (!done)
{
SDL_WaitEvent(&event);
switch (event.type)
{
case SDL_USEREVENT:
switch (event.user.code)
{
case EVENT_REDRAW:
DrawGLScene();
break;
}
break;
case SDL_QUIT:
done=1;
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym==SDLK_ESCAPE) done = 1;
break;
}
}
SDL_RemoveTimer(redraw_timer);
}
int Init(int Width, int Height)
{
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER)<0)
{
fprintf(stderr,"Unable to initialize SDL: %s\n",SDL_GetError());
return 1;
}
if (SDL_SetVideoMode(Width,Height,0,SDL_OPENGL)==NULL)
{
fprintf(stderr,"Unable to create OpenGL screen: %s\n",SDL_GetError());
SDL_Quit();
return 1;
}
SDL_WM_SetCaption("Lesson 04 with Timer",NULL);
InitGL(Width,Height);
redraw_timer = SDL_AddTimer(FPS, redraw_timer_callback, NULL);
return 0;
}
int main(int argc, char **argv)
{
SDL_Event event;
if (Init(WIDTH,HEIGHT)) return 1;
GameLoop();
SDL_Quit();
return 0;
}
Thursday, July 9, 2009
NeHe Lesson 4 using SDL and Timer for smoother animation
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment