jored, tengo problemas de colision de la raqueta con respecto a la pelota, algunas veces colisiona pero no rebota...
ahí vá el codigo:
[code language="bennu"]PROGRAM churripong;
INCLUDE "DLL\import.prg"; //Incluye las DLL necesarias para que todo funcione
global
int camb_pant; // cambio de pantalla, cambia el fondo segun la necesidad
int sort_tama; //tamaño de la bola
int sort_altu; // altura donde se situará la bola
int incl_bola; // angulo de inclinacion de la bola
int crea_bola; // para crear bolas cada vez que rebote con la pala
BEGIN
set_mode(320,240,32,mode_window);
load_fpg("churripong/grafics.fpg"); //Carga el fichero para gráficos sonic.fpg de la carpeta images
fondo(); puntero();
rand_seed(time());
END //Fin del proceso principal del videojuego
process fondo()
begin
graph = 401;
x = 160;
y = 120;
z = 50;
write_var(0,20,180,1,crea_bola);
loop
if (camb_pant < 100) camb_pant ++; end
switch (camb_pant)
case 8: graph = 402; end
case 18: graph = 401; camb_pant = 1; end
case 100: graph = 406; palo(); bola(rand(20,50),rand(40,200),rand(100000,200000)); camb_pant = 101; end
end
if (mouse.left and camb_pant < 100) camb_pant = 100; end
if (key(_esc)) exit(); end
frame;
end
end
process palo()
begin
graph = 1;
x = 25;
y = 120;
//size = 25;
loop
if (y > 48)
IF (key(_up))
y-=5;
end
end
if (y < 191)
IF (key(_down))
y+=5;
end
end
if (key (_space)) bola(rand(20,50),rand(40,200),rand(100000,200000)); end
//if (crea_bola = true) crea_bola = false; end
if (collision (type bola))
graph = 2;
bola(rand(20,50),rand(40,200),rand(100000,200000));
else
graph = 1;
end
frame;
end
end
process bola(sort_tama,sort_altu,incl_bola)
private
int velo_bola = 10; // velocidad de avance con respecto a la bola
begin
graph = 201;
x = 300;
y = sort_altu;
size = sort_tama;
angle = incl_bola;
crea_bola = false;
loop
advance(velo_bola);
if (y <= (sort_tama/2)-6) angle = -angle; end
if (y >= 240-(sort_tama/2)) angle = -angle; end
//if (collision (type palo)) angle = angle - 180; end
if(collision(type palo))//La bola viene de abajo
if(angle > 90000 and angle < 180000)
angle = 180000- angle;
velo_bola *=2;
end//La bola viene de arriba
if(angle > 180000and angle < 270000)
angle = 180000 + angle;
velo_bola *=2;
end
end
if (x >= 300) velo_bola = 10; break; end
if (x<10) break; end
frame;
end
end
[/code]
desde que puse collision no para de darme polemas...
¿pq creas otra bola en el proceso palo?
if (collision (type bola))
graph = 2;
bola(rand(20,50),rand(40,200),rand(100000,200000));
end
bueno y con lo de los rebotes que no suceden, podrias probar con...
if (y <= (sort_tama/2)-6) angle = (-angle)%360000; end
if (y >= 240-(sort_tama/2)) angle = (-angle)%360000; end
ya que los if de más abajo puede que no se activen al haber ángulo negativo... a menos que bennu resetee automáticamente la local angle al pasar sobre los 360º o bajo los 0º pero no me consta.
[Modo análisis código = OFF]
El pong es el clásico ejemplo que pongo siempre para no usar collision, más que nada porque es fácil que se de el caso de que la bola colisione y vuelva a colisionar al siguente frame, y el segundo cálculo de ángulo seguro que la hace mal.
De todos modos, recomiendo que eches un vistazo a los valores REALES de angle, porque es posible que valga algo que no tienes contemplado en los ifs (¿valores negativos?)
Quote from: Noivern on September 06, 2010, 03:28:43 AM
¿pq creas otra bola en el proceso palo?
if (collision (type bola))
graph = 2;
bola(rand(20,50),rand(40,200),rand(100000,200000));
end
bueno y con lo de los rebotes que no suceden, podrias probar con...
if (y <= (sort_tama/2)-6) angle = (-angle)%360000; end
if (y >= 240-(sort_tama/2)) angle = (-angle)%360000; end
ya que los if de más abajo puede que no se activen al haber ángulo negativo... a menos que bennu resetee automáticamente la local angle al pasar sobre los 360º o bajo los 0º pero no me consta.
la bola nueva que se crea es la ''gracia'' del juego, te crea una bola porque no es la misma que rebota sino una nueva que te lanzan
y lo del % ese no creia que hiciera falta, aunque lo cambiaré 'porsi acaso'
Quote from: Drumpi on September 06, 2010, 07:48:27 AM
[Modo análisis código = OFF]
El pong es el clásico ejemplo que pongo siempre para no usar collision, más que nada porque es fácil que se de el caso de que la bola colisione y vuelva a colisionar al siguente frame, y el segundo cálculo de ángulo seguro que la hace mal.
De todos modos, recomiendo que eches un vistazo a los valores REALES de angle, porque es posible que valga algo que no tienes contemplado en los ifs (¿valores negativos?)
ok jefe, le echaré un vistaso, queria hacer ''el juego del mes'' en un cuarto de hora y se está retrasando
:awesome:
ups, que aqui no sale, je je je
jeje lo del %360000 es una buena práctica tomada del manual de osk :)
y cuenta... ¿te resultó?
que vá, al final lo he cambiado por avance de x e y, ademas le hago girar la bola
aunque lo que me sigue fallando es la colision, me colisiona demasiadas veces en un segundo
¿hay alguna manera de comprobar la colision una vez solo?
aparte
-quiero saber o contar el numero de procesos que tengo, no quiero que se cree mas de dos ni haya menos de uno ¿como va?
usa un contador.
Quote from: Noivern on September 07, 2010, 02:29:29 AM
jeje lo del %360000 es una buena práctica tomada del manual de osk :)
y cuenta... ¿te resultó?
El problema de %360000 es que también devuelve valores negativos, por lo que hay que añadir:
if (angle<0) angle+=360000; end
Quote from: SplinterGU on September 07, 2010, 11:32:07 PM
usa un contador.
O un bucle con get_id(type...
Futu, puedes hacer que el proceso que colisiona, una vez que lo haga, no vuelva a comprobar colisión, como cuanto el personaje de un videojuego se vuelve invencible tras recibir un golpe, puedes usar un contador para ello.
Usa un booleano del estilo
bColisionPlayer1;
Cuando golpee la pala del player 1 lo pones a true, y cuando golpee la pala del player 2 lo pones a false
Luego no tienes mas que hacer que chequee la colision de la pala del player 1 si bColisionPlayer1 es false y viceversa.
caspita, escribí algo aqui pero no está...
buf, como tengo la cabeza, he de darle mas veces al boton de publicar
para limitar la cantida de bolas a 2, es mejor usar un contador, es mas rapido que hacer un bucle de get_id(type...)
el problema persiste cuando la bola colisiona con la parte de arriba de la paleta, entonces se pone a colisionar muchas veces por segundo
he intentado ponerle un ''testigo'' para que cuando colisione le impida colisionar mas, pero al dar con la parte de arriba o abajo se invierte la direccion de la bola y sigue colisionando
no solo tenes que invertir, sino que tenes que volver a las coordendas anteriores o hacer un for cambiando las coordenadas en direccion a donde estaba antes hasta que deje de colisionar, y ahi si invertir el sentido.
aunque eso tampoco importa mucho, con solo volver a las coordernadas e invertir puede funcionar, a menos que este acoralada la bola, entonces el otro metodo puede ayudar.
¡ya esta!
el problema no era la colision con la bola, esa era perfecta y regresaba sin problemas para luego desaparecer en el infinito
el problema estaba en la creacion de la nueva bola, desde el mismo proceso bola() no puedo crear otra bola (por lo menos yo pienso que no y no lo haré) pero la colision funciona si hay dos partes a colisionar (la bola y el palo) pues yo puse el testigo de colision a la bola para que retrocediera, pero al palo no se lo puse y creaba el balo una bola por cada frame colisionando
testigo de colision al palo y solucionado el polema
no nos hemos dado cuenta naide, si es que vemos un pong y lo flipamos...
je je ej
otra cosa aparte, ¿como se pone el valor de una variable pegado a cada bola?
he intentado con: write_var(0,y,x-30,1,angle); pero me lo pone arriba del todo, ¿hay que meterlo en el loop?
creo que tambien hay que asignarle una variable para que el delete_text me lo borre en cada frame ¿no?
yo pense que estabas haciendo un flipper...
se ve que lei muy por encima.
Futurete no me plagies tantete! :D
plagio? si solo quiero hacer el juego del mes???
bueno, cambiando de tema; como eso de: 'que cuando rebote la bola con la paleta me cree una nueva que vaya direcion paleta' no me funciona mejor es crear bolas con un proceso independiente que segun la puntuacion se vuelva mas cabroncilla y lance mas bolas a mas velocidad...
conclusion, cambio total del juego
proximamente en gp32spain...
gamemaster, cuando quieras me mandas el resto de la baraja, o mejor esperate que te mande del 2 al 9 de todos los palos, que me queda un poquin, jeje
Aqui mi alter ego se llama FreeYourMind, espera que me doy un golpe en la cabeza para llamar a GameMaster ;D ;D
Ayer me acorde que se me olvido mandartela, pero tampoco me has enviado tu email, asi que dame el email y te las envio.
Espero impaciente esas cartas ;)
se lo mandaré a mi primo, porque no tengo tu emilio-e...