Ayuda con el snake

Ver el tema anterior Ver el tema siguiente Ir abajo

Ayuda con el snake

Mensaje por dato000 el Mar Jul 02, 2013 10:58 pm

Buenas gente, hablando del reto no he podido sacar todo el tiempo que quiero para el snake, asi que no he podido avanzar mucho, ademas que esto es nuevo para mi bla bla bla, y no he podido, no he entendido como hacer que la serpiente avance independientemente de que se presione una tecla o no.

Intente hacerlo con un while y un do-while, pero o es increiblemente rapido y se sale de la pantalla (lo que me genera dudas respecto a que no respeta la colision con la pantalla y sobre como imponer un delay en los movimientos para que tenga fluidez) o pues el snake se bloquea.

Muchachos vengo a ver si pueden ayudarme, ese favor de poder explicar las cosas, porque he estado revisando codigo y codigo y pues realmente no he podido entender como es la gracia con ese par de cosillas, uds estan más avanzados que yo, así que apreciaria cualquier ayuda posible

De momento este es mi beta (muy beta)

[Tienes que estar registrado y conectado para ver este vínculo]

Código:

#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

const int velocidad = 1; // El movimiento de la serpiente
const int tam_x = 500;
const int tam_y = 400;

int main ( int argc, char** argv )
{
    SDL_Surface *pantalla;  // Definimos una superficie
    SDL_Event evento;      // Definimos una variable de eventos

    Uint8* Teclado; // Para capturar las teclas


    SDL_Rect jugador_cuadro; // rectangulo de rectangulo pequeño de juego

    // Posiciones iniciales
    jugador_cuadro.x = 200;
    jugador_cuadro.y = 200;
    jugador_cuadro.w = 50;
    jugador_cuadro.h = 50;

    // Iniciamos SDL
    if(SDL_Init(SDL_INIT_VIDEO))
    {
        // en caso de error
        fprintf(stderr, "Error al inicalizar SDL: %s\n", SDL_GetError());
        exit(1);
    }

    atexit(SDL_Quit);  // Al salir, cierra SDL

    // Establecemos el modo de pantalla
    pantalla = SDL_SetVideoMode(tam_x, tam_y, 16, SDL_ANYFORMAT);
    if(pantalla == NULL)
    {
        // Si no hemos podido incializar la superficie
        fprintf(stderr, "Error al crear la superficie: %s\n", SDL_GetError());
        exit(1);
    }

    // Personalizamos el titulo de la ventana
    SDL_WM_SetCaption("Snake", NULL);



    // Bucle infinito aqui se trabaja mientras no haya salida
    bool salir = false;
    while(!salir)
    {
        // Consultamos los eventos
        while(SDL_PollEvent(&evento))
        {
            if(evento.type == SDL_QUIT) // Si es de salida
                return 0;
            else if(evento.key.keysym.sym == SDLK_ESCAPE) // Si se oprime escape para salida
                return 0;
        }

        // COLISIONES
        // SERPIENTE CON PANTALLA
        /*while( jugador_cuadro.x > 0  &&
              jugador_cuadro.x < tam_x - jugador_cuadro.w &&
              jugador_cuadro.y > 0  &&
              jugador_cuadro.y < tam_y - jugador_cuadro.h)
        {}*/


        SDL_FillRect(pantalla, 0, SDL_MapRGB(pantalla->format, 172, 3, 3)); // pintando la pantalla
        SDL_FillRect(pantalla, &jugador_cuadro, SDL_MapRGB(pantalla->format, 243, 254, 37)); // pintando el jugador

        // MOVIMIENTO DE LA SERPIENTE
        // Comprobando teclas
        Teclado = SDL_GetKeyState(NULL);
        if (Teclado[SDLK_w] && jugador_cuadro.y > 0)
        {
            jugador_cuadro.y -= velocidad;
        }
        if (Teclado[SDLK_s] && jugador_cuadro.y < tam_y - jugador_cuadro.h) // eso es por el alto de la serpiente 480 - 50
        {
            jugador_cuadro.y += velocidad;
        }
        if (Teclado[SDLK_a] && jugador_cuadro.x > 0)
        {
            jugador_cuadro.x -= velocidad;
        }
        if (Teclado[SDLK_d] && jugador_cuadro.x < tam_x - jugador_cuadro.w) // eso es por el ancho de la serpiente 640 - 50
        {
            jugador_cuadro.x += velocidad;
        }

        SDL_Flip(pantalla);
    }
}


