Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con velocidad de movimiento

Iniciado por OdnetninI, 31 de Mayo de 2013, 05:52:52 PM

« anterior - próximo »

OdnetninI

Buenas a todos:
Soy OdnetninI, en mi primer post, de esta comunidad,  :-[
Bueno, al tema.
Estoy haciendo un juego del estilo "El juego mas dificil del mundo" para un minijuego, y resulta que las bolas enemigas las divido en NPC1, NPC2, NPC3 y NPC4, pero la 2 y la 4, van a mas velocidad que la 1 y 3, lo cual hace que si no esperas es imposible de pasar, y si esperas demasiado, es muy fácil. He mirado el código muchas veces, y no encuentro el porque. Asi que os dejo el code a ver si me podeis echar una mano. ;)

// NPC IA
                //NPC 1
                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);

                if (NPC1.GetX() >= 412)
                    NPC1.move = 2;

                if (NPC1.GetX() <= 168)
                    NPC1.move = 1;

                //NPC 2
                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);

                if (NPC2.GetX() >= 412)
                    NPC2.move = 2;

                if (NPC2.GetX() <= 168)
                    NPC2.move = 1;

                //NPC 3
                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);

                if (NPC3.GetX() >= 412)
                    NPC3.move = 2;

                if (NPC3.GetX() <= 168)
                    NPC3.move = 1;

                //NPC 4
                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);

                if (NPC4.GetX() >= 412)
                    NPC4.move = 2;

                if (NPC4.GetX() <= 168)
                    NPC4.move = 1;


Nota: SPEED = 1.2
Nota2: uso c++ y OpenGl

notoi

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);

OdnetninI

#2
Gracias por tu respuesta, pero nada, he cogido y he quitado los else, y nada, luego le añadí los corchetes y nada. No creo que sea de otra parte del código, pero por si las moscas os dejo el code del nivel en el que esta:

void Levels_Level1 (void)
{
    // Define Player
Player1.Init();
Player1.SetAlpha(255);
Player1.SetX (79);
Player1.SetY (159);
Player1.SetW (20);
Player1.SetH (20);

// Define NPC1
NPC1.Init();
NPC1.move = 1;
NPC1.SetX (168); // 168 a 412
NPC1.SetY (150);
NPC1.SetW (20);
NPC1.SetH (20);

// Define NPC2
NPC2.Init();
NPC2.move = 2;
NPC2.SetX (412); // 412 a 168
NPC2.SetY (177);
NPC2.SetW (20);
NPC2.SetH (20);

// Define NPC3
NPC3.Init();
NPC3.move = 1;
NPC3.SetX (168); // 168 a 412
NPC3.SetY (204);
NPC3.SetW (20);
NPC3.SetH (20);

// Define NPC4
NPC4.Init();
NPC4.move = 2;
NPC4.SetX (412); // 412 a 168
NPC4.SetY (231);
NPC4.SetW (20);
NPC4.SetH (20);

// Imagen
Level1.Load ("DATA/level1.png");

// Bucle del Level 1
while ( 1 )
{
// INPUT / EVENTS
            KEY_Update();

// LOGIC

            // NPC IA
                //NPC 1
                if (NPC1.GetX () <= 412 && NPC1.move == 1)
                    NPC1.SetX (NPC1.GetX() + SPEED + 1.5);

                if (NPC1.GetX () >= 168  && NPC1.move == 2)
                    NPC1.SetX (NPC1.GetX() - SPEED - 1.5);

                if (NPC1.GetX() >= 412)
                    NPC1.move = 2;

                if (NPC1.GetX() <= 168)
                    NPC1.move = 1;

                //NPC 2
                if (NPC2.GetX () >= 168  && NPC2.move == 2)
                    NPC2.SetX (NPC2.GetX() - SPEED - 1.5);

                if (NPC2.GetX () <= 412 && NPC2.move == 1)
                    NPC2.SetX (NPC2.GetX() + SPEED + 1.5);

                if (NPC2.GetX() >= 412)
                    NPC2.move = 2;

                if (NPC2.GetX() <= 168)
                    NPC2.move = 1;

                //NPC 3
                if (NPC3.GetX () <= 412 && NPC3.move == 1)
                    NPC3.SetX (NPC3.GetX() + SPEED + 1.5);

                if (NPC3.GetX () >= 168  && NPC3.move == 2)
                    NPC3.SetX (NPC3.GetX() - SPEED - 1.5);

                if (NPC3.GetX() >= 412)
                    NPC3.move = 2;

                if (NPC3.GetX() <= 168)
                    NPC3.move = 1;

                //NPC 4
                if (NPC4.GetX () >= 168  && NPC4.move == 2)
                    NPC4.SetX (NPC4.GetX() - SPEED - 1.5);

                if (NPC4.GetX () <= 412 && NPC4.move == 1)
                    NPC4.SetX (NPC4.GetX() + SPEED + 1.5);

                if (NPC4.GetX() >= 412)
                    NPC4.move = 2;

                if (NPC4.GetX() <= 168)
                    NPC4.move = 1;


            // Contol del Jugador
            Player1.Control ();

            // Colisiones
                // Arriba Principal
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 0, 0, Player1.GetW(), Player1.GetH(), 600, 121) == 1)
                    Player1.SetY (Player1.GetY() + SPEED);

                // Izquierda Primera
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 0, 122, Player1.GetW(), Player1.GetH(), 55, 278) == 1)
                    Player1.SetX (Player1.GetX() + SPEED);

                // Abajo Principal
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 51, 281, Player1.GetW(), Player1.GetH(), 544, 119) == 1)
                    Player1.SetY (Player1.GetY() - SPEED);

                // Derecha Primera
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 135, 122, Player1.GetW(), Player1.GetH(), 3, 135) == 1)
                    Player1.SetX (Player1.GetX() - SPEED);

                // Arriba Primera
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 135, 254, Player1.GetW(), Player1.GetH(), 31, 3) == 1)
                    Player1.SetY (Player1.GetY() + SPEED);

                // Derecha Segunda
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 189, 254, Player1.GetW(), Player1.GetH(), 3, 27) == 1)
                    Player1.SetX (Player1.GetX() - SPEED);

                // Abajo Primera
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 189, 254, Player1.GetW(), Player1.GetH(), 249, 3) == 1)
                    Player1.SetY (Player1.GetY() - SPEED);

                // Izquierda Segunda
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 162, 145, Player1.GetW(), Player1.GetH(), 3, 112) == 1)
                    Player1.SetX (Player1.GetX() + SPEED);

                // Arriba Segunda
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 162, 145, Player1.GetW(), Player1.GetH(), 249, 3) == 1)
                    Player1.SetY (Player1.GetY() + SPEED);

                // Derecha Tercera
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 435, 145, Player1.GetW(), Player1.GetH(), 3, 109) == 1)
                    Player1.SetX (Player1.GetX() - SPEED);

                // Izquierda Tercera
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 408, 122, Player1.GetW(), Player1.GetH(), 3, 26) == 1)
                    Player1.SetX (Player1.GetX() + SPEED);

                // Abajo Segunda
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 435, 145, Player1.GetW(), Player1.GetH(), 30, 3) == 1)
                    Player1.SetY (Player1.GetY() - SPEED);

                // Ganar
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), 464, 122, Player1.GetW(), Player1.GetH(), 34, 23) == 1)
                    ;

                // Muertes
                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), NPC1.GetX(), NPC1.GetY(), Player1.GetW(), Player1.GetH(), NPC1.GetW(), NPC1.GetH()) == 1)
                    {
                        Level1_Kill();
                    }

                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), NPC2.GetX(), NPC2.GetY(), Player1.GetW(), Player1.GetH(), NPC2.GetW(), NPC2.GetH()) == 1)
                    {
                        Level1_Kill();
                    }

                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), NPC3.GetX(), NPC3.GetY(), Player1.GetW(), Player1.GetH(), NPC3.GetW(), NPC3.GetH()) == 1)
                    {
                        Level1_Kill();
                    }

                if (FE_BoxColision(Player1.GetX(), Player1.GetY(), NPC4.GetX(), NPC4.GetY(), Player1.GetW(), Player1.GetH(), NPC4.GetW(), NPC4.GetH()) == 1)
                    {
                        Level1_Kill();
                    }


// RENDERING to Screen

            // Iniciar el Render
            Init_Render ();

            // Renderizar img
            Level1.Render();

            // Renderizar Player
            Player1.Render();

            // Renderizar NPCs
            NPC1.Render();
            NPC2.Render();
            NPC3.Render();
            NPC4.Render();

            // Fin del Render
            End_Render();

            // Menu
            if (KEYS.ESC)
                OpenMenuPauseLevel1();

}
}

void Level1_Kill (void)
{
    for(int i = 255; i > 10; i-=25)
    {
        // Cambiar el Alpha
        Player1.SetAlpha(i);

        // Iniciar el Render
        Init_Render ();

        // Renderizar img
        Level1.Render();

        // Renderizar Player
        Player1.Render();

        // Renderizar NPCs
        NPC1.Render();
        NPC2.Render();
        NPC3.Render();
        NPC4.Render();

        // Fin del Render
        End_Render();

    }

    // Recuperar datos del Player
    Player1.SetAlpha(255);
    Player1.SetX (79);
    Player1.SetY (159);
}


PD: poniendo el 1 con el 3, y el 2 con el 4, sigue sin ir.

notoi

Pues no se, ahora mismo no tengo tiempo para mirarlo detenidamente. Intenta debugearlo, igual es una tonteria.  Comenta partes '// esto es un comentario' de código en los cuales afecte a de alguna manera a un posible incremento de posicion para intentar localizar el error. Tb supongo que la variable esa SPEED debe ser un número positivo y que no cambia a signo negativo en alguna parte. Porque sino podria pasar cosas como esta:

SPEED = 2;
5 - SPEED = 5 - 2 = 3

SPEED = -2
5- SPEED = 5 - (-2) = 5 +2 = 7


OdnetninI

No ocurre nada de eso pero gracias por el interes, probaré comentando código haber si sale. ;)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.