Mirandolo asi por encima creo que quedaria más claro si añades los corchetes {} por si el compilador hiciera cosas raras. Aunque no tiene porque. Pienso que igual puede venir d otra parte del programa o quizás es el orden en que estan los if-else, iguales en el 1 y el 3 y diferentes en el 2 y 4. Es decir el orden de los if-else es diferente entre esas dos parejas(1/3 y 2/4) . Prueba a ponerlos todos iguales o quita los else y solo pon if's, porque se ejecutan diferente. No se si me explico.
NPC1:
if (NPC1.GetX () <= 412 && NPC1.move == 1)
NPC1.SetX (NPC1.GetX() + SPEED + 1.5);
else if (NPC1.GetX () >= 168 && NPC1.move == 2)
NPC1.SetX (NPC1.GetX() - SPEED - 1.5);
NPC3:
if (NPC3.GetX () <= 412 && NPC3.move == 1)
NPC3.SetX (NPC3.GetX() + SPEED + 1.5);
else if (NPC3.GetX () >= 168 && NPC3.move == 2)
NPC3.SetX (NPC3.GetX() - SPEED - 1.5);
------------------------------------
NPC2:
if (NPC2.GetX () >= 168 && NPC2.move == 2)
NPC2.SetX (NPC2.GetX() - SPEED - 1.5);
else if (NPC2.GetX () <= 412 && NPC2.move == 1)
NPC2.SetX (NPC2.GetX() + SPEED + 1.5);
NPC4:
if (NPC4.GetX () >= 168 && NPC4.move == 2)
NPC4.SetX (NPC4.GetX() - SPEED - 1.5);
else if (NPC4.GetX () <= 412 && NPC4.move == 1)
NPC4.SetX (NPC4.GetX() + SPEED + 1.5);
NPC1:
if (NPC1.GetX () <= 412 && NPC1.move == 1)
NPC1.SetX (NPC1.GetX() + SPEED + 1.5);
else if (NPC1.GetX () >= 168 && NPC1.move == 2)
NPC1.SetX (NPC1.GetX() - SPEED - 1.5);
NPC3:
if (NPC3.GetX () <= 412 && NPC3.move == 1)
NPC3.SetX (NPC3.GetX() + SPEED + 1.5);
else if (NPC3.GetX () >= 168 && NPC3.move == 2)
NPC3.SetX (NPC3.GetX() - SPEED - 1.5);
------------------------------------
NPC2:
if (NPC2.GetX () >= 168 && NPC2.move == 2)
NPC2.SetX (NPC2.GetX() - SPEED - 1.5);
else if (NPC2.GetX () <= 412 && NPC2.move == 1)
NPC2.SetX (NPC2.GetX() + SPEED + 1.5);
NPC4:
if (NPC4.GetX () >= 168 && NPC4.move == 2)
NPC4.SetX (NPC4.GetX() - SPEED - 1.5);
else if (NPC4.GetX () <= 412 && NPC4.move == 1)
NPC4.SetX (NPC4.GetX() + SPEED + 1.5);