Aun no me he metido con las manzanas ni el crecimiento de la serpiente, todo es paso a paso, pero no he podido avanzar en dejar esa velocidad constante, porque simplemente n puedo dejar la posicion de la serpiente (jugador_cuadro.x & jugador_cuadro.y) en 0, porque simplemente reiniciaria, y no se como poner a funcionar el bucle correctamente.


gracias por su interes amigos

PD: aqui se puede generar texto de codigo segun el lenguaje como en el foro el hacker, me explico, como decir [ code = cpp] ... [/code] ????
PD: sigo trabajando en un buen slogan y una mascota (aun tengo presente a una chica como jessica...)



_________________


Así es, pura evolución
Para pasar el tiempo: [Tienes que estar registrado y conectado para ver este vínculo]
avatar
dato000
Admin

Mensajes : 161
Fecha de inscripción : 30/05/2013

Ver perfil de usuario

Volver arriba Ir abajo

Re: Ayuda con el snake

Mensaje por dato000 el Miér Jul 03, 2013 12:56 am

Buenas he seguido trabajando pero simplemente no entiendo para que cuando uno oprima una tecla la serpiente se mantenga en la direccion que uno le indica desde el teclado

codigo snake:
Código:
#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

const int aceleracion = 1; // El movimiento de la serpiente
const int tam_x = 500;
const int tam_y = 400;

int main ( int argc, char** argv )
{
    SDL_Surface *pantalla;  // Definimos una superficie
    SDL_Event evento;      // Definimos una variable de eventos

    Uint8* Teclado; // Para capturar las teclas


    SDL_Rect jugador_cuadro; // rectangulo de rectangulo pequeño de juego

    // Posiciones iniciales
    jugador_cuadro.x = 100;
    jugador_cuadro.y = 100;
    jugador_cuadro.w = 20;
    jugador_cuadro.h = 20;

    int velocidad_x; // La velocidad horizontal de la serpiente
    int velocidad_y; // La velocidad vertical de la serpiente

    // Iniciamos SDL
    if(SDL_Init(SDL_INIT_VIDEO))
    {
        // en caso de error
        fprintf(stderr, "Error al inicalizar SDL: %s\n", SDL_GetError());
        exit(1);
    }

    atexit(SDL_Quit);  // Al salir, cierra SDL

    // Establecemos el modo de pantalla
    pantalla = SDL_SetVideoMode(tam_x, tam_y, 16, SDL_ANYFORMAT);
    if(pantalla == NULL)
    {
        // Si no hemos podido incializar la superficie
        fprintf(stderr, "Error al crear la superficie: %s\n", SDL_GetError());
        exit(1);
    }

    // Personalizamos el titulo de la ventana
    SDL_WM_SetCaption("Snake", NULL);



    // Bucle infinito aqui se trabaja mientras no haya salida
    bool salir = false;
    while(!salir)
    {
        // Consultamos los eventos
        while(SDL_PollEvent(&evento))
        {
            if(evento.type == SDL_QUIT) // Si es de salida
                return 0;
            else if(evento.key.keysym.sym == SDLK_ESCAPE) // Si se oprime escape para salida
                return 0;
        }

        // COLISIONES
        // SERPIENTE CON PANTALLA

        velocidad_x = 0;
        velocidad_y = 0;

        if (jugador_cuadro.x > 0 && jugador_cuadro.x < tam_x - jugador_cuadro.w)
        {
          jugador_cuadro.x += velocidad_x;
        }

        if (jugador_cuadro.y > 0 && jugador_cuadro.y < tam_y - jugador_cuadro.h)
        {
          jugador_cuadro.y += velocidad_y;
        }


        // MOVIMIENTO DE LA SERPIENTE
        // Comprobando teclas
        Teclado = SDL_GetKeyState(NULL);
        if (Teclado[SDLK_w] && jugador_cuadro.y > 0)
        {
            velocidad_x = 0;
            velocidad_y = aceleracion;
            jugador_cuadro.y -= velocidad_y;
        }
        if (Teclado[SDLK_s] && jugador_cuadro.y < tam_y - jugador_cuadro.h) // eso es por el alto de la serpiente 480 - 50
        {
            velocidad_x = 0;
            velocidad_y = aceleracion;
            jugador_cuadro.y += velocidad_y;
        }
        if (Teclado[SDLK_a] && jugador_cuadro.x > 0)
        {
            velocidad_y = 0;
            velocidad_x = aceleracion;
            jugador_cuadro.x -= velocidad_x;
        }
        if (Teclado[SDLK_d] && jugador_cuadro.x < tam_x - jugador_cuadro.w) // eso es por el ancho de la serpiente 640 - 50
        {
            velocidad_y = 0;
            velocidad_x = aceleracion;
            jugador_cuadro.x += velocidad_x;
        }


        SDL_FillRect(pantalla, 0, SDL_MapRGB(pantalla->format, 172, 3, 3)); // pintando la pantalla
        SDL_FillRect(pantalla, &jugador_cuadro, SDL_MapRGB(pantalla->format, 243, 254, 37)); // pintando el jugador
        SDL_Flip(pantalla);
    }
}

