Problema con el juego

Started by Garreny, February 21, 2010, 05:01:18 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Garreny

Bien, ante todo, decir que me han recomendado este foro para exponer mis problemas, y se os ve tan enterados que voy a aprovecharme  ;D
El hecho es que acabo de empezar a programar con fenix, pero me ha surgido un problemilla.
Siguiendo un tutorial que me ha dejado a medias, he hecho un pong, pero tengo un problema con los rebotes. La pelota rebota perfectamente con las paredes superior e inferior, pero no con las palas.
La bola sale disparada hacia la derecha, y tendría que rebotar contra la pala 2, pero no lo hace.
Aquí os dejo el código:



QuoteProgram MEUPONG;
Global

 
  int RESOLUCION_X;
  int RESOLUCION_Y;

  // GLOBALS
  int Velocidad_Paletas;

  // PALETA 1  
  int X_Paleta_1;
  int Y_Paleta_1;
  int Ancho_Paleta_1;
  int Alto_Paleta_1;
  int color_paleta_1;

  // PALETA 2
  int X_Paleta_2;
  int Y_Paleta_2;
  int Ancho_Paleta_2;
  int Alto_Paleta_2;
  int color_paleta_2;

  // BOLA
  int X_Bola;
  int Y_Bola;
  int Ancho_Bola;
  int Alto_Bola;
  int Color_Bola;
  int Velocidad_Bola_X;
  int Velocidad_Bola_Y;
  int max_velocidad;

BEGIN

 

  set_title("El meu primer Pong");
  Full_screen = false;
  Graph_mode = mode_16bits;
  set_mode (m640x480);
  set_fps(80, 60/10);
 
  RESOLUCION_X = 640;
  RESOLUCION_Y = 480;

 
  write(0,10,10,0,"El meu primer Pong, v. 0.01");
  write(0,10,20,0,"Equip Garreny");
  write_int(0,300,10,1,&fps);

 
  Controlador_Juego(); //Arranquem el controlador del joc
END


Process Controlador_Juego()
BEGIN

  Inicializar();

  Loop

     If(key(_esc))  
        exit(0,0);
     End

  Actualizar();
 
  Dibujar();

     Frame;
  End
END



Process Inicializar()
BEGIN

  Velocidad_Paletas = 5;

  // PALETA 1
  X_Paleta_1=30;
  Y_Paleta_1=240;
  Ancho_paleta_1=20;
  Alto_Paleta_1=100;

  // PALETA 2
  X_Paleta_2=610;
  Y_Paleta_2=240;
  Ancho_paleta_2=20;
  Alto_Paleta_2=100;

  // BOLA

  X_Bola=320;
  Y_Bola=240;
  Ancho_Bola=15;
  Alto_Bola=15;
  Velocidad_Bola_X = 1;
  Velocidad_Bola_Y = 1;
  max_velocidad = 3/2;
  max_velocidad = 3/2;

END


Process Dibujar()
Begin

  clear_screen();
  drawing_map(0,0);

  // Paleta 1

  drawing_color(rgb(25,55,255));
  draw_box(X_Paleta_1-Ancho_Paleta_1/2, Y_Paleta_1-Alto_Paleta_1/2, X_Paleta_1+Ancho_Paleta_1/2, Y_Paleta_1+Alto_Paleta_1/2);

  // Paleta 2

  drawing_color(rgb(33,63,212));
  draw_box(X_Paleta_2-Ancho_Paleta_2/2, Y_Paleta_2-Alto_Paleta_2/2, X_Paleta_2+Ancho_Paleta_2/2, Y_Paleta_2+Alto_Paleta_2/2);

  // BOLA
 
  drawing_color(rgb(45,200,5));
  draw_box(X_Bola-Ancho_Bola/2, Y_Bola-Alto_Bola/2, X_Bola+Ancho_Bola/2, Y_Bola+Alto_Bola/2);
 
END



