Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
3 participantes
Página 1 de 1.
Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
No es ni por asomo lo que se considera un juego, me tomo más tiempo del que pensaba ya que pues, soy nuevo con SDL, pero poco a poco avanzo, aún estoy mirando el uso de fuentes con ttf, el uso de flip y blit, si es mejor usar canales alpha para imagenes y textos...en fin, son muchas cosas, y eso que es el PONG!!! el juego más simple del mundo.
Dejo solo el src, ya que considero que hasta que este en un estado alpha no vale la pena dejar ejecutables para windows y linux, bsd, android...cafeteras y microondas...no se, lo que sea que pueda ejecutar este jueguito.
De momento solo funciona las colisiones, no hay puntuacion, no he podido hacer que sirva correctamente el mensaje de texto, pues parece un incomodo parpadeo que aun estoy averiguando de implementar correctamente, funciona con las teclas W-S para el jugador 1, y Flecha Arriba-Flecha Abajo para el segundo jugador. Pero tambien tengo pendiente implementar el uso de la barra del primer jugador con mouse y que funcione contra una IA para el segundo jugador.
Lo repito, es un estado beta, no esperen mucho, pero me siento orgulloso de que haber avanzado tanto, realmente en solo 1 mes y medio han habido progresos, no soy un genio como mis senseis Kaltorak y Amchacon, les estoy muy agradecidos por su incondicional apoyo y tutoria, es por eso que me siento motivado a seguir por aqui. Sigo camellando en esto, si señor
PONG, mi primer jueguito hecho solito, en un estado ULTRABETA, pero algo es algo, todavia tiene que mejorarse muchas cosas, Colisiones, tamaños de formas, puntuaciones, anotaciones, eventos con mouse, implementar una IA, uso de textos, blitting, fliping, uso de doble buffer... en fin, poco a poco, pero ahi vamos entendiendo la cosa. SDL es una nota, y de paso voy entendiendo allegro, vamos bien vamos bien!!! proxima estacion, nerdolandia!!
Dejo solo el src, ya que considero que hasta que este en un estado alpha no vale la pena dejar ejecutables para windows y linux, bsd, android...cafeteras y microondas...no se, lo que sea que pueda ejecutar este jueguito.
De momento solo funciona las colisiones, no hay puntuacion, no he podido hacer que sirva correctamente el mensaje de texto, pues parece un incomodo parpadeo que aun estoy averiguando de implementar correctamente, funciona con las teclas W-S para el jugador 1, y Flecha Arriba-Flecha Abajo para el segundo jugador. Pero tambien tengo pendiente implementar el uso de la barra del primer jugador con mouse y que funcione contra una IA para el segundo jugador.
[Tienes que estar registrado y conectado para ver este vínculo]
Lo repito, es un estado beta, no esperen mucho, pero me siento orgulloso de que haber avanzado tanto, realmente en solo 1 mes y medio han habido progresos, no soy un genio como mis senseis Kaltorak y Amchacon, les estoy muy agradecidos por su incondicional apoyo y tutoria, es por eso que me siento motivado a seguir por aqui. Sigo camellando en esto, si señor
PONG, mi primer jueguito hecho solito, en un estado ULTRABETA, pero algo es algo, todavia tiene que mejorarse muchas cosas, Colisiones, tamaños de formas, puntuaciones, anotaciones, eventos con mouse, implementar una IA, uso de textos, blitting, fliping, uso de doble buffer... en fin, poco a poco, pero ahi vamos entendiendo la cosa. SDL es una nota, y de paso voy entendiendo allegro, vamos bien vamos bien!!! proxima estacion, nerdolandia!!
Última edición por dato000 el Vie Jul 19, 2013 3:35 pm, editado 2 veces
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Ahora mismo estoy en el movil, mañana vuelvo a casa y comento.
amchacon- Admin
- Mensajes : 171
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Uf, hay mucha capuza de por medio (no te preocupes, todos lo hacemos ).
Bajando un poco más abajo:
Esto es incorrecto, la verdadera velocidadx y velocidady dependerá del angulo con el que impacte. No tiene sentido un rebote recto con muy poca inclinación.
No te puedo decir el algoritmo exacto (habría que hacer pruebas y pensarlo bien) pero casi seguro que es con senos/cosenos.
Generando y borrando BITMAPS sobre la marcha . Quita lo de TTF_RenderText y ponlo en el main (después de iniciar ttf). Declara la variable numero también en el main.
Debería quedar así:
2 SDL_Flip? quita el primero, por otro lado tener 10 de DELAY es absurdo (implicaría 100 FPS por segundo y ningún monitor tiene tanto refresco como eso, dejalo 18-30).
- Código:
// Comprobando teclas de movimiento
if(evento.key.keysym.sym == SDLK_w) // Si se oprime arriba
{
Direccion = 1;
}
if(evento.key.keysym.sym == SDLK_s) // Si se oprime abajo
{
Direccion = 2;
}
if(evento.key.keysym.sym == SDLK_UP) // Si se oprime derecha
{
Direccion = 3;
}
if(evento.key.keysym.sym == SDLK_DOWN) // Si se oprime izquierda
{
Direccion = 4;
}
//...
// Comprobando direcciones de Jugadores con Pared
if(Direccion == 1)
{
Vel_Jugador1 = -10;
}
if(Direccion == 2)
{
Vel_Jugador1 = 10;
}
if(Direccion == 3)
{
Vel_Jugador2 = -10;
}
if(Direccion == 4)
{
Vel_Jugador2 = 10;
}
- Código:
if(evento.key.keysym.sym == SDLK_w) // Si se oprime arriba
{
Vel_Jugador1 = -10;
}
Bajando un poco más abajo:
- Código:
// Colisiones Pelota con Pared
if( pelota.y < 10 )
{
Vel_PelotaY = 10;
}
if((pelota.y + pelota.h + Vel_PelotaY) >= tam_y)
{
Vel_PelotaY = -10;
}
if( pelota.x < 10 )
{
Vel_PelotaX = 10;
}
if((pelota.x + pelota.w + Vel_PelotaX) >= tam_x)
{
Vel_PelotaX = -10;
}
Esto es incorrecto, la verdadera velocidadx y velocidady dependerá del angulo con el que impacte. No tiene sentido un rebote recto con muy poca inclinación.
No te puedo decir el algoritmo exacto (habría que hacer pruebas y pensarlo bien) pero casi seguro que es con senos/cosenos.
- Código:
int numero = 0;
sprintf (Texto,"%d", numero);
PTexto = TTF_RenderText_Solid(Fuente, Texto, FgColor);
//Apply the images to the screen
apply_surface( 300, 100, PTexto, pantalla );
SDL_FreeSurface( PTexto );
Generando y borrando BITMAPS sobre la marcha . Quita lo de TTF_RenderText y ponlo en el main (después de iniciar ttf). Declara la variable numero también en el main.
Debería quedar así:
- Código:
sprintf (Texto,"%d", numero);
apply_surface( 300, 100, PTexto, pantalla );
- Código:
SDL_Flip(pantalla);
SDL_FillRect(pantalla, 0, SDL_MapRGB(pantalla->format, 0, 0, 0)); // pintando la pantalla
SDL_FillRect(pantalla, &jugador1, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando el jugador1
SDL_FillRect(pantalla, &jugador2, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando el jugador2
SDL_FillRect(pantalla, &pelota, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando la pelota
SDL_Flip(pantalla);
SDL_Delay(10);
2 SDL_Flip? quita el primero, por otro lado tener 10 de DELAY es absurdo (implicaría 100 FPS por segundo y ningún monitor tiene tanto refresco como eso, dejalo 18-30).
Ya usas doble buffer:dato000 escribió:PONG, mi primer jueguito hecho solito, en un estado ULTRABETA, pero algo es algo, todavia tiene que mejorarse muchas cosas, Colisiones, tamaños de formas, puntuaciones, anotaciones, eventos con mouse, implementar una IA, uso de textos, blitting, fliping, uso de doble buffer... en fin, poco a poco, pero ahi vamos entendiendo la cosa. SDL es una nota, y de paso voy entendiendo allegro, vamos bien vamos bien!!! proxima estacion, nerdolandia!!
- Código:
SDL_SetVideoMode(tam_x, tam_y, profundidad_color,
SDL_SWSURFACE|SDL_DOUBLEBUF);
//...
SDL_Flip(pantalla);
amchacon- Admin
- Mensajes : 171
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Vale gracias por los datos, los tendre en cuenta aunque dejame decir dos cosas:
1) Lo de senos y cosenos lo entiendo, pero realmente no hay inclinacion en un pong, solo sube y baja - Izquierda - Derecha, asi que no hay ciencia en esto, no es como si fuera un juego como micromachines (como menciona el manual)
2) puse direcciones diferentes para que las barras se muevan independientemente de los demás objetos, de forma continua con solo presionar una vez, no me gusta que se mantenga presionado para mover la barra, ya que si se alza el dedo la barra queda estatica y le quita dinamica al juego, bueno, asi me gusta, luego trato de implementar IA y mouse asi que no es la gran cosa, lo hice para saber como funciona todo esto
maese seguire trabajando, gracias por los comentarios
1) Lo de senos y cosenos lo entiendo, pero realmente no hay inclinacion en un pong, solo sube y baja - Izquierda - Derecha, asi que no hay ciencia en esto, no es como si fuera un juego como micromachines (como menciona el manual)
2) puse direcciones diferentes para que las barras se muevan independientemente de los demás objetos, de forma continua con solo presionar una vez, no me gusta que se mantenga presionado para mover la barra, ya que si se alza el dedo la barra queda estatica y le quita dinamica al juego, bueno, asi me gusta, luego trato de implementar IA y mouse asi que no es la gran cosa, lo hice para saber como funciona todo esto
maese seguire trabajando, gracias por los comentarios
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Bueno señores, les dejo un poco más del pong, puliendo y añadiendo según tus criticas, maese Amchacon, tenias razón en muchas cosas, claro que falta organizar codigo en funciones para hacerlo más practico, pero eso lo hare al final cuando tenga eventos por mouse y la IA listos para el juego.
De momento he mejorado bastante, se siente bien avanzar, ya he entendido muchisisisisisisismo de este tema, muy pero muy bueno,
Que cosas he mejorado, facil: decoración, textos y rediseños. Puse un sistema de puntuación bastante facil de poner pero que pues, era fundamental para el juego, el score.
Ya voy entendiendo como funciona el blit, más o menos.
[Tienes que estar registrado y conectado para ver este vínculo]
Siento que estoy logrando una meta, casi me dan ganas de brincar en una pata y llorar de la dicha, ya se que es solo un jueguito basico, pero es mio!!!!!! XDDDD
Nuevamente hasta que no tenga bien avazando el proyecto no genero ejecutables para linux y windows.
De momento he mejorado bastante, se siente bien avanzar, ya he entendido muchisisisisisisismo de este tema, muy pero muy bueno,
Que cosas he mejorado, facil: decoración, textos y rediseños. Puse un sistema de puntuación bastante facil de poner pero que pues, era fundamental para el juego, el score.
Ya voy entendiendo como funciona el blit, más o menos.
[Tienes que estar registrado y conectado para ver este vínculo]
- PONG CUASI-ALPHA:
- 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>
#include <SDL/SDL_ttf.h>
using namespace std;
//apply_surface function
void apply_surface (int x, int y,
SDL_Surface* source, SDL_Surface* destination);
const int aceleracion = 1; // El movimiento de la serpiente
const int tam_x = 800;
const int tam_y = 500;
const int TamanyoFuente1 = 100;
const int TamanyoFuente2 = 10;
const int profundidad_color = 16;
int Direccion = 0;
int Vel_Jugador1 = 20;
int Vel_Jugador2 = 20;
int Vel_PelotaY = 20;
int Vel_PelotaX = 20;
int main ( int argc, char** argv )
{
SDL_Surface *pantalla; // Definimos una superficie en la pantalla
SDL_Surface *PTexto1; // Definimos una superficie de texto para el score 1
SDL_Surface *PTexto2; // Definimos una superficie de texto para el score 2
SDL_Surface *PTextoPONG; // Definimos una superficie de texto para el mensaje PONG
SDL_Surface *PTextoCreditos; // Definimos una superficie de texto para el mensaje de los creditos
SDL_Event evento; // Definimos una variable de eventos, de juego
SDL_Event evt_jug1; // Definimos una variable de eventos, de barra jugador1
SDL_Event evt_jug2; // Definimos una variable de eventos, de barra jugador2
SDL_Rect jugador1; // rectangulo 1
SDL_Rect jugador2; // rectangulo 2
SDL_Rect pelota; // rectangulo 3
SDL_Rect PosyTexto1; //rectangulo para texto score jugador 1
SDL_Rect PosyTexto2; //rectangulo para texto score jugador 2
SDL_Rect PosyTextoPONG; //rectangulo para texto PONG
SDL_Rect PosyTextoCreditos; //rectangulo para texto PONG
TTF_Font *Fuente1; // Variable de fuente del juego
TTF_Font *Fuente2; // Variable de fuente de los creditos
const char FuenteTexto1[] = "impact.ttf"; // Referencia a la fuente
const char FuenteTexto2[] = "animeace2.ttf"; // Referencia a la fuente
char Texto1[3]; // Variable que contiene el string score jugador 1
char Texto2[3]; // Variable que contiene el string score jugador 2
char mensaje[10]; // Variable que contiene el string "PONG"
char creditos[50]; // Variable que contiene el string de los creditos
SDL_Color FgColor,BgColor; // Valores de color para texto
// Posiciones iniciales
// Iniciando semilla para random
srand (time(NULL));
// Valores jugador1
jugador1.x = 100;
jugador1.y = 60;
jugador1.w = 10;
jugador1.h = 100;
// Valores jugador2
jugador2.x = 690;
jugador2.y = 60;
jugador2.w = 10;
jugador2.h = 100;
// Valores pelota
// pelota.x = rand() % 200+200; // valores entre 200 y 400
pelota.x = 420;
pelota.y = rand() % 200+200; // valores entre 200 y 400
pelota.w = 20;
pelota.h = 20;
// Inicializamos los valores del color de los Numero.
FgColor.r = 255;
FgColor.g = 255;
FgColor.b = 255;
BgColor.r = 0;
BgColor.g = 0;
BgColor.b = 0;
// Decoraciones
// Barra Superior
SDL_Rect barra_superior;
barra_superior.x = 10;
barra_superior.y = 20;
barra_superior.w = tam_x - 20;
barra_superior.h = 20;
SDL_Rect barra_inferior;
barra_inferior.x = 10;
barra_inferior.y = tam_y - 40;
barra_inferior.w = tam_x - 20;
barra_inferior.h = 20;
SDL_Rect barra_vertical;
barra_vertical.x = 400;
barra_vertical.y = 20;
barra_vertical.w = 20;
barra_vertical.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
// Inicializando libreria SDL_TTF para textos en el juego
// Comprobamos que se corra bien la libreria
if ( TTF_Init() < 0 )
{
printf( "Imposible iniciar la libreria TTF: %s\n", SDL_GetError() );
return 1;
}
//Itroducimos TTF_Quit en atexit para que se inicie al finalizar el programa.
atexit(TTF_Quit);
/*cargamos la fuente definida en la variable de tipo char FuenteTexto y le ponemos
el tamaño definido en la variable TamanoFuente y comprobamos que se carge correctamente.*/
Fuente1 = TTF_OpenFont(FuenteTexto1,TamanyoFuente1);
// Capturando el error he imprimiendo en pantalla si pasa algo
if ( !Fuente1 )
{
printf("Imposible Abrir la fuente %s \n", FuenteTexto1);
return 1;
}
Fuente2 = TTF_OpenFont(FuenteTexto2,TamanyoFuente2);
// Capturando el error he imprimiendo en pantalla si pasa algo
if ( !Fuente2 )
{
printf("Imposible Abrir la fuente %s \n", FuenteTexto2);
return 1;
}
// Vamos a dejar el mensaje de los creditos:
// "Hecho por dato000 2013 con mucho cariño"
// Cargando el mensaje en la variable creditos
sprintf (creditos,"%s", "Hecho por dato000 2013 con mucho aprecio");
// Vamos a dejar el mensaje pong listo para pantalla
// Cargando "PONG" en la variable mensaje
sprintf (mensaje,"%s", "PO NG");
/*Introducimos el valor de la Variable TVida, la cual almacena el numero de segundos de vida que
le quedan al cuadro malo antes de morir en la cadena de caracteres Texto.*/
int numero1 = 0;
int numero2 = 0;
sprintf (Texto1,"%d", numero1);
sprintf (Texto2,"%d", numero2);
PosyTexto1.x = 280;
PosyTexto1.y = 50;
PosyTexto2.x = 460;
PosyTexto2.y = 50;
PosyTextoPONG.x = 280;
PosyTextoPONG.y = 200;
PosyTextoCreditos.x = 20;
PosyTextoCreditos.y = tam_y - 15;
//Renderizamos La surface PTexto con el valor contenido en la cadena de caracteres Texto.
PTexto1 = TTF_RenderText_Shaded(Fuente1,Texto1,FgColor,BgColor);
PTexto2 = TTF_RenderText_Shaded(Fuente1,Texto2,FgColor,BgColor);
PTextoPONG = TTF_RenderText_Shaded(Fuente1,mensaje,FgColor,BgColor);
PTextoCreditos = TTF_RenderText_Shaded(Fuente2,creditos,FgColor,BgColor);
// Establecemos el modo de pantalla
pantalla = SDL_SetVideoMode(tam_x, tam_y, profundidad_color,
SDL_SWSURFACE|SDL_DOUBLEBUF);
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("Pong Dato", 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
{
// Reiniciando Velocidad de barras
// Valores jugador1
jugador1.x = 100;
jugador1.y = 60;
jugador1.w = 10;
jugador1.h = 100;
// Valores jugador2
jugador2.x = 690;
jugador2.y = 60;
jugador2.w = 10;
jugador2.h = 100;
// Valores pelota
//pelota.x = rand() % 200+200; // valores entre 200 y 400
pelota.x = 400;
pelota.y = rand() % 200+200; // valores entre 200 y 400
pelota.w = 20;
pelota.h = 20;
// Reiniciamos score de los jugadores
numero1 = 0;
numero2 = 0;
sprintf (Texto1,"%d", numero1);
PTexto1 = TTF_RenderText_Shaded(Fuente1,Texto1,FgColor,BgColor);
sprintf (Texto2,"%d", numero2);
PTexto2 = TTF_RenderText_Shaded(Fuente1,Texto2,FgColor,BgColor);
}
// Comprobando teclas de movimiento
// Comprobando direcciones de Jugadores con Pared
if(evento.key.keysym.sym == SDLK_w) // Si se oprime arriba
{
Vel_Jugador1 = -20;
}
if(evento.key.keysym.sym == SDLK_s) // Si se oprime abajo
{
Vel_Jugador1 = 20;
}
if(evento.key.keysym.sym == SDLK_UP) // Si se oprime derecha
{
Vel_Jugador2 = -20;
}
if(evento.key.keysym.sym == SDLK_DOWN) // Si se oprime izquierda
{
Vel_Jugador2 = 20;
}
}
// Velocidades estandar
jugador1.y += Vel_Jugador1;
jugador2.y += Vel_Jugador2;
pelota.y += Vel_PelotaY;
pelota.x += Vel_PelotaX;
// Colisiones y direcciones
// Comprobando la direccion de cada cuadro y colision con pantalla
// Colisiones Pelota con Pared
if( pelota.y < (barra_superior.y + barra_superior.h) )
{
Vel_PelotaY = 20;
}
if((pelota.y + pelota.h + Vel_PelotaY) >= barra_inferior.y)
{
Vel_PelotaY = -20;
}
if( pelota.x < 20 )
{
Vel_PelotaX = 20;
numero1++;
sprintf (Texto1,"%d", numero1);
PTexto1 = TTF_RenderText_Shaded(Fuente1,Texto1,FgColor,BgColor);
}
if((pelota.x + pelota.w + Vel_PelotaX) >= tam_x+10)
{
Vel_PelotaX = -20;
numero2++;
sprintf (Texto2,"%d", numero2);
PTexto2 = TTF_RenderText_Shaded(Fuente1,Texto2,FgColor,BgColor);
}
// Comprobando colisiones de barra de Jugador 1
if(jugador1.y < (barra_superior.y + barra_superior.h))
{
jugador1.y = barra_superior.y + barra_superior.h;
}
if( (jugador1.y+jugador1.h) > barra_inferior.y)
{
jugador1.y -= 20;
}
// Comprobando colisiones de barra de Jugador 1
if(jugador2.y < (barra_superior.y + barra_superior.h))
{
jugador2.y = barra_superior.y + barra_superior.h;
}
if( (jugador2.y+jugador1.h) > barra_inferior.y)
{
jugador2.y -= 20;
}
// Colisiones Pelota - Barras
// Pelota VS Barra Jugador 1
if( ( (pelota.y+pelota.h) >= jugador1.y) &&
pelota.y <= (jugador1.y+jugador1.h) )
{
if( (jugador1.x + jugador1.w) > pelota.x )
{
Vel_PelotaX = 20;
}
}
// Pelota VS Barra Jugador 2
if( ( (pelota.y+pelota.h) >= jugador2.y) &&
pelota.y <= (jugador2.y+jugador2.h) )
{
if( (pelota.x+pelota.h) > jugador2.x )
{
Vel_PelotaX = -20;
}
}
//Apply the images to the screen
apply_surface( 300, 200, PTexto1, pantalla );
apply_surface( 300, 200, PTexto2, pantalla );
//Liberamos la Surface PTexto para la siguiente vez que la necesitemos.
//SDL_FreeSurface(PTexto);
SDL_FillRect(pantalla, 0, SDL_MapRGB(pantalla->format, 0, 0, 0)); // pintando la pantalla
SDL_BlitSurface(PTexto1,NULL,pantalla,&PosyTexto1);
SDL_BlitSurface(PTexto2,NULL,pantalla,&PosyTexto2);
SDL_BlitSurface(PTextoPONG,NULL,pantalla,&PosyTextoPONG);
SDL_BlitSurface(PTextoCreditos,NULL,pantalla,&PosyTextoCreditos);
SDL_FillRect(pantalla, &jugador1, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando el jugador1
SDL_FillRect(pantalla, &jugador2, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando el jugador2
SDL_FillRect(pantalla, &pelota, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando la pelota
SDL_FillRect(pantalla, &barra_superior, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando la barra superior
SDL_FillRect(pantalla, &barra_inferior, SDL_MapRGB(pantalla->format, 255, 255, 255)); // pintando la barra inferior
barra_vertical.y = 20;
for(int i=0; i<10; i++)
{
// pintando la barra vertical
barra_vertical.y += 40;
SDL_FillRect(pantalla, &barra_vertical, SDL_MapRGB(pantalla->format, 255, 255, 255));
}
SDL_Flip(pantalla);
SDL_Delay(30);
}
}
//apply_surface function
void apply_surface (int x, int y,
SDL_Surface* source, SDL_Surface* destination)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;
SDL_BlitSurface (source, NULL, destination, &rect);
}
Siento que estoy logrando una meta, casi me dan ganas de brincar en una pata y llorar de la dicha, ya se que es solo un jueguito basico, pero es mio!!!!!! XDDDD
Nuevamente hasta que no tenga bien avazando el proyecto no genero ejecutables para linux y windows.
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
No lo puedo probar porque no tengo las fuentes...
Eso si:
Este es el mayor defecto de tu código (tiene muchas sentencias repetidas así:
¡Suerte! Que ya terminas ^^
Eso si:
que falta organizar codigo en funciones para hacerlo más practico, pero eso lo hare al final cuando tenga eventos por mouse y la IA listos para el juego.
Este es el mayor defecto de tu código (tiene muchas sentencias repetidas así:
- Código:
// Pelota VS Barra Jugador 1
if( ( (pelota.y+pelota.h) >= jugador1.y) &&
pelota.y <= (jugador1.y+jugador1.h) )
{
if( (jugador1.x + jugador1.w) > pelota.x )
{
Vel_PelotaX = 20;
}
}
// Pelota VS Barra Jugador 2
if( ( (pelota.y+pelota.h) >= jugador2.y) &&
pelota.y <= (jugador2.y+jugador2.h) )
{
if( (pelota.x+pelota.h) > jugador2.x )
{
Vel_PelotaX = -20;
}
}
¡Suerte! Que ya terminas ^^
amchacon- Admin
- Mensajes : 171
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
lo se lo se, aun no se muy bien como reutilizar codigo y cosas asi, eso va ligado a estructuras y pues no se como hacerlo digamos "en terminos practicos"
maldita sea las fuentes...
ok vale mira:
[Tienes que estar registrado y conectado para ver este vínculo]
Viejo ayudame a trabajar con la IA, no se como hacerlo, en esencia si, pero como algoritmo, no se me ocurre nada elegante, como puedo hacer que la barra se mueva pero sin que sea imposible de vencer?? debo añadir velocidad a la pelota pero en que direccion, X/Y o ambas?? o como lo trabajaria???
lo del mouse fue bastante facil, SDL es un regalo de los dioses la verdad
maldita sea las fuentes...
ok vale mira:
[Tienes que estar registrado y conectado para ver este vínculo]
Viejo ayudame a trabajar con la IA, no se como hacerlo, en esencia si, pero como algoritmo, no se me ocurre nada elegante, como puedo hacer que la barra se mueva pero sin que sea imposible de vencer?? debo añadir velocidad a la pelota pero en que direccion, X/Y o ambas?? o como lo trabajaria???
lo del mouse fue bastante facil, SDL es un regalo de los dioses la verdad
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Mi opinión: Juego muy rápido, las física no es muy convincente (si lo golpeas con un extremo de la barra, debería ir más rápido que golpeandolo desde el centro)... Soy un poco crítico pero aver
Y hablando de física, la pelota/barra van muy rápido
Y = (VelY*VelX/(TamX-BolaX)+BolaY)
Con esta fórmula puedes optener en que coordenada Y llegará la pelota (VelY, VelX corresponden a la velocidad de la pelota, Tamx corresponde al tamaño de la pantalla/campo).
Una vez que tienes la posición donde va a caer, tienes que desplazar la barra a esa posición, pero no la muevas al instante, en cada iteración se vaya moviendo una determinada cantidad (que será su velocidad). Si la barra está en un extremo y le lanzas la pelota al otro extremo no le dará tiempo a llegar y le marcaras
PD: Te dije que el pong era complicado ^^
Y hablando de física, la pelota/barra van muy rápido
SDL es un regalo de los dioses? Pues tienes que probar SFML (te hace casi todo y sin necesidad de instalar 500 expansiones extras ).dato000 escribió:lo del mouse fue bastante facil, SDL es un regalo de los dioses la verdad
Mira esta formula matemática:dato000 escribió:Viejo ayudame a trabajar con la IA, no se como hacerlo, en esencia si, pero como algoritmo, no se me ocurre nada elegante, como puedo hacer que la barra se mueva pero sin que sea imposible de vencer?? debo añadir velocidad a la pelota pero en que direccion, X/Y o ambas?? o como lo trabajaria???
Y = (VelY*VelX/(TamX-BolaX)+BolaY)
Con esta fórmula puedes optener en que coordenada Y llegará la pelota (VelY, VelX corresponden a la velocidad de la pelota, Tamx corresponde al tamaño de la pantalla/campo).
Una vez que tienes la posición donde va a caer, tienes que desplazar la barra a esa posición, pero no la muevas al instante, en cada iteración se vaya moviendo una determinada cantidad (que será su velocidad). Si la barra está en un extremo y le lanzas la pelota al otro extremo no le dará tiempo a llegar y le marcaras
PD: Te dije que el pong era complicado ^^
amchacon- Admin
- Mensajes : 171
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
No conozco SFML... sera así de bueno, bueno, supongo que ya tengo otro para aprender, añadiendo a la lista junto con SDL, Allegro, OpenGL, Android, ahora, SFML
Vale bajare la velocidad, pero lo de la fisica, esta un poco por encima de mis posibilidades, para ser un primer juego, es aceptable, hey no le pidas tanto a un novato que experimenta las posibilidades XD
Ven puedes decir algo sobre el movimiento de la barra 2, para que sea automatico que recomiendas, un movimiento aleatorio o que intente seguir la pelota (cuadrada ) supongo que teniendo esa parte lista comenzare a organizar mejor el codigo.
Vale bajare la velocidad, pero lo de la fisica, esta un poco por encima de mis posibilidades, para ser un primer juego, es aceptable, hey no le pidas tanto a un novato que experimenta las posibilidades XD
Ven puedes decir algo sobre el movimiento de la barra 2, para que sea automatico que recomiendas, un movimiento aleatorio o que intente seguir la pelota (cuadrada ) supongo que teniendo esa parte lista comenzare a organizar mejor el codigo.
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Señores con mucho orgullo he pulido un poco (solo un poco, realmente no se como trabajar bien tanta referencia para funciones) el codigo y ahora esta mucho mejor de verdad.
Señores la IA y la fisica realmente la estudiare en los siguientes juegos y cuando entienda bien todo esto actualizare mi pong con imagenes y toda la onda, pero de momento considero este el primer juego que he realizado esta hecho, aceptablemente, he puesto bastante empeño, y creo que puedo avanzar.
Pequeñas correcciones
1. Añadi una libreria de apoyo para cargar todos los datos, asi tambien los que inician SDL
2. El jugador 2 se mueve automaticamente rebotando con las paredes
3. Añadi una pausa al juego cuando alguno de los jugadores hace un punto, y se reinicia la posicion de la pelotita para que inicie una nueva ronda desde la barra vertical
4. Reduci un poco la velocidad para que se vea más agradable el movimiento, aunque aun no se hacer que digamos, se vea fluido como en los pongs online
5. Cambie el tamaño del tablero, asi es más comodo jugar, aunque uno se aburre rapidamente de este "juego", pero bueno XD
Ayyy señores este es mi juego para el reto, lastima que kaltorak desaparecio y nadie más siguio por aqui, tenemos que realizar otra jornada de reclutamiento, a lo mejor alguien se anima luego, si señor, yo si sigo, tengo toda una vida para hacerme un juego decente tipo SNES y luego un batman arkham asylum XD
Señores la IA y la fisica realmente la estudiare en los siguientes juegos y cuando entienda bien todo esto actualizare mi pong con imagenes y toda la onda, pero de momento considero este el primer juego que he realizado esta hecho, aceptablemente, he puesto bastante empeño, y creo que puedo avanzar.
Pequeñas correcciones
1. Añadi una libreria de apoyo para cargar todos los datos, asi tambien los que inician SDL
2. El jugador 2 se mueve automaticamente rebotando con las paredes
3. Añadi una pausa al juego cuando alguno de los jugadores hace un punto, y se reinicia la posicion de la pelotita para que inicie una nueva ronda desde la barra vertical
4. Reduci un poco la velocidad para que se vea más agradable el movimiento, aunque aun no se hacer que digamos, se vea fluido como en los pongs online
5. Cambie el tamaño del tablero, asi es más comodo jugar, aunque uno se aburre rapidamente de este "juego", pero bueno XD
[Tienes que estar registrado y conectado para ver este vínculo]
src: [Tienes que estar registrado y conectado para ver este vínculo]
src: [Tienes que estar registrado y conectado para ver este vínculo]
Ayyy señores este es mi juego para el reto, lastima que kaltorak desaparecio y nadie más siguio por aqui, tenemos que realizar otra jornada de reclutamiento, a lo mejor alguien se anima luego, si señor, yo si sigo, tengo toda una vida para hacerme un juego decente tipo SNES y luego un batman arkham asylum XD
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Pues sí, está bastaaaante mejor
Algunas críticas:
Los mensajes de error se simbolizan devolviendo un número distinto de cero (1,2,3,4...). El cero es para simbolizar una salida exitosa.
Para compensar la velocidad aumenta el delay
Algunas críticas:
- Código:
retorno = inicio();
if(retorno == 1)
{
return 0;
}
Los mensajes de error se simbolizan devolviendo un número distinto de cero (1,2,3,4...). El cero es para simbolizar una salida exitosa.
En vez de mover de 20 en 20, mueve de 5 en 5 o de 2 en 2dato000 escribió:4. Reduci un poco la velocidad para que se vea más agradable el movimiento, aunque aun no se hacer que digamos, se vea fluido como en los pongs online
Para compensar la velocidad aumenta el delay
amchacon- Admin
- Mensajes : 171
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Muy chulo el pong Dato000 hay que pulirlo un poco pero esta genial.
Como llevas el Snake??
Como llevas el Snake??
kaltorak- Admin
- Mensajes : 178
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
amchacon escribió:Pues sí, está bastaaaante mejor
Algunas críticas:
- Código:
retorno = inicio();
if(retorno == 1)
{
return 0;
}
Los mensajes de error se simbolizan devolviendo un número distinto de cero (1,2,3,4...). El cero es para simbolizar una salida exitosa.En vez de mover de 20 en 20, mueve de 5 en 5 o de 2 en 2dato000 escribió:4. Reduci un poco la velocidad para que se vea más agradable el movimiento, aunque aun no se hacer que digamos, se vea fluido como en los pongs online
Para compensar la velocidad aumenta el delay
What??? me quedo muy lento así, no seria que para que el delay compensara seria bajarlo, como decias el fps pues se jode no?? aún no se muy bien como hacer movimientos suavizado, pero va poco a poco
kaltorak escribió:Muy chulo el pong Dato000 hay que pulirlo un poco pero esta genial.
Como llevas el Snake??
No tan bien, no se como carajos puedo implementar la cola de la serpiente, mirando el código de amchacon simplemente me quedo perdido, pues usa clases y eso no lo manejo muy bien (triste cierto) he tratado de hacerlo como el sensei paueky con listas...pero maldita sea no me sale no me sale, estoy seguro que con un poco más de tiempo y dedicación podre originar uno mejor que el que digamos, tengo en mi celular, un asco en serio, ese si que esta muy mal hecho, estoy seguro que podre hacerlo mejor.
Pero me jode el saber como crear una cola que siga la cabeza (de hecho, me conformo con saber como crear una cola que se mueva, asi sea un movimeinto de izquierda a derecha, eso sería bastante para mi) pero bueno, lo realizare con listas, que generen nuevos cuadros sdl_rect...
no creo que lo tenga para julio, he estado ocupado con las cosas de la universidad, pero yo sigo trabajando.
PD: DONDE ANDABAS K!?!?!?!??! QUE TE PASO VIEJO!!!!
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Bajar velocidad y subir delay.dato000 escribió:What??? me quedo muy lento así, no seria que para que el delay compensara seria bajarlo, como decias el fps pues se jode no?? aún no se muy bien como hacer movimientos suavizado, pero va poco a poco
La idea esque se vea el desplazamiento del objeto y no vaya "a saltos".
¿Quieres un snake sencillo? Aquí tienes uno que no está orientado a objetos:dato000 escribió:kaltorak escribió:Muy chulo el pong Dato000 hay que pulirlo un poco pero esta genial.
Como llevas el Snake??
No tan bien, no se como carajos puedo implementar la cola de la serpiente, mirando el código de amchacon simplemente me quedo perdido, pues usa clases y eso no lo manejo muy bien (triste cierto) he tratado de hacerlo como el sensei paueky con listas...pero maldita sea no me sale no me sale, estoy seguro que con un poco más de tiempo y dedicación podre originar uno mejor que el que digamos, tengo en mi celular, un asco en serio, ese si que esta muy mal hecho, estoy seguro que podre hacerlo mejor.
Pero me jode el saber como crear una cola que siga la cabeza (de hecho, me conformo con saber como crear una cola que se mueva, asi sea un movimeinto de izquierda a derecha, eso sería bastante para mi) pero bueno, lo realizare con listas, que generen nuevos cuadros sdl_rect...
no creo que lo tenga para julio, he estado ocupado con las cosas de la universidad, pero yo sigo trabajando.
PD: DONDE ANDABAS K!?!?!?!??! QUE TE PASO VIEJO!!!!
- Código:
#include <allegro.h>
#define TEC_ARRIBA_1 KEY_W
#define TEC_ABAJO_1 KEY_S
#define TEC_IZQDA_1 KEY_A
#define TEC_DCHA_1 KEY_D
const int RESOLUCIONX = 640;
const int RESOLUCIONY = 480;
const int POSICIONINICIALX = RESOLUCIONX/2;
const int POSICIONINICIALY = RESOLUCIONY/2;
const int MOVIMIENTOX = 1;
const int MOVIMIENTOY = 0;
const int LONGITUDINICIAL = 50;
const int COLOR1 = 12;
int DELAY = 8;
const int CRECIMIENTO = 50;
const int COMIDA = 14;
const int TAMANYO_COMIDA = 10;
// Las posiciones aquí van por vectores, pues es importante que tenga todas las posiciones guardadas para irlas eliminando conofrme crezca la serpiente
struct Vehiculo
{
int X[10000],Y[10000],MovimientoX,MovimientoY,Longitud;
};
void init();
void deinit();
int main() {
init();
Vehiculo Jugador1;
int Color;
int Comida = 0;
char tecla;
srand(time(0));
int Comida_POSICIONX = rand() % RESOLUCIONX+1;
int Comida_POSICIONY = rand() % RESOLUCIONY+1;
Jugador1.Longitud = LONGITUDINICIAL;
for (int i = 0; i < LONGITUDINICIAL; i++)
{
Jugador1.X[i] = POSICIONINICIALX-i;
Jugador1.Y[i] = POSICIONINICIALY-i;
}
Jugador1.MovimientoX = MOVIMIENTOX;
Jugador1.MovimientoY = MOVIMIENTOY;
Jugador1.Longitud = LONGITUDINICIAL;
circle(screen,Comida_POSICIONX,Comida_POSICIONY,TAMANYO_COMIDA,palette_color[COMIDA]);
while (!key[KEY_ESC])
{
// COLISIONES
Color = getpixel(screen,Jugador1.X[0]+Jugador1.MovimientoX, Jugador1.Y[0]+Jugador1.MovimientoY);
if (Color != 0 && Color != palette_color[COMIDA] && Color != palette_color[15])
{
textout(screen,font,"Has perdido",100,100,palette_color[10]);
readkey();
readkey();
readkey();
break;
}
// Comprobar Comida
if (Color == palette_color[COMIDA])
{
Comida++;
Jugador1.Longitud += CRECIMIENTO;
circle(screen,Comida_POSICIONX,Comida_POSICIONY,TAMANYO_COMIDA,0);
srand(time(0));
Comida_POSICIONX = rand() % RESOLUCIONX+1;
Comida_POSICIONY = rand() % RESOLUCIONY+1;
circle(screen,Comida_POSICIONX,Comida_POSICIONY,TAMANYO_COMIDA,palette_color[COMIDA]);
}
// MOVER
// Borrar Rastros
putpixel(screen, Jugador1.X[Jugador1.Longitud-1], Jugador1.Y[Jugador1.Longitud-1],0);
// Recalculamos posiciones
for (int i = Jugador1.Longitud; i > 0;i--)
{
Jugador1.X[i] = Jugador1.X[i-1];
Jugador1.Y[i] = Jugador1.Y[i-1];
}
// Movemos
Jugador1.X[0] += Jugador1.MovimientoX;
Jugador1.Y[0] += Jugador1.MovimientoY;
putpixel (screen, Jugador1.X[0], Jugador1.Y[0],palette_color[COLOR1]);
// IGUAL QUE EN EL DE LAS MOTOS (^^)
if ( keypressed() )
{
tecla = readkey() >>8;
switch(tecla)
{
case TEC_ARRIBA_1:
if(Jugador1.MovimientoY == 0) // Nos vamos arriba, siempre que no estuvieramos yendo arriba o abajo
{
Jugador1.MovimientoX = 0; Jugador1.MovimientoY = -1;
}
break;
case TEC_ABAJO_1:
if(Jugador1.MovimientoY == 0) // Nos vamos abajo, siempre que no estuvieramos yendo arriba o abajo
{
Jugador1.MovimientoX = 0; Jugador1.MovimientoY = 1;
}
break;
case TEC_IZQDA_1:
if(Jugador1.MovimientoX == 0) // Proceso identico
{
Jugador1.MovimientoX = -1; Jugador1.MovimientoY = 0;
}
break;
case TEC_DCHA_1:
if(Jugador1.MovimientoX == 0)
{
Jugador1.MovimientoX = 1; Jugador1.MovimientoY = 0;
}
break;
case KEY_J:
if (DELAY != 1)
DELAY--;
break;
}
}
textprintf(screen,font,5,5,palette_color[15],"Longitud: %d",Jugador1.Longitud);
textprintf(screen,font,5,15,palette_color[15],"Comida: %d",Comida);
textprintf(screen,font,5,25,palette_color[15],"Delay: %d",DELAY);
rest (DELAY);
}
deinit();
return 0;
}
END_OF_MAIN()
void init() {
int depth, res;
allegro_init();
depth = desktop_color_depth();
if (depth == 0) depth = 32;
set_color_depth(depth);
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, RESOLUCIONX, RESOLUCIONY, 0, 0);
if (res != 0) {
allegro_message(allegro_error);
exit(-1);
}
install_timer();
install_keyboard();
install_mouse();
/* add other initializations here */
}
void deinit() {
clear_keybuf();
/* add other deinitializations here */
}
amchacon- Admin
- Mensajes : 171
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Nada que en el curro me han metido más horas este mes y por eso he estado fuera pero ya he vuelto así que ahora a darle caña.
Animo que seguro que eres capaz de hacer el Snake.
Animo que seguro que eres capaz de hacer el Snake.
kaltorak- Admin
- Mensajes : 178
Fecha de inscripción : 30/05/2013
Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--
Pues por estar trabajando en otras cosas no he podido iniciar el proyecto para hacer mi snake, tengo pensado hacer algunas cosas bien buenas, sin embargo aun no entiendo las colas, jejeje, o mejor dicho, no he tenido tiempo para entenderlo.
Intente instalar allegro pero me dio problemas, y no pude compilar el codigo que me dejaste amchacon, sin embargo aprecio el detalle y vio una que otra cosa, iniciar todas las funciones aparte por defecto para la libreria es muy buena idea, ya lo tenia pensado, pero eso me dio la claridad para hacerlo.
En fin, en unos dias veremos si hay avances, como van uds??
Intente instalar allegro pero me dio problemas, y no pude compilar el codigo que me dejaste amchacon, sin embargo aprecio el detalle y vio una que otra cosa, iniciar todas las funciones aparte por defecto para la libreria es muy buena idea, ya lo tenia pensado, pero eso me dio la claridad para hacerlo.
En fin, en unos dias veremos si hay avances, como van uds??
dato000- Admin
- Mensajes : 161
Fecha de inscripción : 30/05/2013
Temas similares
» Solicito gráficos para juego
» Juego para el concurso del grupo
» Conflicto en juego de naves
» PONG: ya casi!!! me ayudan a darle estilo???
» PONG: no consigo realizar correctamente la colision de la bolita (SOLUCIONADO)
» Juego para el concurso del grupo
» Conflicto en juego de naves
» PONG: ya casi!!! me ayudan a darle estilo???
» PONG: no consigo realizar correctamente la colision de la bolita (SOLUCIONADO)
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.