que "!·$!"·" me falta, que no entiendo y estoy atorado, ayuda!!

_________________


Así es, pura evolución
Para pasar el tiempo: [Tienes que estar registrado y conectado para ver este vínculo]
avatar
dato000
Admin

Mensajes : 161
Fecha de inscripción : 30/05/2013

Ver perfil de usuario

Volver arriba Ir abajo

Re: Ayuda con el snake

Mensaje por kaltorak el Miér Jul 03, 2013 5:20 am

Hola dato000

He estado mirando tu código y lo he modificado un poco para que el cuadro valla solo en la dirección que tu le digas una vez pulses una de las teclas de dirección.

Código:
#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

const int aceleracion = 1; // El movimiento de la serpiente
const int tam_x = 500;
const int tam_y = 400;
int Direccion = 0;
int Velocidad = 1;

int main ( int argc, char** argv )
{
    SDL_Surface *pantalla;  // Definimos una superficie
    SDL_Event evento;      // Definimos una variable de eventos

    Uint8* Teclado; // Para capturar las teclas


    SDL_Rect jugador_cuadro; // rectangulo de rectangulo pequeño de juego

    // Posiciones iniciales
    jugador_cuadro.x = 100;
    jugador_cuadro.y = 100;
    jugador_cuadro.w = 20;
    jugador_cuadro.h = 20;

    // Iniciamos SDL
    if(SDL_Init(SDL_INIT_VIDEO))
    {
        // en caso de error
        fprintf(stderr, "Error al inicalizar SDL: %s\n", SDL_GetError());
        exit(1);
    }

    atexit(SDL_Quit);  // Al salir, cierra SDL

    // Establecemos el modo de pantalla
    pantalla = SDL_SetVideoMode(tam_x, tam_y, 16, SDL_ANYFORMAT);
    if(pantalla == NULL)
    {
        // Si no hemos podido incializar la superficie
        fprintf(stderr, "Error al crear la superficie: %s\n", SDL_GetError());
        exit(1);
    }

    // Personalizamos el titulo de la ventana
    SDL_WM_SetCaption("Snake", NULL);



    // Bucle infinito aqui se trabaja mientras no haya salida
    bool salir = false;
    while(!salir)
    {
        // Consultamos los eventos
        while(SDL_PollEvent(&evento))
        {
            if(evento.type == SDL_QUIT) // Si es de salida
                return 0;
            else if(evento.key.keysym.sym == SDLK_ESCAPE) // Si se oprime escape para salida
                return 0;
            else if(evento.key.keysym.sym == SDLK_UP) // Si se oprime escape para salida
             {
             Direccion = 1;
             }
            else if(evento.key.keysym.sym == SDLK_RIGHT) // Si se oprime escape para salida
             {
             Direccion = 2;
             }
            else if(evento.key.keysym.sym == SDLK_DOWN) // Si se oprime escape para salida
             {
             Direccion = 3;
             }
            else if(evento.key.keysym.sym == SDLK_LEFT) // Si se oprime escape para salida
             {
             Direccion = 4;
             }
        }

        // COLISIONES
        // SERPIENTE CON PANTALLA

       /*velocidad_x = 0;
        velocidad_y = 0;

        if (jugador_cuadro.x > 0 && jugador_cuadro.x < tam_x - jugador_cuadro.w)
        {
          jugador_cuadro.x += velocidad_x;
        }

        if (jugador_cuadro.y > 0 && jugador_cuadro.y < tam_y - jugador_cuadro.h)
        {
          jugador_cuadro.y += velocidad_y;
        }*/


      /*  // MOVIMIENTO DE LA SERPIENTE
        // Comprobando teclas
        Teclado = SDL_GetKeyState(NULL);
        if (Teclado[SDLK_w] && jugador_cuadro.y > 0)
        {
            velocidad_x = 0;
            velocidad_y = aceleracion;
            jugador_cuadro.y -= velocidad_y;
        }
        if (Teclado[SDLK_s] && jugador_cuadro.y < tam_y - jugador_cuadro.h) // eso es por el alto de la serpiente 480 - 50
        {
            velocidad_x = 0;
            velocidad_y = aceleracion;
            jugador_cuadro.y += velocidad_y;
        }
        if (Teclado[SDLK_a] && jugador_cuadro.x > 0)
        {
            velocidad_y = 0;
            velocidad_x = aceleracion;
            jugador_cuadro.x -= velocidad_x;
        }
        if (Teclado[SDLK_d] && jugador_cuadro.x < tam_x - jugador_cuadro.w) // eso es por el ancho de la serpiente 640 - 50
        {
            velocidad_y = 0;
            velocidad_x = aceleracion;
            jugador_cuadro.x += velocidad_x;
        }*/

        if(Direccion == 1)
         {
          if(jugador_cuadro.y > 0)
           {
            jugador_cuadro.y -= Velocidad;
           }
         }
        if(Direccion == 2)
         {
          if((jugador_cuadro.x + jugador_cuadro.w) < tam_x)
           {
            jugador_cuadro.x += Velocidad;
           }
         }
        if(Direccion == 3)
         {
          if((jugador_cuadro.y + jugador_cuadro.h) < tam_y)
           {
            jugador_cuadro.y += Velocidad;
           }
         }
        if(Direccion == 4)
         {
          if(jugador_cuadro.x > 0)
           {
            jugador_cuadro.x -= Velocidad;
           }
         }
        SDL_FillRect(pantalla, 0, SDL_MapRGB(pantalla->format, 172, 3, 3)); // pintando la pantalla
        SDL_FillRect(pantalla, &jugador_cuadro, SDL_MapRGB(pantalla->format, 243, 254, 37)); // pintando el jugador
        SDL_Flip(pantalla);
        SDL_Delay(10);
    }
}

