Manual Snake en C++/SDL
2 participantes
Página 1 de 1.
Manual Snake en C++/SDL
SNAKE
EN C++/SDL
EN C++/SDL
Hola a todos
He creado este manual, por petición de Dato000 miembro del grupo de desarrollo de videojuegos al que pertenezco, en el voy a realizar una versión simple del videojuego Snake(o serpiente), usando C++ y la librería gráfica SDL, veréis que con apenas 280 lineas de código, contando espacios y comentarios se puede hacer el videojuego Snake(o serpiente) y que no es tan difícil como parece.
Espero que este manual le sea de ayuda a la gente que se apunto al reto y no pudo resolverlo, o para todo aquel que alguna vez a querido realizar el videojuego Snake(o serpiente) y no ha sido capaz.
Voy a empezar poniendo el código completo, para después ir explicándolo linea a linea, doy por sentado que el lector de este manual tiene una mínima base de programación en C o C++.
código:
- Código:
//Juego Snake realizado por kaltorak para el manual Snake en SDL/C++
#include <cstdlib>
#include <vector>
#include <time.h>
#include <SDL/SDL.h>
//Prototipo de la funcion Colision.
int Colision(SDL_Rect,SDL_Rect);
//Prototipo de la funcion Iniciar.
void Iniciar(void);
/*definimos la direcciones que pude tomas la seriente con esto conseguimos que el codigo sea mucho mas
mas comprensible*/
#define Arriba 1
#define Derecha 2
#define Abajo 3
#define Izquierda 4
/*Declaramos e inicializamos como constantes el ancho, el alto y la profundidad de color
de la ventana principal.*/
const int ResolucionX = 640;
const int ResolucionY = 480;
const int PColor = 32;
const int DELAY = 85;
//Declaramos e inicializamos la varible LongitudSerpiente la cual contendra el tamaño de la serpiente.
int LongitudSerpiente = 0;
/*Declaramos e inicializamos la variable Direccion que contendra la direccion en la que se esta
moviendo la Serpiente.*/
int Direccion = 0;
//Declaramos e inicializamos la variable control para controlar que la manzana no coincida con al cola.
int Control = 0;
/*Declaramos la variable memoria del tipoc SDL_Rect donde almacenaremos la posion anterior anterior
de la cabeza de la serpiente para poder mover la cola*/
SDL_Rect Ultimo;
//Declaramos e inicializamos la variable Puntos que contendra los puntos del juego.
int Puntos = 0;
//Delcaramos e inicializamos la variable Titulo que contendra el titulo de la ventana y la puntuacion.
char Titulo[255];
using namespace std;
/*Declaramos la estructura Cuadro que sera la encargada de almacenar la posicion
y el tamaño de cada una de las partes que formaran el cuerpo de la Serpiente*/
struct Cuadro
{
SDL_Rect Posicion;
Cuadro(){Posicion.x = 0;Posicion.y = 0;Posicion.w = 20;Posicion.h = 20;}
}Manzana;
//Declaramos el Vector Serpiente del tipo Cuadro.
vector <Cuadro> Serpiente;
int main ( int argc, char** argv )
{
srand(time(NULL));
//Inicializamos el modo de video de las SDL y comprobamos que se inicialize bien.
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Imposible iniciar la libreria SDL: %s\n", SDL_GetError() );
return 1;
}
//Itroducimos SDL_Quit en atexit para que se inice al finalizar el programa.
atexit(SDL_Quit);
/*Creamos la Surface principal del juego, la que se va a mostrar en pantalla.
y comprobamos que se inicie correctamente.*/
SDL_Surface* PantallaV = SDL_SetVideoMode(ResolucionX, ResolucionY, PColor,SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !PantallaV )
{
printf("Imposible crear la ventana Principal: %s\n", SDL_GetError());
return 1;
}
//Llamamos a la funcion Iniciar par poner todos los valores a cero.
Iniciar();
// program main loop
bool done = false;
while (!done)
{
// message processing loop
SDL_Event event;
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
done = true;
break;
// check for keypresses
case SDL_KEYDOWN:
{
// exit if ESCAPE is pressed
if (event.key.keysym.sym == SDLK_ESCAPE)
{
done = true;
break;
}
if(event.key.keysym.sym == SDLK_UP && Direccion != Abajo)
{
Direccion = Arriba;
break;
}
if(event.key.keysym.sym == SDLK_DOWN && Direccion != Arriba)
{
Direccion = Abajo;
break;
}
if(event.key.keysym.sym == SDLK_LEFT && Direccion != Derecha)
{
Direccion = Izquierda;
break;
}
if(event.key.keysym.sym == SDLK_RIGHT && Direccion != Izquierda)
{
Direccion = Derecha;
break;
}
}
} // end switch
} // end of message processing
// DRAWING STARTS HERE
if(Direccion != 0)
{
//Almacenamos la posicion del ultimo de los elementos que forman la cola en la variable Ultimo.
Ultimo.x = Serpiente[LongitudSerpiente].Posicion.x;
Ultimo.y = Serpiente[LongitudSerpiente].Posicion.y;
//Movemos la cola de la serpiente.
for(int I = LongitudSerpiente; I >= 1; I--)
{
Serpiente[I].Posicion.x = Serpiente[I-1].Posicion.x;
Serpiente[I].Posicion.y = Serpiente[I-1].Posicion.y;
}
}
if(Direccion == Arriba)
{
Serpiente[0].Posicion.y -= Serpiente[0].Posicion.h;
}
else if(Direccion == Abajo)
{
Serpiente[0].Posicion.y += Serpiente[0].Posicion.h;
}
else if(Direccion == Derecha)
{
Serpiente[0].Posicion.x += Serpiente[0].Posicion.w;
}
else if(Direccion == Izquierda)
{
Serpiente[0].Posicion.x -= Serpiente[0].Posicion.w;
}
//Comprobamos la colision de la serpiente con el borde.
if(((Serpiente[0].Posicion.x + Serpiente[0].Posicion.w) > ResolucionX)
|| (Serpiente[0].Posicion.x < 0)
|| ((Serpiente[0].Posicion.y + Serpiente[0].Posicion.h) > ResolucionY)
|| (Serpiente[0].Posicion.y < 0))
{
Iniciar();
}
//Comprobamos la colision de la serpiente con la cola.
for(int I = 1; I <= LongitudSerpiente; I++)
{
if(Colision(Serpiente[0].Posicion,Serpiente[I].Posicion))
{
Iniciar();
}
}
//Comprobamos la colision de la serpiente con la Manzana.
if(Colision(Serpiente[0].Posicion,Manzana.Posicion))
{
LongitudSerpiente++;
Puntos += 10;
Serpiente.push_back(Cuadro());
Serpiente[LongitudSerpiente].Posicion.x = Ultimo.x;
Serpiente[LongitudSerpiente].Posicion.y = Ultimo.y;
//Metemos en la varible Titulo el titulo de la ventana seguido de la puntuacion del juego.
sprintf(Titulo,"Snake -- Puntos: %d",Puntos);
/*Posicionamos denuevo la manazana en pantalla y comprobamos que la nueva ubicacion
no este ocupada por la cola de la Serpiente.*/
do
{
Manzana.Posicion.x = ((rand() % ((ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w))*Manzana.Posicion.w);
Manzana.Posicion.y = ((rand() % ((ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h))*Manzana.Posicion.h);
Control = 0;
for(int I = 1; I <= LongitudSerpiente; I++)
{
if(Colision(Manzana.Posicion,Serpiente[I].Posicion))
{
Control = 1;
I = LongitudSerpiente;
}
}
}
while(Control == 1);
}
//Borramos la surface principal
SDL_FillRect(PantallaV, 0, SDL_MapRGB(PantallaV->format, 0, 0, 0));
//Pintamos la serpiente en la Surface principal
for(int I = 0; I <= LongitudSerpiente; I++)
{
SDL_FillRect(PantallaV,&Serpiente[I].Posicion,SDL_MapRGB(PantallaV->format, 255, 255, 255));
}
//Pintamos la manzana en la Surface principal
SDL_FillRect(PantallaV,&Manzana.Posicion,SDL_MapRGB(PantallaV->format, 0, 255, 0));
//Cambiamos el titulo de la ventana por Snake.
SDL_WM_SetCaption (Titulo, NULL);
//Mostramos la Surface principal en pantalla.
SDL_Flip(PantallaV);
SDL_Delay(DELAY);
} // end main loop
return 0;
}
//Funcion que compruba las colisiones entre los elementos de juego.
int Colision(SDL_Rect H,SDL_Rect M)
{
if (((H.x + H.w) > M.x) && ((H.y + H.h) > M.y) &&
((M.x + M.w) > H.x) && ((M.y + M.h) > H.y))
{
return 1;
}
else
{
return 0;
}
}
//Funcion que reinicia el juego cuando la serpiente colisiona con ella misma o el borde.
void Iniciar(void)
{
/*Ponemos el valor de la variable longitudSerpiente a 0 para que la serpiente solo este formada por
la cabeza.*/
LongitudSerpiente = 0;
//Ponemos el valor de la variable Direccion a 0 para que la serpiente aparezca parada al comenzar el juego.
Direccion = 0;
//Ponemos el valor de la variable Puntos a 0 para reiniciar el marcador de puntos.
Puntos = 0;
//Metemos en la varible Titulo el titulo de la ventana seguido de la puntuacion del juego.
sprintf(Titulo,"Snake -- Puntos: %d",Puntos);
//Borramos todos los miembros que forman el vector Serpiente
Serpiente.clear();
//Añadimos un miembro en el vector serpiente que contendra la cabeza de la serpiente.
Serpiente.push_back(Cuadro());
//Posicionamos aleatoriamente la manzana en la pantalla.
Manzana.Posicion.x = ((rand() % ((ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w))*Manzana.Posicion.w);
Manzana.Posicion.y = ((rand() % ((ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h))*Manzana.Posicion.h);
//Posicionamos la cabeza de la serpiente en el centro de la pantalla.
Serpiente[0].Posicion.x = (((ResolucionX/Serpiente[0].Posicion.w)/2)*Serpiente[0].Posicion.w);
Serpiente[0].Posicion.y = (((ResolucionY/Serpiente[0].Posicion.h)/2)*Serpiente[0].Posicion.h);
}
Su argumento es muy sencillo pero enormemente adictivo, el jugador controla una larga y delgada criatura semejante a una serpiente, de hay el nombre del videojuego, que vaga por un plano delimitado por paredes, donde debe evitar a toda costa chocar contra las paredes o consigo misma mientras come manzanas las cuales la hacen crecer, lo cual complica el juego a medida que la serpiente va creciendo debido a la ingesta de las mencionadas manzanas, si esto no fuera suficiente la serpiente una vez que comienza a moverse no puede ser para por el jugador, este se tiene que limitar a cambiar el sentido de la marcha de la suso dicha serpiente mediante las flechas de dirección, para que se coma las manzanas y evite chocar.
Comencemos a analizar el código.
Comenzamos incluyendo las librerías que vamos a necesitar para el buen funcionamiento del código.
La librería estándar "cstdlib "
- Código:
#include <cstdlib>
- Código:
#include <vector>
- Código:
#include <time.h>
- Código:
#include <SDL/SDL.h>
Las siguiente lineas de código son los prototipos de las funciones “Colision” y “Iniciar”, de las cuales explicare su funcionamiento mas adelante.
- Código:
int Colision(SDL_Rect,SDL_Rect);
void Iniciar(void);
Lo que estas macros hacen es que trabajemos con las direcciones reales en las que se mueve la serpiente y no números pues tras un tiempo sin usar el código no sabríamos que significaba cada numero.
Mirar a la dirección Arriba le adjudicamos el numero 1, lo que hace esta macro es que en el código podemos poner Arriba y sabremos que significa 1, después el preprocesador cambiara las palabra Arriba por un 1 antes de compilar el código, como bien he dicho esto es solo por limpieza y para mejorar la compresión del código para futuras modificaciones o para que sea comprensible para otra persona que no sea el programador del mismo.
- Código:
#define Arriba 1
#define Derecha 2
#define Abajo 3
#define Izquierda 4
- Código:
const int ResolucionX = 640;
const int ResolucionY = 480;
const int PColor = 32;
- Código:
const int DELAY = 85;
- Código:
int LongitudSerpiente = 0;
moviendo la Serpiente en cada momento, principalmente la inicializamos a 0 para que la serpiente aparezca parada al comenzar el juego.
- Código:
int Direccion = 0;
- Código:
int Control = 0;
- Código:
SDL_Rect Ultimo;
- Código:
int Puntos = 0;
- Código:
char Titulo[255];
- Código:
using namespace std;
Si os fijáis también he creado un constructor para que la primera vez que creemos uno de los cuadros que formaran la serpiente o la manzana, se inicialicen con un tamaño de 20 píxeles.
- Código:
struct Cuadro
{
SDL_Rect Posicion;
Cuadro(){Posicion.x = 0;Posicion.y = 0;Posicion.w = 20;Posicion.h = 20;}
}Manzana;
Por ejemplo si la pantalla midiera 640x480 y cada cuadro que forma la serpiente midiera 20 píxeles, la forma de saber el tamaño máximo que podrá alcanzar nuestra serpiente sera así:
640/20 = 32
480/20 = 24
32 * 24 = 768
768 – 1 = 767
Nuestra serpiente podría tener un tamaño máximo de 767 cuadros y podríamos generar un array de 767 elementos y evitar usar vectores, pero de esta manera estaríamos desperdiciando mucha memoria que mas de un 90% de las veces no sera usada, por este motivo y como es una buena practica de programación ahorrar memoria vamos a usar vectores.
- Código:
vector <Cuadro> Serpiente;
- Código:
int main ( int argc, char** argv )
{
- Código:
srand(time(NULL));
- Código:
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Imposible iniciar la libreria SDL: %s\n", SDL_GetError() );
return 1;
}
- Código:
atexit(SDL_Quit);
- Código:
SDL_Surface* PantallaV = SDL_SetVideoMode(ResolucionX, ResolucionY,PColor,SDL_HWSURFACE|SDL_DOUBLEBUF);
if ( !PantallaV )
{
printf("Imposible crear la ventana Principal: %s\n", SDL_GetError());
return 1;
}
- Código:
Iniciar();
La función Iniciar es la encargada de poner todas las variables con los valores originales del juego para de esta manera poder reiniciarlo cuando colisionemos y la serpiente muera.
- Código:
void Iniciar(void)
{
/*Ponemos el valor de la variable longitudSerpiente a 0 para que la serpiente solo este formada por
la cabeza.*/
LongitudSerpiente = 0;
/*Ponemos el valor de la variable Direccion a 0 para que la serpiente aparezca parada al comenzar el juego.*/
Direccion = 0;
//Ponemos el valor de la variable Puntos a 0 para reiniciar el marcador de puntos.
Puntos = 0;
//Metemos en la variable Titulo el titulo de la ventana seguido de la puntuación del juego.
sprintf(Titulo,"Snake -- Puntos: %d",Puntos);
//Borramos todos los miembros que forman el vector Serpiente
Serpiente.clear();
//Añadimos un miembro en el vector serpiente que contendrá la cabeza de la serpiente.
Serpiente.push_back(Cuadro());
//Posicionamos aleatoriamente la manzana en la pantalla.
Manzana.Posicion.x = ((rand() % ((ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w))*Manzana.Posicion.w);
Manzana.Posicion.y = ((rand() % ((ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h))*Manzana.Posicion.h);
//Posicionamos la cabeza de la serpiente en el centro de la pantalla.
Serpiente[0].Posicion.x = (((ResolucionX/Serpiente[0].Posicion.w)/2)*Serpiente[0].Posicion.w);
Serpiente[0].Posicion.y = (((ResolucionY/Serpiente[0].Posicion.h)/2)*Serpiente[0].Posicion.h);
}
- Código:
Manzana.Posicion.x = ((rand() % ((ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w))*Manzana.Posicion.w);
Manzana.Posicion.y = ((rand() % ((ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h))*Manzana.Posicion.h);
Así que si por un casual el ancho aleatorio que nos saliera fuera 640, la manzana se colocaría fuera de la pantalla por el lado derecho de la misma o si el valor para el alto generado aleatoriamente coincidiera con 480, pasaría lo mismo que en el caso anterior pero esta vez la manzana se dibujaría fuera de la pantalla por el lado inferior de la misma, para solucionar este problema debemos restarle el ancho y el alto de la manzana a las dimensiones de la pantalla para asegurarnos de que dicha manzana cuando sea dibujada no se muestre fuera de los limites de la pantalla, el ancho de la manzana se encuentran en Manzana.Posicion.w y el alto en Manzana.Posicion.h.
- Código:
(ResolucionX-Manzana.Posicion.w)
(ResolucionY-Manzana.Posicion.h)
- Código:
(ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w)
(ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h)
- Código:
Manzana.Posicion.x = ((rand() % ((ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w))*Manzana.Posicion.w);
Manzana.Posicion.y = ((rand() % ((ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h))*Manzana.Posicion.h);
- Código:
Serpiente[0].Posicion.x = (((ResolucionX/Serpiente[0].Posicion.w)/2)*Serpiente[0].Posicion.w);
Serpiente[0].Posicion.y = (((ResolucionY/Serpiente[0].Posicion.h)/2)*Serpiente[0].Posicion.h);
Ahora Declaramos e inicializamos la variable done del tipo bool la cual usaremos como bandera de control para abandonar el bucle principal del juego una vez que pulsemos la tecla Escape o la X que cierra la ventana, tras la declaración creamos el bucle principal del juego que se repetirá siempre que el valor de la variable done se a false (o 0).
- Código:
bool done = false;
while (!done)
{
- Código:
SDL_Event event;
while (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
done = true;
break;
case SDL_KEYDOWN:
{
if (event.key.keysym.sym == SDLK_ESCAPE)
{
done = true;
break;
}
if(event.key.keysym.sym == SDLK_UP && Direccion != Abajo)
{
Direccion = Arriba;
break;
}
if(event.key.keysym.sym == SDLK_DOWN && Direccion != Arriba)
{
Direccion = Abajo;
break;
}
if(event.key.keysym.sym == SDLK_LEFT && Direccion != Derecha)
{
Direccion = Izquierda;
break;
}
if(event.key.keysym.sym == SDLK_RIGHT && Direccion != Izquierda)
{
Direccion = Derecha;
break;
}
}
}
}
- Código:
SDL_Event event;
- Código:
while (SDL_PollEvent(&event))
{
- Código:
switch (event.type)
{
- Código:
case SDL_QUIT:
done = true;
break;
- Código:
case SDL_KEYDOWN:
{
- Código:
if (event.key.keysym.sym == SDLK_ESCAPE)
{
- Código:
done = true;
break;
}
- Código:
if(event.key.keysym.sym == SDLK_UP && Direccion != Abajo)
{
Direccion = Arriba;
break;
}
- Código:
if(event.key.keysym.sym == SDLK_DOWN && Direccion != Arriba)
{
Direccion = Abajo;
break;
}
if(event.key.keysym.sym == SDLK_LEFT && Direccion != Derecha)
{
Direccion = Izquierda;
break;
}
if(event.key.keysym.sym == SDLK_RIGHT && Direccion != Izquierda)
{
Direccion = Derecha;
break;
}
}
}
}
Si la serpiente esta en movimiento quiere decir que la variable Dirección no vale 0 por tanto tenemos que empezar a mover dicha serpiente por la pantalla y para hacer esto lo primero que vamos a hacer es almacenar en la variable Ultimo del tipo SDL_Rect la posición del ultimo cuadro que forma la cola de la serpiente antes de que este sea movido de su posición actual esto lo hacemos para saber la posición en la que tendremos que colocar un nuevo cuadro si la serpiente se come la manzana
- Código:
if(Direccion != 0)
{
Ultimo.x = Serpiente[LongitudSerpiente].Posicion.x;
Ultimo.y = Serpiente[LongitudSerpiente].Posicion.y;
- Código:
//Movemos la cola de la serpiente.
for(int I = LongitudSerpiente; I >= 1; I--)
{
Serpiente[I].Posicion.x = Serpiente[I-1].Posicion.x;
Serpiente[I].Posicion.y = Serpiente[I-1].Posicion.y;
}
}
Pues vamos a resolver esta duda ahora mismo, como la cabeza de la serpiente es la que dirige al resto de la serpiente es la que tiene que moverse en concordancia con la dirección que le digamos usando el teclado por ese motivo la movemos con los siguientes if,
- Código:
if(Direccion == Arriba)
{
Serpiente[0].Posicion.y -= Serpiente[0].Posicion.h;
}
else if(Direccion == Abajo)
{
Serpiente[0].Posicion.y += Serpiente[0].Posicion.h;
}
else if(Direccion == Derecha)
{
Serpiente[0].Posicion.x += Serpiente[0].Posicion.w;
}
else if(Direccion == Izquierda)
{
Serpiente[0].Posicion.x -= Serpiente[0].Posicion.w;
}
- Código:
if(Direccion == Arriba)
{
Serpiente[0].Posicion.y -= Serpiente[0].Posicion.h;
}
- Código:
else if(Direccion == Abajo)
{
Serpiente[0].Posicion.y += Serpiente[0].Posicion.h;
}
else if(Direccion == Derecha)
{
Serpiente[0].Posicion.x += Serpiente[0].Posicion.w;
}
else if(Direccion == Izquierda)
{
Serpiente[0].Posicion.x -= Serpiente[0].Posicion.w;
}
- Código:
if(((Serpiente[0].Posicion.x + Serpiente[0].Posicion.w) > ResolucionX)
|| (Serpiente[0].Posicion.x < 0)
|| ((Serpiente[0].Posicion.y + Serpiente[0].Posicion.h) > ResolucionY)
|| (Serpiente[0].Posicion.y < 0))
{
Iniciar();
}
Como podéis ver la función Colision es muy simple lo que hace es comprobar si el cuadro que le pasamos como primer miembro de la función se encuentra dentro o en contacto con el cuadro que le pasamos como segundo miembro de la función, si están en contacto devuelve 1 y en caso contrario devuelve 0.
- Código:
int Colision(SDL_Rect H,SDL_Rect M)
{
if (((H.x + H.w) > M.x) && ((H.y + H.h) > M.y) &&
((M.x + M.w) > H.x) && ((M.y + M.h) > H.y))
{
return 1;
}
else
{
return 0;
}
}
- Código:
//Comprobamos la colision de la serpiente con la cola.
for(int I = 1; I <= LongitudSerpiente; I++)
{
if(Colision(Serpiente[0].Posicion,Serpiente[I].Posicion))
{
Iniciar();
}
}
- Código:
if(Colision(Serpiente[0].Posicion,Manzana.Posicion))
{
- Código:
LongitudSerpiente++;
- Código:
Puntos += 10;
- Código:
Serpiente.push_back(Cuadro());
- Código:
Serpiente[LongitudSerpiente].Posicion.x = Ultimo.x;
Serpiente[LongitudSerpiente].Posicion.y = Ultimo.y;
- Código:
sprintf(Titulo,"Snake -- Puntos: %d",Puntos);
- Código:
do {
Manzana.Posicion.x = ((rand() % ((ResolucionX-Manzana.Posicion.w)/Manzana.Posicion.w))*Manzana.Posicion.w);
Manzana.Posicion.y = ((rand() % ((ResolucionY-Manzana.Posicion.h)/Manzana.Posicion.h))*Manzana.Posicion.h);
Control = 0;
for(int I = 1; I <= LongitudSerpiente; I++)
{
if(Colision(Manzana.Posicion,Serpiente[I].Posicion))
{
Control = 1;
I = LongitudSerpiente;
}
}
}
while(Control == 1);
}
- Código:
SDL_FillRect(PantallaV, 0, SDL_MapRGB(PantallaV->format, 0, 0, 0));
- Código:
for(int I = 0; I <= LongitudSerpiente; I++)
{
SDL_FillRect(PantallaV,&Serpiente[I].Posicion,SDL_MapRGB(PantallaV->format, 255, 255, 255));
}
- Código:
SDL_FillRect(PantallaV,&Manzana.Posicion,SDL_MapRGB(PantallaV->format, 0, 255, 0));
- Código:
SDL_WM_SetCaption (Titulo, NULL);
- Código:
SDL_Flip(PantallaV);
SDL_Delay(DELAY);
}
- Código:
return 0;
}
Para cualquier duda os podéis poner en contacto conmigo en el foro o en mi email.
[Tienes que estar registrado y conectado para ver este vínculo]
La versión en pdf del manual la tenis en el siguiente enlace, junto con el archivo compilado para windows y linux, así como el código fuente:
[Tienes que estar registrado y conectado para ver este vínculo]
Un saludo
Kaltorak.
kaltorak- Admin
- Mensajes : 178
Fecha de inscripción : 30/05/2013
Re: Manual Snake en C++/SDL
EPICO!!!!!!!!
- MI CARA:
Mira, en la parte del movimiento, eres un fenomeno!!!! magister epico!!!!!!!
- Movimiento de la serpiente:
Si la serpiente esta en movimiento quiere decir que la variable Dirección no vale 0 por tanto tenemos que empezar a mover dicha serpiente por la pantalla y para hacer esto lo primero que vamos a hacer es almacenar en la variable Ultimo del tipo SDL_Rect la posición del ultimo cuadro que forma la cola de la serpiente antes de que este sea movido de su posición actual esto lo hacemos para saber la posición en la que tendremos que colocar un nuevo cuadro si la serpiente se come la manzana- Código:
if(Direccion != 0)
{
Ultimo.x = Serpiente[LongitudSerpiente].Posicion.x;
Ultimo.y = Serpiente[LongitudSerpiente].Posicion.y;
- Código:
//Movemos la cola de la serpiente.
for(int I = LongitudSerpiente; I >= 1; I--)
{
Serpiente[I].Posicion.x = Serpiente[I-1].Posicion.x;
Serpiente[I].Posicion.y = Serpiente[I-1].Posicion.y;
}
}
Absolutamente fantastico, me quedo muy claro como funciona, ya seria implementarlo luego, pero es absolutamente genial!!!!!!!!! viejo, eres mil veces mejores que los profesores de programación de mi universidad (Excepto por una ingeniera que explica bien uml y c# y además tiene buen culo ), claro que no explican juegos, pero bueno, es genial!!
- brillante!:
Esto es definitivamente un regalo para el mundo, de momento no puedo implementarlo, pero para este fin de semana ya estoy libre de mis trabajos y ten por seguro que vendre lleno de dudas y aportes, pero este, es definitivamente un aporte de oro puro!!!! gracias kaltorak, sensei!! sos grande!!!
- sensei!!!:
Este post se gano una entrada en mi blog y toda la publicidad que pueda darla tanto por internet, intranet, redes mesh, listas de correo, /g/, el mundo real y cuanto medio encuentre, muy pero muy bueno amigo mio, reiniciare todo y comenzare desde tu plantilla, pasare un rato muy agradable mirando el juego, un juego de primera, TOP 10!!!
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Manual Snake en C++/SDL
Me alegra mucho saber que te a gustado
espero fotos de esa profesora sexy jajajajaja.
espero fotos de esa profesora sexy jajajajaja.
kaltorak- Admin
- Mensajes : 178
Fecha de inscripción : 30/05/2013
Re: Manual Snake en C++/SDL
Cual profesora??? jejejejeje ella me parece más una alumna jejejeje, esperando ser iluminada XD
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.