Je suis en train de développer un éditeur de map en mélangeant swt et opengl. Pour le moment j'affiche juste une liste à gauche avec les futurs apercus des textures, une liste à droite vide et un composite au milieu avec un GLCanvas pour pouvoir dessiner ma map à l'intérieur. Je me contente de dessiner seulement les cases de la map en mode polygone mais lorsque j'essaie de me déplacer sur la map grâce aux touches droite/gauche/haut/bas il se produit un lag et ca fait des à coups.
Voila la classe map qui s'occupe de gérer l'affiche de la carte dans le composite du milieu.
Si quelqu'un a déjà eu un problème similaire ou a une idée d'ou cela peut venir, je le remercie de lire la suite :)
public class Map {
GLCanvas canvas;
int width;
int height;
static double tan60 = 1.73; float x 0, y 0, vx = 0, vy = 0;
long fps = 50;
void drawCase(float x, float y, float z, float d)
{
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
GL11.glPushMatrix();
GL11.glTranslatef(x, y, z);
//
// Si il y a une resize on remet à jour l'écran.
//
canvas.addListener(SWT.Resize, new Listener()
{
public void handleEvent(Event event)
{
Rectangle bounds = canvas.getBounds();
canvas.setCurrent();
try
{
GLContext.useContext(canvas);
}
catch (LWJGLException e)
{
e.printStackTrace();
}
GL11.glViewport(0, 0, bounds.width, bounds.height);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluOrtho2D(0.0f, bounds.width, 0.0f, bounds.height);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
}
});
//
// Pour se déplacer sur la map on check les touches pressées.
//
canvas.addKeyListener(new KeyListener ()
{
public void keyPressed(KeyEvent key)
{
if (key.keyCode == SWT.ARROW_RIGHT)
vx = -5;
if (key.keyCode == SWT.ARROW_LEFT)
vx = 5;
if (key.keyCode == SWT.ARROW_DOWN)
vy = 5;
if (key.keyCode == SWT.ARROW_UP)
vy = -5;
}
public void keyReleased(KeyEvent key)
{
if (key.keyCode == SWT.ARROW_RIGHT)
vx = 0;
if (key.keyCode == SWT.ARROW_LEFT)
vx = 0;
if (key.keyCode == SWT.ARROW_DOWN)
vy = 0;
if (key.keyCode == SWT.ARROW_UP)
vy = 0;
}
});
//
// Affichage de la map
//
Display.getCurrent().asyncExec(new Runnable()
{
int rot = 0;
public void run()
{
if (!canvas.isDisposed())
{
canvas.setCurrent();
try
{
GLContext.useContext(canvas);
}
catch (LWJGLException e)
{
e.printStackTrace();
}
long currentTime1 = System.currentTimeMillis();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glTranslatef(0.0f, 0.0f, 0.0f);
Au lieu de faire un wait, utilise la synchronisation verticale, je sais que dans JOGL, tu as une méthode glSetSwapInterval, je ne sais pas quel est l'équivalent via LWJGL mais tu dois pouvoir le trouver dans la documentation. Sous JOGL, on a aussi une classe FPSAnimator pour faire la même chose que ce que tu fais dans ton instance de Runnable à la fin, il y a aussi un équivalent sous LWJGL, je te conseille de demander à des experts sur le forum www.javagaming.org dans la section consacrée à LWJGL.
Merci pour les infos je regarderais ça ce soir.
Par contre en passant mon éditeur sur un pc avec comme OS windows XP, il fonctionne correctement. Mon OS à moi est Windows Vista, peut être que ca venait aussi d'ici.
Je vais quand même jeter un oeil dans la doc LWJGL pour la synchro verticale.