msx dummie
|
|
« : 05 de Octubre de 2007, 05:39:05 pm » |
|
Salud! estoy empezando a montar un pong en basic, bueno. digamos que estoy intentando empezarlo he estado haciendo pruebas y he decidido que primero voy a hacer uno para un solo jugador, tipo arkanoid pero sin ladrillos, algo muy sencillo a nivel gráfico (este creo que ya lo tengo resuelto, escenario y pala y su movimiento a izquierda y derecha con el mando) solo para aprender como programar el comportamiento de la pelota, estoy en casa de un amigo al que le gustan las mates y hemos estado debatiendo el como se haria,He visto en el foro que aqui hubo una especie de "certamen" sobre pong y la gente hizo programas, asi que me gustaria mucho si alguien pudiese explicarme cuales son los factores que intervendran en el movimiento de la bola, y como me recomendais hacerlo... espero vuestra ayuda, una vez mas GRACIAS!
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #1 : 05 de Octubre de 2007, 06:11:28 pm » |
|
Salud! estoy empezando a montar un pong en basic, bueno. digamos que estoy intentando empezarlo he estado haciendo pruebas y he decidido que primero voy a hacer uno para un solo jugador, tipo arkanoid pero sin ladrillos, algo muy sencillo a nivel gráfico (este creo que ya lo tengo resuelto, escenario y pala y su movimiento a izquierda y derecha con el mando) solo para aprender como programar el comportamiento de la pelota, estoy en casa de un amigo al que le gustan las mates y hemos estado debatiendo el como se haria,He visto en el foro que aqui hubo una especie de "certamen" sobre pong y la gente hizo programas, asi que me gustaria mucho si alguien pudiese explicarme cuales son los factores que intervendran en el movimiento de la bola, y como me recomendais hacerlo... espero vuestra ayuda, una vez mas GRACIAS! Claro, con mucho gusto. Si quieres podemos quedar un día y me llevo el código de mi pong512 (1000 bytes) y lo vemos on the fly... A mí, por cierto, también me gustan "algo" las mates La idea fundamental de los rebotes es que el ángulo de entrada debe ser el mismo que el de salida, es decir, que sólo tendrás que cambiar el signo de una de las componentes de la velocidad (considerada como un vector por ser magnitud vectorial). El único problema es que pretendes hacer un pong para un único jugador, con lo que tendrás que tener en cuenta rebotes en dos direcciones (rebotes verticales y rebotes horizontales) eso complica un poquito más el tema ya que tienes que tener en cuenta también los rebotes en los ángulos. En mi pong hay rebotes en esquinas, ángulos, paredes verticales y horizontales. La rutina de cálculo del rebote es bastante sencilla (comparada con las primeras versiones), pero merece una explicación bastante detallada y con papel y bolígrafo, así que reitero lo dicho, si quieres podemos quedar y ya lo vemos un día de éstos. Saludos -- SapphiRe
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #2 : 06 de Octubre de 2007, 01:00:53 am » |
|
claro sapphire! cuando quieras, nos vemos y yo encantado de escuchar y aprender!
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #3 : 07 de Octubre de 2007, 04:05:04 pm » |
|
oye y mientras tanto no me podias dar algunas pistas... por variar un poco que estoy que me salen los vpokes por las orejas...
|
|
|
En línea
|
|
|
|
cybernoid
|
|
« Respuesta #4 : 07 de Octubre de 2007, 09:02:52 pm » |
|
No creo que te sirva de nada, pero aqui te pego un pedazin de codigo que he hecho en 10 minutos de una "pelota" rebotando en un cuadrado, supongo que viendo el codigo pillaras mas o menos la idea. 5 REM REBOTES 10 SCREEN 2 20 LINE (0,0)-(208,178),1,B 30 X=100:Y=100 40 VX=1:VY=-1 50 FOR N=BASE(14) TO BASE(14)+7:READ A:VPOKE N,A:NEXT N 60 PUT SPRITE 0,(X,Y),15,0 70 X=X+VX 80 Y=Y+VY 85 REM CONTROL DE REBOTES 90 IF X<1 OR X>200 THEN VX=-VX 100 IF Y<1 OR Y>170 THEN VY=-VY 110 GOTO 60 120 DATA &H18,&H24,&H42,&H81,&H81,&H42,&H24,&H18
espero que sirva de algo
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #5 : 07 de Octubre de 2007, 10:33:30 pm » |
|
me vale! me vale! estoy viendolo, hay que arreglar un poco las coordenadas de los limites para que quede bien... ahora te cuento y te planteo mis dudas vale? gracias!
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #6 : 08 de Octubre de 2007, 09:27:35 am » |
|
El ejemplo es ilustrativo de lo que hay que hacer con los rebotes (cambiar el signo de la coordenada correspondiente de la velocidad), también tiene en cuenta que puede haber un doble rebote contra un rincón, momento en el que habría que cambiar los dos signos (las condiciones de los dos IF se hacen verdaderas).
Lo siguiente que tienes que hacer es que la pelota rebote contra las paredes que haya dibujadas (ojo, las paredes diagonales son más complicadas de calcular, usa sólo paredes horizontales y verticales. Para eso puedes hacer uso de la instrucción POINT. Deberías comprobar si está tocando con alguna pared y decidir en qué dirección (o direcciones) vas a cambiar la velocidad.
A ver si quedamos un día y te enseño el pong512 con su rutina de rebotes en ensamblador.
Saludos -- Sph.
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #7 : 08 de Octubre de 2007, 11:22:39 am » |
|
a ver si quedamos, a ver si quedamos, que estoy ansioso y todo jejejejj
¿me podrias poner un ejemplo cortito sobre como utilizar la orden POINT? la he usado en algun juego copiado de algun libro o revista, pero no me queda claro... Gracias otra vez Shappire! no se que haria sin tu ayuda :god:
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #8 : 08 de Octubre de 2007, 11:56:56 am » |
|
¿me podrias poner un ejemplo cortito sobre como utilizar la orden POINT? la he usado en algun juego copiado de algun libro o revista, pero no me queda claro... Claro! Primero supongamos que la pantalla es negra (color 1) y que las paredes son de otro color. Luego la bola tiene que estar en las coordenadas X e Y y es de 8x8. Lo primero que tienes que saber es que las coordenadas de los sprites no se corresponden exactamente con las de pantalla, por lo que tienes que hacer un ajuste previo que consiste en, simplemente, sumar 1 a la coordenada Y de la bola (esto es así, el VDP funciona así). Ahora tendrías que ver si la bola toca por la parte de arriba con una pared, o por abajo, o por la derecha o por la izquierda... U=POINT(X+3,Y+1) D=POINT(X+3,Y+8) R=POINT(X+7,Y+4) L=POINT(X,Y+4)
Y ahora los rebotes: IF U*D <> 1 THEN VY=-VY IF R*L <> 1 THEN VX=-VX
Si U ó D son distintos de 1 (color de fondo) su producto será distinto de 1 y habrá que cambiar el sentido de la componente vertical de la velocidad. Lo mismo para derecha e izquierda. Pruébalo y me comentas qué te parece. Saludos -- Sph.
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #9 : 08 de Octubre de 2007, 01:07:46 pm » |
|
gracias!! cuando me dices sumar 1 a la coordenada y... ¿donde exactamente te refieres? en la coordenada y del sprite? me pierdo...
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #10 : 08 de Octubre de 2007, 01:09:47 pm » |
|
gracias!! cuando me dices sumar 1 a la coordenada y... ¿donde exactamente te refieres? en la coordenada y del sprite? me pierdo...
Sí. Cuando tú pones un sprite en la coordenada vertical 49, realmente lo estás colocando en la 50 con respecto a la pantalla gráfica. Por eso cuando tienes que controlar las interacciones entre sprites y gráficos hay que hacer ese ajuste. Saludos -- Sph.
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #11 : 08 de Octubre de 2007, 01:39:59 pm » |
|
pero donde se hace ese ajuste? en point?
|
|
|
En línea
|
|
|
|
cybernoid
|
|
« Respuesta #12 : 08 de Octubre de 2007, 01:44:49 pm » |
|
pero donde se hace ese ajuste? en point?
sip, en el point.
|
|
|
En línea
|
|
|
|
msx dummie
|
|
« Respuesta #13 : 09 de Octubre de 2007, 11:51:44 am » |
|
bueno shappire tengo una duda sobre el codigo sobre point que me has explicado (lo siento, se ve que soy un poco negao ... primero no entiendo porque asignas esos valores a x y a y aqui: U=POINT(X+3,Y+1) D=POINT(X+3,Y+8) R=POINT(X+7,Y+4) L=POINT(X,Y+4)quiero decir que porque 3 o 1 o 8 o7... me puedes ayudar?
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #14 : 09 de Octubre de 2007, 12:03:23 pm » |
|
primero no entiendo porque asignas esos valores a x y a y aqui:
U=POINT(X+3,Y+1) D=POINT(X+3,Y+8) R=POINT(X+7,Y+4) L=POINT(X,Y+4) quiero decir que porque 3 o 1 o 8 o7... Porque son los puntos de la bola que (suponiendo que tiene forma redondeada) tocan antes con las paredes: el centro de cada una de las caras del cuadrado que encierra la bola.
|
|
|
En línea
|
|
|
|
|