Process Actualizar()
Begin

  // PALETA 1

  if(key(_up) AND Y_Paleta_1-Alto_Paleta_1/2 > 50) //Si s' apreta "amunt" i la paleta no ha arribat fins a dalt
     Y_Paleta_1 -=Velocidad_Paletas; // Fem que pugi
  End

  if(key(_down) AND Y_Paleta_1+Alto_Paleta_1/2 < 430) //Si s' apreta "avall" i la paleta no ha aribat abaix
     Y_Paleta_1 +=Velocidad_Paletas; //Fem que baixi
  End


  // PALETA 2

  if(key(_k) AND Y_Paleta_2-Alto_Paleta_2/2 > 50) //Si s' apreta "amunt" i la paleta no ha arribat fins a dalt
     Y_Paleta_2 -=Velocidad_Paletas; // Fem que pugi
  End

  if(key(_m) AND Y_Paleta_2+Alto_Paleta_2/2 < 430) //Si s' apreta "avall" i la paleta no ha aribat abaix
     Y_Paleta_2 +=Velocidad_Paletas; //Fem que baixi
  End

  Control_Bola();
 
End



Process Control_Bola()
Begin

  // PALETA 1

  if(Velocidad_Bola_X < 0 && X_Bola>X_Paleta_1 && (X_Bola-(Ancho_Bola/2))<=(X_Paleta_1+(Ancho_Paleta_1/2)))

     if(abs(Y_Paleta_1-Y_Bola)<(Alto_Paleta_1/2)+(Alto_Bola/2))
        Velocidad_Bola_X = max_velocidad;
     End

  End

  // PALETA 2

  if(Velocidad_Bola_X > 0 && X_Bola<X_Paleta_2 && (X_Bola+(Ancho_Bola/2))>=(X_Paleta_2+(Ancho_Paleta_2/2)))

     if(abs(Y_Paleta_2-Y_Bola)<(Alto_Paleta_2/2)+(Alto_Bola/2))
        Velocidad_Bola_X = -max_velocidad;
     End

  End

   // PARETS SUPERIOR I INFERIOR

  if(Velocidad_Bola_Y<0 && (Y_Bola-(Ancho_Bola/2))<=50)
     Velocidad_Bola_Y = max_velocidad;
  End
 
  if(Velocidad_Bola_Y>0 && (Y_Bola-(Ancho_Bola/2))>=430)
     Velocidad_Bola_Y =-max_velocidad;
  End


  X_Bola+=Velocidad_Bola_X;
  Y_Bola+=Velocidad_Bola_Y;

End

Muchas gracias de antemano!

EDIT: Me he dado cuenta de que no lo he publicado en el subforo adecuado, si algún moderador puede moverlo... Perdón por las molestias.

FreeYourMind

Voy a ver si te lo miro, por cierto no serás brasileño no ?!  ;D

Garreny

No, soy catalán xD
Gracias por mirarlo  :D

Drumpi

Bienvenido al foro, espero que disfrutes de la estancia y que se te resuelva el problema pronto.

....¿nos conocemos? ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

Iba a decir justo eso.

Mira, para que la bola rebote en la barra 2, cambia el '+' por '-':

if(Velocidad_Bola_X > 0 && X_Bola < X_Paleta_2 && (X_Bola + (Ancho_Bola/2)) >= ( X_Paleta_2 - (Ancho_Paleta_2/2)))

SplinterGU

bienvenido, y aprovecho para invitarte a usar Bennu que tiene muchas mejoras con respecto a Fenix... y quizas aca te demos incluso alguna solucion que no funcione 100% en Fenix, al ser este anterior...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Garreny

Quote from: Drumpi on February 21, 2010, 06:57:43 PM
Bienvenido al foro, espero que disfrutes de la estancia y que se te resuelva el problema pronto.

....¿nos conocemos? ;D
Bien que lo sabes, mi gran resuelvedudas!

Bueno, que puedo decir, muchas gracias a todos, y gracias a FreeYourMind ya rebota!
soy feliz!
Muchas gracias!
Ahora voy a intentar hacer el sistema de puntos y que cuando la pelota se salga, reaparezca.

Windgate

Veo tu código, pero no veo el problema... Podrías usar unos cuantos write_var para controlar los valores de las cosas... Seguramente sea alguna suma en la que deberías restar o algo así, veo que collision ( ) no usas.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Garreny

Sí, era una suma que tenía que restar.

Y bueno, he estado toqueteando y he conseguido hacer reaparecer la bola, pero lo que no consigo es que me salga la puntuación.

