Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Ver el tema anterior Ver el tema siguiente Ir abajo

Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Vie Jul 12, 2013 3:31 pm

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.




[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 afro afro 

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

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por amchacon el Sáb Jul 13, 2013 9:57 pm

Ahora mismo estoy en el movil, mañana vuelvo a casa y comento.
avatar
amchacon
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por amchacon el Lun Jul 15, 2013 4:23 am

Uf, hay mucha capuza de por medio (no te preocupes, todos lo hacemos Very Happy ).

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;
        }
¿Para que necesitas dirreción? Ponlo directamente dentro del if:

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 Shocked . 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).

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!!
Ya usas doble buffer:
Código:
SDL_SetVideoMode(tam_x, tam_y, profundidad_color,
                                           SDL_SWSURFACE|SDL_DOUBLEBUF);

//...

 SDL_Flip(pantalla);
avatar
amchacon
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Mar Jul 16, 2013 4:36 pm

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

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Jue Jul 18, 2013 4:41 pm

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.



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.

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por amchacon el Jue Jul 18, 2013 6:53 pm

No lo puedo probar porque no tengo las fuentes...

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 ^^
avatar
amchacon
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Jue Jul 18, 2013 7:13 pm

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 Razz Razz 

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por amchacon el Vie Jul 19, 2013 10:39 am

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 Evil or Very Mad 

Y hablando de física, la pelota/barra van muy rápido Very Happy 

dato000 escribió:lo del mouse fue bastante facil, SDL es un regalo de los dioses la verdad Razz Razz 
SDL es un regalo de los dioses? Pues tienes que probar SFML (te hace casi todo y sin necesidad de instalar 500 expansiones extras Very Happy ).

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???
Mira esta formula matemática:

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 Wink

PD: Te dije que el pong era complicado ^^
avatar
amchacon
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Vie Jul 19, 2013 1:28 pm

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 Smile) supongo que teniendo esa parte lista comenzare a organizar mejor el codigo.

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Vie Jul 19, 2013 3:42 pm

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



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

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por amchacon el Sáb Jul 20, 2013 8:52 pm

Pues sí, está bastaaaante mejor Very Happy 

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.

dato000 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
En vez de mover de 20 en 20, mueve de 5 en 5 o de 2 en 2 Very Happy 

Para compensar la velocidad aumenta el delay

avatar
amchacon
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por kaltorak el Lun Jul 22, 2013 1:29 am

Muy chulo el pong Dato000 hay que pulirlo un poco pero esta genial.

Como llevas el Snake??


_________________

avatar
kaltorak
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Lun Jul 22, 2013 3:56 pm

amchacon escribió:Pues sí, está bastaaaante mejor Very Happy 

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.

dato000 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
En vez de mover de 20 en 20, mueve de 5 en 5 o de 2 en 2 Very Happy 

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!!!!

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por amchacon el Lun Jul 22, 2013 5:28 pm

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
Bajar velocidad y subir delay.

La idea esque se vea el desplazamiento del objeto y no vaya "a saltos".

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!!!!
¿Quieres un snake sencillo? Aquí tienes uno que no está orientado a objetos:

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 */
}
avatar
amchacon
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por kaltorak el Mar Jul 23, 2013 8:03 am

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.



_________________

avatar
kaltorak
Admin

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

Ver perfil de usuario

Volver arriba Ir abajo

Re: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por dato000 el Dom Jul 28, 2013 1:55 pm

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??

_________________


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: Mi juego para el reto: PONG --Estado: ALPHA n00b!!!--

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

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