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.
Voy a ver si te lo miro, por cierto no serás brasileño no ?! ;D
No, soy catalán xD
Gracias por mirarlo :D
Bienvenido al foro, espero que disfrutes de la estancia y que se te resuelva el problema pronto.
....¿nos conocemos? ;D
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)))
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...
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.
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.
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
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.
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
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
.......
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 :)
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.
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
Ya he echo el modulo beep para que puedas poner sonidos en tu Pong igualitos a los del juego original sin utilizar recursos :)
Te lo digo para hacer publicidad a mi fantastico mod, hhehehehe, y que lo utilizes en tu super juego :)
Descargatelo en su post.
Ya se me muestran en pantalla, pero no se actualizan...
Estos son los cambios que he hecho, tal y como me has dicho:
Quoteint score1 = 0;
int score2 = 0;
write_int(0,270,20,1,&score1);
write_int(0,330,20,1,&score2);
Frame;
if(X_Bola<-1)
score2 = score2+1;
Frame;
End
if(X_Bola>641)
score1 = score1+1;
Frame;
End
Y lo de la música no lo he encontrado xd Si me puedes pasar el link...
Y muchas gracias por la ayuda.
Lo de los Beeps, es esta la página:
http://forum.bennugd.org/index.php?topic=1197.0 (http://forum.bennugd.org/index.php?topic=1197.0)
sobre tu problema, pasame el código completo que te lo miro cuando llegue a casa, igual alguna pequeña chorradilla esta haciendo que no se actualize.
Toqueteando los
Quote
if(X_Bola<=-1)
score2 = score2+1;
Frame;
End
if(X_Bola>=641)
score1 = score1+1;
Frame;
, poniendo ese =, se me actualiza solo una vez, solo uno de los dos jugadores, y con dos puntos.
Bueno, te dejo el código entero:
QuoteProgram MEUPONG;
Global
int RESOLUCION_X;
int RESOLUCION_Y;
// VARIABLES GLOBALS
int Velocidad_Paletas;
int score1 = 0;
int score2 = 0;
// CARACTERÍSTIQUES DE LA PALETA 1
int X_Paleta_1;
int Y_Paleta_1;
int Ancho_Paleta_1;
int Alto_Paleta_1;
int color_paleta_1;
// CARACTERÍSTIQUES DE LA PALETA 2
int X_Paleta_2;
int Y_Paleta_2;
int Ancho_Paleta_2;
int Alto_Paleta_2;
int color_paleta_2;
// CARACTERÍSTIQUES DE LA 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
// INICIALITZAR ASPECTES GRÀFICS
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;
//ESCRIURE INFORMACIÓ SOBRE EL JOC EN PANTALLA
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);
write_int(0,270,20,1,&score1);
write_int(0,330,20,1,&score2);
Frame;
// HEM ACABAT D' INICIALITZAR, LLANCEM EL BUCLE PRINCIPAL
Controlador_Juego(); //Arranquem el controlador del joc
END
/////////////////////////////////////////////
// Controlador de joc
Process Controlador_Juego()
BEGIN
Inicializar();
Loop // Bucle principal
If(key(_esc)) // Si s' apreta esc
exit(0,0); // Sortir del joc
End
Actualizar();
Dibujar();
Frame; // Refrescar pantalla
End // Del loop
END
//////////////////////////////////////////////
//Inicialitza el joc en el seu estat inicial
Process Inicializar()
BEGIN
Velocidad_Paletas = 5;
// INICIALITZAR LA PALETA 1
X_Paleta_1=30;
Y_Paleta_1=240;
Ancho_paleta_1=20;
Alto_Paleta_1=100;
// INICIALITZAR LA PALETA 2
X_Paleta_2=610;
Y_Paleta_2=240;
Ancho_paleta_2=20;
Alto_Paleta_2=100;
// INICIALITZAR BOLA
X_Bola=320;
Y_Bola=240;
Ancho_Bola=15;
Alto_Bola=15;
Velocidad_Bola_X = 3;
Velocidad_Bola_Y = 3;
max_velocidad = 5;
max_velocidad = 5;
END
//////////////////////////////////////////////
// Dibuixa els elements del joc en pantalla
Process Dibujar()
Begin
clear_screen();
drawing_map(0,0);
// Dibuixar 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);
// Dibuixar 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);
// DIBUIXAR 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
/////////////////////////////////////////////
//Actualitza la llògica del joc
Process Actualizar()
Begin
// ACTUALITZAR PALETA 1
if(key(_k) 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(_m) 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
// ACTUALITZAR PALETA 2
if(key(_up) 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(_down) 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
if(X_Bola<=-1)
score2 = score2+1;
Frame;
End
if(X_Bola>=641)
score1 = score1+1;
Frame;
End
Control_Bola();
End
//////////////////////////////////////////////
// ACTUALITZA LA LLÒGICA DE LA BOLA
Process Control_Bola()
Begin
// COL·LISIONS AMB LA 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
// COL·LISIONS AMB LA 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
//COL·LISIONS AMB LES 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;
// Condicions de la Bola
if(X_Bola>641 or X_Bola<-1)
X_Bola=320;
End
End
Y los beeps no sé como ponerlos, no tengo ni la más menor idea de lo que es esto que mencionas: 'bgdc.import'
xD
a ver, el módulo beep que te dicen es para BennuGD, que es un programa parecido a fenix pero modular.
Veo que tu código es para fenix, te recomendaría que cambiases a bennuGD si quieres usar todas sus mejoras y nuevos módulos y empezaras a leerte los tutoriales de windgate y de osk.
http://iespuigcastellar.xeill.net/departaments/informatica/fitxers/programacio/manualbennu.pdf
http://trinit.es/tutoriales/
En estos puedes ver muchos ejemplos de juegos y técnicas de programación de juegos.
Para que te funcione, cambia los if's por estos:
if(X_Bola<=0)
score2 = score2+1;
End
if(X_Bola>=640)
score1 = score1+1;
End
Tienes cosas muy raras en tus juego, empezando por divisiones que sobran y definiciones con valores raros, a ver si alguien con tiempo te lo repasa todo y te lo corrige.
Gracias ;D
Lo de los valores raros, pues entre que acabo de empezar, y usé un tutorial rarillo, pues... xD
Y sobre pasarme a Bennu, ya pensaba hacerlo al acabar el pong, viendo que todos lo usáis y es mejor...
Por cierto, hay algun método establecido por hacer pausas en los juegos? Es que lo he estado probando haciendo que la velocidad de la bola puera 0 al pulsar el botón P, pero me da error y me hace pensar que al restablecerlo quizás salga disparado hacia otro lado.
Si lo hay, basicamente es hacer que el proceso padre se congele, leete el ManualBennu que te han puesto, esas cosillas se explican en estos tutoriales, mirate la parte donde se hable de procesos, que te pone todas las opciones permitidas, desde matar procesos a congelarlos, despertarlos, etc. y en estas cosas lo mejor es que lo estudies antes un poco, ya que estas nociones no son dudas pero si el minimo de cosas que debes aprender de Bennu antes de empezar a programar ;D
De todas formas ¿qué tutorial es el que estás usando? porque no conozco ninguno para Fenix/Bennu que haga un pong de esa manera, desaprovechando la potencia de los procesos.
pues haberlos, haylos, los primero de osk son así, sin ir más lejos, el tetris que me pasó que dió lugar al proyecto apagame.
El tutorial que estaba usando era uno que usaba Fenix sólo en el primer capítulo, después se pasaba a C, y por eso he tenido esos problemas, porque me ha dejado colgado. Pero he empezado a pasarme a Bennu con el tutorial que me habeis pasado, y ya pasaré mi pong a Bennu, también.
No tienes que pasarlo porque ya esta en Bennu :) Yo lo he probado con Bennu, hace años que no toco nada en Fenix ;D
Es que me dice que no identifica ''FPS''...
es por lo que te comentaban de un fichero llamado "bgdc.import".
Bennu, a diferencia de Fenix, es modular.
En resumidas cuentas, en bennu necesitas indicar los módulos que vas a usar en tu programa para que así conozca donde están funciones, variables y constantes que vas a ir usando.
Tienes varias opciones para hacer esto. La primera es crear un archivo bgdc.import en el directorio de tu mismo .prg y en este archivo ir metiendo los módulos que necesita tu programa, mucha gente mete en este archivo todos los módulos que existen en bennu :D.
el archivo tendría un formato como este
Quote from: bgdc.import
mod_key
mod_proc
mod_say
mod_mouse
mod_video
mod_regex
mod_map
otra opción es dentro de tu prg, al principio del todo escribes una palabra reservada para indicar el módulo a usar.
Seria poner algo así al principo de tu prg
import "mod_key";
import "mod_map";
import "mod_video";
import "mod_regex";
import "mod_mouse";
Vamos pero que todo esto viene explicado en ambos tutoriales, míralos por encima antes de meterte en brea, sino las vas a pasar canutas y te vas a ir desmotivando.
tienes que importar los modulos que necesitas (mod_video, etc)
.... mirate como hacer un primer programa de bennu en el tutorial.
El tema de las .dll no lo trato en mi tutorial (Al menos aún no...) porque usa plantillas asociadas a cada tema y terminan metiendo todas las .dll "habituales" sin que tengas que hacer nada. Para todo lo demás, manual de Osk, es MUY recomendable saber importar bien las .dll necesarias, son el alpha y el omega de Bennu.
Ahora mismo no puedo estar mucho por el tema, pero el lunes acabo exámenes y me puedo poner de nuevo, a machacar con los tutoriales ;D