Esto es lo que tengo de nuevo, contando que está todo debidamente clasificado, con la variable en su sitio:

   int score[0];


   if(X_Bola>641 or X_Bola<-1)
   X_Bola=320;
   End

   if(X_Bola>641)
   score[0]=score[0]+1;
   End
   
   if(X_Bola>641)
   write_int(0,300,10,1,&score[0]);
   End


   if(X_Bola<-1)
   score[1]=score[1]+1;
   End

   if(X_Bola<-1)
   write_int(0,300,10,1,&score[1]);
   End

FreeYourMind

#9
no tienes que definir un vector de score[0], con int score=0; es suficiente.

if(X_Bola>641)
  score= score + 1;
  End
 
  if(X_Bola>641)
  write_int(0,300,10,1,&score);
  End

En tu caso, score1 para la barra 1 y score2 para la barra 2, así es el pong ;)

Por otra parte sólo tienes que incrementar el score1 o score2 dependiendo del caso, la condicion de escribir cada vez que suma no la tienes que poner, esa ponla al principio del programa en un frame; para que te salga siempre y olvidate de tener que escribir siempre que uno suma puntos.

Garreny

He hecho lo que me has dicho, pero los números siguen sin salirme en pantalla.

   int score1;
   int score2;


   if(X_Bola>641)
   write_int(0,300,10,1,&score1);
   Frame;
   End

   if(X_Bola<-1)
   write_int(0,300,10,1,&score2);
   Frame;
   End


   if(X_Bola<-1)
   score2=score2+1;
   Frame;
   End

   if(X_Bola>641)
   score1=score1+1;
   Frame;
   End   


FreeYourMind

el write no tienes que ponerlo en una condicion, lo tienes que poner siempre en el main y despues olvidate de el ya que ha cada frame se actulizará solito, no tienes que volver a hacer un write en todo el juego, al menos que borres los textos con un delete_text(all_text);, algo así:

GLOBAL

int score1 = 0;
int score2 = 0;

...

BEGIN

set_mode(...)

.....

write_int(0,300,10,1,&score1);
write_int(0,360,10,1,&score2); // Nota: Estabas poniendo los puntos del jugador 2 encima de los del jugador 1 :)
                                          // (cambia las coordenadas x a tu gusto para cada uno)

FRAME;

.....

END

// Procesos.....

tu proceso que donde incrementas los puntos:

....

  if(X_Bola<-1)
   score2=score2+1;
   End

   if(X_Bola>641)
   score1=score1+1;
   End   

.......






FreeYourMind

Lo chulo era que definieras los puntos como has definido las barras, o sea, creando objectos para que quede igual al pong original, con numeros grandes, lo digo porque se puede crear una fuente gigante y utilizarla para eso, pero lo bueno de tu juego es que no has utilizado ningun recurso gráfico, y molaria mucho que completaras el juego sin usarlos, incluso si Bennu permitierá generar sonidos sin cargarlos (tipo beeps), seria fantastico (incluso no has utilizado colisiones lo que mola mucho). Aqui dejo la idea de los beeps para Splinter, ya se que será más complicadillo hacer el sistema de puntos definiendo los numeros por regiones, pero si entre todos te ayudamos lo podrias conseguir (a ver si alguien se anima).

Por cierto, con tu juego, me ha salido la idea de que el siguiente concurso que planean hacer (hablan de ello en otro post), fuera utilizando este tipo de tecnicas, o sea, se prohibiria el total uso de recursos externos, lo que seria bueno para ver en que tamaño podriamos hacer un juego, ya que Bennu es modular, y en un principio evitariamos los modulos no necesarios, con lo cual tu pong es un buen ejemplo para hacer el juego más pequeño en tamaño utilizando Bennu :)

DCelso

Los primeros juegos del proyecto apagame son así, sin recursos gráficos.
Además hay un pong y un arkanoid del que puedes sacar ideas para el tuyo.
Sigue el segundo enlace de mi firma, en el que pone apagame.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Drumpi

Hombre, como poder creo que se podrían crear cualquier tipo de sonidos, el problema es que no se tiene acceso al buffer de sonido igual que se tiene al de cualquier gráfico de memoria.

Es más, por lo que se, un instrumento se puede interpretar como una serie de valores, y usando un proceso inverso al que uso en mi proyecto se puede generar cualquier nota (así es cómo funcionan los MOD, IT, S3M...). Pero bueno, aun no estoy en disposición de decir nada ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)