He dejado las partes de tu código que no servían como comentario.
Suerte con el Proyecto.

PD: También le he incluido la colisión del cuadro con los bordes de la pantalla para que no se salga.

Un saludo
Kaltorak.

_________________

avatar
kaltorak
Admin

Mensajes : 178
Fecha de inscripción : 30/05/2013

Ver perfil de usuario

Volver arriba Ir abajo

Re: Ayuda con el snake

Mensaje por dato000 el Miér Jul 03, 2013 4:41 pm

Muchas gracias no conocia ese tipo de variable para teclado, lo tenia con otro parametro, estaba pensando en "direcciones" pero solo pensaba en dos asi que no sabia como implementarla.

Otra cosa, porque se usa el delay?? mejor dicho, porque es recomendable, se nota el cambio, es mucho más estable el movimiento, pero mirando documentacion mencionaba que depende de cada cpu el movimiento, y no me quedo muy claro.

Gracias por la ayuda seguire trabajando, sigue la manzanita

------------------------------------------------

Viejo puedes ayudarme, los codigos que he mirado no los he entendido, y con paueky al trabajar una libreria diferente no se como adaptarla a sdl.

No he podido crear una cola para la serpiente.



Simplemente estoy bloqueado, mi pensado es separar por 10 pixeles para crear la ilusion de la cola, pero no se como hacer para que la cola siga a la cabeza, no he podido darle movimiento, como es la cosa, he tratado de trabajarlo con una lista de tipo SDL_Rect, pero no se como hacer para que tome el incremento segun la velocidad y la direccion de la cabeza. No quiero que me hagan el codigo, sino una explicacion o una ayuda de como puedo trabajar este apartado.

Esta es la manera en la que trabaje el codigo:
Spoiler:
Código:

#ifdef __cplusplus
    #include <cstdlib>
#else
    #include <stdlib.h>
#endif
#ifdef __APPLE__
#include <SDL/SDL.h>
#else
#include <SDL.h>
#endif

#include <time.h>
#include <list>

using namespace std;

const int aceleracion = 1; // El movimiento de la serpiente
const int tam_x = 600;
const int tam_y = 400;
int Direccion = 0;
int Velocidad = 10;

