J'ai créé un jeu, comme Pong, en utilisant SDL et OpenGL sous c++ :
#include "SDL.h"
#include "SDL_opengl.h"
#include <iostream>
int main(int argc, char* args[])
{
//initialize SDL
SDL_Init(SDL_INIT_EVERYTHING);
//OpenGL memory
SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 );
SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8);
SDL_GL_SetAttribute( SDL_GL_BUFFER_SIZE, 32);
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1);
//caption of the window
SDL_WM_SetCaption( "Bine baaa", NULL );
//size
SDL_SetVideoMode(600,400,32, SDL_OPENGL);
//clearcolor
glClearColor(0,0,0,1); //RED,GREEN,BLUE,ALPHA
//portion of screen displayed
glViewport(0,0,600,400);
//for gradients
glShadeModel(GL_SMOOTH);
//2D rendering
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//save
glDisable(GL_DEPTH_TEST);
bool isRunning = true;
SDL_Event event;
typedef struct player{
float myX;
float myY;
float width=15;
float height=60;
bool up=false;
bool down=false;
};
player player1,player2;
player1.myX=10;
player1.myY=160;
player2.myX=580;
player2.myY=160;
float ballX=300;
float ballY=200;
float vitezaX=0.5;
float vitezaY=0.5;
float latura =10;
//main loop
while(isRunning){
//EVENTS
while ( SDL_PollEvent(&event)){
if( event.type == SDL_QUIT )
isRunning=false;
//escape button closes window
if(event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_ESCAPE)
isRunning=false;
if( event.type == SDL_KEYUP && event.key.keysym.sym == SDLK_r)
glClearColor(1,0,0,1);
if( event.type == SDL_KEYDOWN){
if(event.key.keysym.sym==SDLK_UP)
player2.up=true;
if(event.key.keysym.sym==SDLK_DOWN)
player2.down=true;
if(event.key.keysym.sym==SDLK_w)
player1.up=true;
if(event.key.keysym.sym==SDLK_s)
player1.down=true;
}
if( event.type == SDL_KEYUP){
if(event.key.keysym.sym==SDLK_UP)
player2.up=false;
if(event.key.keysym.sym==SDLK_DOWN)
player2.down=false;
if(event.key.keysym.sym==SDLK_w)
player1.up=false;
if(event.key.keysym.sym==SDLK_s)
player1.down=false;
}
}
//LOGIC
if(player1.up==true)
player1.myY-=0.3;
if(player1.down==true)
player1.myY+=0.3;
if(player2.up==true)
player2.myY-=0.3;
if(player2.down==true)
player2.myY+=0.3;
if(ballY<0)
vitezaY=-vitezaY;
if(ballY+latura>400)
vitezaY=-vitezaY;
if(ballX+latura>player2.myX && ballY+latura>player2.myY && ballY<player2.myY+player2.height){
vitezaX=-vitezaX;
if(ballX+latura-player2.myX>=1){
if(vitezaY>0)
ballY=player2.myY-latura;
else
ballY=player2.myY+player2.height;
vitezaX=-vitezaX;
vitezaY=-vitezaY;
}
}
if(ballX<player1.myX+player1.width && ballY+latura>player1.myY && ballY<player1.myY+player1.height){
vitezaX=-vitezaX;
if((player1.myX+player1.width)-ballX>=1){
if(vitezaY>0)
ballY=player1.myY-latura;
else
ballY=player1.myY+player1.height;
vitezaX=-vitezaX;
vitezaY=-vitezaY;
}
}
if(ballX<0 || ballX>600){
ballX=300;
ballY=200;
SDL_Delay(500);
}
ballX+=vitezaX;
ballY+=vitezaY;
//RENDER
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix(); //Begin Render
glColor4ub(255,255,255,255);
glOrtho(0,600,400,0,-1,1);
glBegin(GL_QUADS);//GL_LINES, GL_LINE_STRIP, GL_QUADS, GL_POLIGON,GL_TRIANGLES, GL_LINE_LOOP
glVertex2f(player1.myX,player1.myY);
glVertex2f(player1.myX+player1.width,player1.myY);
glVertex2f(player1.myX+player1.width,player1.myY+player1.height);
glVertex2f(player1.myX,player1.myY+player1.height);
glEnd();//End Draw
glBegin(GL_QUADS);//GL_LINES, GL_LINE_STRIP, GL_QUADS, GL_POLIGON,GL_TRIANGLES, GL_LINE_LOOP
glVertex2f(player2.myX,player2.myY);
glVertex2f(player2.myX+player2.width,player2.myY);
glVertex2f(player2.myX+player2.width,player2.myY+player2.height);
glVertex2f(player2.myX,player2.myY+player2.height);
glEnd();//End Draw
glBegin(GL_QUADS);//GL_LINES, GL_LINE_STRIP, GL_QUADS, GL_POLIGON,GL_TRIANGLES, GL_LINE_LOOP
glVertex2f(ballX,ballY);
glVertex2f(ballX+latura,ballY);
glVertex2f(ballX+latura,ballY+latura);
glVertex2f(ballX,ballY+latura);
glEnd();//End Draw
glPopMatrix(); //End Render
SDL_GL_SwapBuffers();
SDL_Delay(2);
}
SDL_Quit();
return 0;}
NOTE : "latura" est la largeur ou la hauteur du rectangle, "viteza" est la vélocité.
Le problème est que lorsque je teste le jeu sur d'autres machines, sur mon PC le jeu se déplace très lentement même si je peux dire que mon PC n'est pas si mauvais...(2GB RAM, 8600GT nvidia, et un intel quad core), sur d'autres machines le jeu se déplace beaucoup plus rapidement, indépendamment du fait que le code a été réglé à la même vitesse. Je n'arrive pas à trouver la logique de ce problème. Je voudrais savoir comment faire fonctionner ce jeu à la même vitesse sur différentes machines (j'ai cherché quelque chose comme des animations dépendantes du temps... je ne sais pas si cela aidera beaucoup ; j'ai aussi trouvé des sujets sur le rendu logiciel/matériel, est-ce que cela pourrait être le problème ? que sur mon PC le jeu utilise un rendu logiciel et sur d'autres machines un rendu matériel...).