Logo

¡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.
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.