2011-12-25 7 views
0

Pour une raison quelconque, mon personnage se déplace plus vite à gauche qu'à droite. C'est au moins deux fois plus vite.framerate problèmes d'animation indépendants

Voici la partie du code qui vérifie le mouvement de caractère:

if(moving) 
{ 
    Uint32 delta = g_delta_get_ticks(); 
    if(!g_holding_a) 
    { 
     position.x += accel * (delta/1000.f); 
     facing = right; 
    } 
    if(!g_holding_d) 
    { 
     position.x -= accel * (delta/1000.f); 
     facing = left; 
    } 
} 

Maintenant, ma première supposition sera le chronométreur agit drôle, mais, même en plaçant des valeurs statiques comme accel * (50/1000.f) résultats dans le même comportement .

Maintenant, si je dis simplement que les positions sont += and -= 2, cela fonctionne très bien. Des idées?

+0

Quel est le type de position.x? –

+0

'struct XY {GLuint x, y; }; ' – grep

Répondre

1

Je suspecte que la troncature cause votre problème. Lorsque vous dites some_int += some_float (ou some_int -= some_float), l'arithmétique est effectuée en virgule flottante, puis tronquée en un entier. Donc si some_int est 100 et some_float est 1.5, alors après some_int += some_float, vous obtenez 101 (tronqué de 101.5). Mais après some_int -= some_float, vous obtenez 98 (tronqué à partir de 98,5).

Puisque vous utilisez GLuint pour position.x, essayez tronquer l'ajustement dans un GLuint avant d'ajouter ou soustraire:

GLuint d = accel * (delta/1000.f); 
if (!g_holding_a) { 
    position.x += d; 
    facing = right; 
} 
if (!g_holding_d) { 
    position.x -= d; 
    facing = left; 
} 
+0

Bon appel! Cela semble avoir réglé le problème. Je devais également réinitialiser le temps avant d'échanger les tampons. Ce qui en vient maintenant à y penser, a beaucoup de sens. Merci! – grep