Ayuda con el snake
2 participantes
Página 1 de 1.
Ayuda con el snake
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]
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...)
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...)
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Ayuda con el snake
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
que "!·$!"·" me falta, que no entiendo y estoy atorado, ayuda!!
- 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!!
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Ayuda con el snake
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.
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.
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.
kaltorak- Admin
- Mensajes : 178
Fecha de inscripción : 30/05/2013
Re: Ayuda con el snake
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:
Seguire averiguando obviamente, pero apreciaria cualquier colaboracion amigos.
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.
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.