int main ( int argc, char** argv )
{
    SDL_Surface *pantalla;  // Definimos una superficie
    SDL_Event evento;      // Definimos una variable de eventos

    Uint8* Teclado; // Para capturar las teclas


    SDL_Rect jugador_cuadro; // rectangulo de rectangulo peque単o de juego

    list<SDL_Rect> cola;

    // Posiciones iniciales

    //Iniciando semilla para random

    srand (time(NULL));
    jugador_cuadro.x = (tam_x / 2); // Posicion aleatoria en x
    jugador_cuadro.y = tam_y-30; // Posicion aleatoria en y

    jugador_cuadro.w = 20;
    jugador_cuadro.h = 20;

    // Iniciamos SDL
    if(SDL_Init(SDL_INIT_VIDEO))
    {
        // en caso de error
        fprintf(stderr, "Error al inicalizar SDL: %s\n", SDL_GetError());
        exit(1);
    }

    atexit(SDL_Quit);  // Al salir, cierra SDL

    // Establecemos el modo de pantalla
    pantalla = SDL_SetVideoMode(tam_x, tam_y, 16, SDL_ANYFORMAT);
    if(pantalla == NULL)
    {
        // Si no hemos podido incializar la superficie
        fprintf(stderr, "Error al crear la superficie: %s\n", SDL_GetError());
        exit(1);
    }

    // Personalizamos el titulo de la ventana
    SDL_WM_SetCaption("Snake", NULL);


    // Bucle infinito aqui se trabaja mientras no haya salida
    bool salir = false;
    while(!salir)
    {
        // Consultamos los eventos
        while(SDL_PollEvent(&evento))
        {
            if(evento.type == SDL_QUIT) // Si es de salida
                return 0;
            else if(evento.key.keysym.sym == SDLK_ESCAPE) // Si se oprime escape para salida
                return 0;
            else if(evento.key.keysym.sym == SDLK_r) // Si se oprime escape para reiniciar
            {
                jugador_cuadro.x = (tam_x / 2); // Posicion aleatoria en x
                jugador_cuadro.y = tam_y-30; // Posicion aleatoria en y

                jugador_cuadro.w = 20;
                jugador_cuadro.h = 20;
                Direccion = 0;
            }

            // Comprobando teclas de movimiento
            else if(evento.key.keysym.sym == SDLK_w) // Si se oprime arriba
            {
                Direccion = 1;
            }
            else if(evento.key.keysym.sym == SDLK_d) // Si se oprime derecha
            {
                Direccion = 2;
            }
            else if(evento.key.keysym.sym == SDLK_s) // Si se oprime abajo
            {
                Direccion = 3;
            }
            else if(evento.key.keysym.sym == SDLK_a) // Si se oprime izquierda
            {
                Direccion = 4;
            }
        }

        // Movimiento inicial de la serpiente
        if(Direccion == 0)
        {
          if(jugador_cuadro.y > 0 && (jugador_cuadro.y + jugador_cuadro.h) < tam_y)
          {
            jugador_cuadro.y -= Velocidad;
          }
        }


        // Colisiones y direcciones
        // Comprobando la direccion de cada cuadro y colision con pantalla
        if(Direccion == 1)
        {
          if(jugador_cuadro.y > 0)
          {
            jugador_cuadro.y -= Velocidad;
          }
        }
        if(Direccion == 2)
        {
          if((jugador_cuadro.x + jugador_cuadro.w) < tam_x)
          {
            jugador_cuadro.x += Velocidad;
          }
        }
        if(Direccion == 3)
        {
          if(jugador_cuadro.y < tam_y - jugador_cuadro.h)
          {
            jugador_cuadro.y += Velocidad;
          }
        }
        if(Direccion == 4)
        {
          if(jugador_cuadro.x > 0)
          {
            jugador_cuadro.x -= Velocidad;
          }
        }

        SDL_FillRect(pantalla, 0, SDL_MapRGB(pantalla->format, 172, 3, 3)); // pintando la pantalla
        SDL_FillRect(pantalla, &jugador_cuadro, SDL_MapRGB(pantalla->format, 243, 254, 37)); // pintando el jugador

        SDL_Rect cuadro;
        cuadro.x = 40;
        cuadro.y = 40;
        cuadro.w = 20;
        cuadro.h = 20;

        for(int i=0; i<10;i++)
        {
            cuadro.x+=25;
            SDL_FillRect(pantalla, &cuadro, SDL_MapRGB(pantalla->format, 17, 197, 238)); // pintando el jugador
        }

        // Cola

        /*cola.push_back(x,y,w,h);
        list<SDL_Rect>::const_iterator it;
        for(it = cola.begin(); it != cola.end(); it++)
        {
            SDL_FillRect(pantalla, *it, SDL_MapRGB(pantalla->format, 17, 197, 238));
        }*/

        // Manzana




        SDL_Flip(pantalla);
        SDL_Delay(30);
    }
}


Seguire averiguando obviamente, pero apreciaria cualquier colaboracion amigos.

_________________


Así es, pura evolución
Para pasar el tiempo: [Tienes que estar registrado y conectado para ver este vínculo]
avatar
dato000
Admin

Mensajes : 161
Fecha de inscripción : 30/05/2013

Ver perfil de usuario

Volver arriba Ir abajo

Re: Ayuda con el snake

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.