Karoshi MSX Community
06 de Julio de 2021, 12:40:01 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: Parabola  (Leído 12096 veces)
0 Usuarios y 1 Visitante están viendo este tema.
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« : 01 de Octubre de 2008, 11:18:20 am »

Pues eso, cual es la forma mas facil para mover un sprite en forma de parabola. Huh

Robsy, a ti te salieron muy bien las de el juego de 2Kbos, como las hiciste.
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #1 : 01 de Octubre de 2008, 12:03:02 pm »

Pues la parábola no es más que un movimiento uniformemente acelerado. Para entendernos, te lo pintaré en pseudo-código:

angulo=45*pi/180;VI=20;X=0;Y=192;VX=VI*cos(angulo);VY=-VI*sin(angulo);g=0.02;

bucle:
VY=VY+g;
Y=Y+VY;
X=X+VX;

Como verás, es fácilmente trasladable a ensamblador. La única parte complicada es que hay que usar aritmética de punto fijo. Pero al final es una cosa muy sencilla:

2,5 en decimal = 2 + 0,5 = 2^1 + 2^-1

Se representa la parte entera en el byte alto y la parte decimal en el bajo, y ya lo tienes. 2,5 = 0000 0010 - 1000 0000 b = 0280h

Afortunadamente, el asMSX te permite hacer la conversión directa con la función fix(). Y los senos y cosenos mediante una tabla para evitarte así cálculos raros.

Te recomiendo que destripes el código fuente del G-MONKEY y también, aunque sea más sencillo, una demo de aritmética de punto fijo que estaba en una distribución anterior del asMSX, y que creo que se llamaba G.ASM o algo así.


En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #2 : 01 de Octubre de 2008, 12:09:49 pm »

Que casualidad, yo también ando trasteando con la aritmética de punto fijo. Así que fix() te ajusta automáticamente la parte decimal, ahora lo entiendo Wink
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #3 : 01 de Octubre de 2008, 01:36:02 pm »

Efectivamente, socio. asMSX utiliza aritmética de punto flotante de doble precisión para sus cálculos internos y después se puede convertir todo número a formato de punto fijo con fix(). La idea es la misma que para enteros: el bit más significativo vale 2^7, mientras que el menos significativo dentro de la palabra de 16 bits, vale 2^-8. Por lo tanto, en valor absoluto, el mayor valor representable sin signo sería 255,996 aproximadamente y el más pequeño 0,00390625, que coincide con la precisión de este formato.

La ventaja es que se pueden sumar directamente como enteros de 1 bits y el resultado es correcto. Podría hacerse lo siguiente:

Código:
ld hl,fix(2.50)
ld de,fix(1.75)
add hl,de
ld bc,fix(0.33)
add hl,bc

El valor contenido en los distintos registros al final de la ejecución sería el siguiente:

BC = 00 55 h
DE = 01 C0 h
HL = 04 94 h

Además, se pueden hacer restas del mismo modo, entendiendo entonces que los números tienen signo y están representados en complemento a dos.

Para hacerlo más fácil de entender, el asMSX además incluye la pseudoinstrucción PRINTFIX, que permite ver el valor en formato de punto fijo. Y se puede comparar entonces con PRINTHEX y lo que indica.

Supongo que se podría dar alguna explicación un poco más detallada, pero no dispongo de tiempo ahora para hacer un artículo al respecto.

Para hacer una tabla de senos para los ángulos comprendidos entre 0 y 90, bastaría con hacer lo siguiente:

Código:
SIN_TABLE:
  angulo=0
  rept 91
    dw fix(sin(angulo*pi/180.0))
    angulo=angulo+1
  endr

Así tendríamos una maravillosa tabla de 91 x 2 = 182 bytes recogiendo el valor del seno para cada ángulo entre 0 y 90 grados, o lo que es lo mismo, entre 0 y pi/2 radianes. Por cierto, que el valor PI está definido por defecto en asMSX. Wink

En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #4 : 01 de Octubre de 2008, 02:55:29 pm »

Vale, mas o menos entendido, pero yo me aclaro mejor viendo un ejemplo y destripandole un poco. Grin

Me puedes enviar esos dos ejemplos que me dices Robsy, el codigo de el G-Monkey no le veo para poder descargarlo.

Perdona por las molestias.
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
ARTRAG
Visitante
« Respuesta #5 : 01 de Octubre de 2008, 08:08:13 pm »

FYI
http://www.msx.org/forumtopic8523.html
En línea
kabish
Karoshi Maniac
****
Mensajes: 470


caspaflims@hotmail.com
« Respuesta #6 : 01 de Octubre de 2008, 08:32:28 pm »

No se site servira esto ..

http://msxgamesbox.com/karoshi/index.php?topic=451.15
En línea
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #7 : 02 de Octubre de 2008, 07:48:25 am »

Distribución del G-MONKEY con código fuente.

Última distribución oficial del asMSX v.0.12g - en la carpeta Examples encontrarás el fichero fixed.asm. Para ensamblar, mejor usar la última beta porque es bastante más estable.

Con esto debería bastar.
En línea
Jon_Cortazar
Administrator
Karoshi Forum's God
********
Mensajes: 2777



WWW Email
« Respuesta #8 : 02 de Octubre de 2008, 11:22:13 am »

Ya verás la que estoy preparando, ya... muahahahaha!
En línea

Jon Cortázar Abraido (aka El Viejo Archivero)
RELEVO Videogames
[Dioniso: La cafeína está haciendo su trabajo; yo espero hacer el mío.]
[pitpan: Me sigue pareciendo más productivo jugar al SNAIL MAZE que seguir esta discusión.]
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #9 : 02 de Octubre de 2008, 11:48:25 am »

Y no nos puedes dar ni una pistilla? Ni siquiera a tu pobre socio?  Cry
En línea
Saeba
Karoshi Lover
***
Mensajes: 219


« Respuesta #10 : 02 de Octubre de 2008, 08:26:00 pm »

Aritmética de punto fijo???

[Modo publicidad ON]

Sólo puedo acordarme de este ejemplar y ese peaaaassso artículo de Avelino sobre ese tema:

http://callmsx.atlantes.org/7
En línea
Ramones
Visitante
« Respuesta #11 : 03 de Octubre de 2008, 09:15:43 am »

Senos? Cosenos? Punto fijo? XDDD

Está claro que para movimientos complicados simulando elipses y círculos me parece correcto usar todo esto. Pero para una parabola "sencillita" no hace falta NADA de todo eso. Cheesy Os lo aseguro, si vieseis como las hago en el Pang os partís el pecho.

Ni un seno, ni un coseno ni nada de nada. Todo depende de la complejidad que le quieras dar (y sobre todo la precisión que busques).

Creo que es mucho mas sencillo pensarlo de otra manera. En las bolas del Pang (por poner un ejemplo) el vector de aceleración X es fijo. Es decir cada bola se mueve con una velocidad X fija. Entonces solo falta la Y. Y la velocidad de "impulso" Y pues también estaba fijada por bola. (el maximo)

Entonces con esto, qué tenemos? Pues imaginando que la bola empieza desde arriba de la pantalla sencillamente hago esto:

VY = 0
X = la que sea
Y = 0
VX = la fijada, imaginemos 1
G = 1 (gravedad al gusto)

bucle:

X =X + VX
Y = Y + VY
VY = VY + G

De esta forma al caer se va acelerando. Si detectaba que "se pasaba" de vueltas, pues la dejaba con un tope de velocidad VY.

Y cuando toca suelo, pues invertimos:

X = X + VX
Y = Y - VY
VY = VY - G

Y nada, que si llega a 0 la VY pues le vuelvo a dar la vuelta.

CHAPUZA? MUUUUCHA!! Cheesy Es un chapuzón como la copa de un pino. Hoy en día ya uso movimientos uniformemente acelerados y senos y cosenos para movimientos de sprites y demás.

Pero os aseguro que ESO que he puesto funciona perfectamente, los calculos son ínfimos y no hay que usar punto fijo, ni tablas de senos y cosenos. Todo depende de las necesidades del programa claro.










En línea
OKI09
Karoshi Maniac
****
Mensajes: 275



WWW Email
« Respuesta #12 : 03 de Octubre de 2008, 09:51:59 am »

Gracias a todos, todas estas explicaciones y tecnicas me han venido de perlas. Cheesy

Ramones, voy a darle vueltas a tu solucion, a lo mejor no necesito nada mas, pues es un efecto sencillo el que quiero hacer. Wink
En línea

La derrota no es una opción y no hay excusas.
"Parasiempre"
pitpan
Karoshi Forum's Guru
*******
Mensajes: 1812


« Respuesta #13 : 03 de Octubre de 2008, 10:54:51 am »

Ramones: estoy contigo. No hace falta usar ni seno ni coseno para nada, si puedes determinar la velocidad inicial en los ejes X e Y directamente. Si miras el pseudocódigo que indiqué, sólo se usaban para el cálculo de la velocidad inicial, tal y como lo hice en el G-MONKEY, donde era imprescindible: a cada ángulo le corresponde una velocidad distinta en los ejes X e Y.

Estamos de acuerdo en que no se necesitan para nada más. Si quitas este detalle, verás como la solución que propones es equivalente a la mía. Wink
En línea
Ramones
Visitante
« Respuesta #14 : 03 de Octubre de 2008, 12:15:19 pm »

Estamos de acuerdo en que no se necesitan para nada más. Si quitas este detalle, verás como la solución que propones es equivalente a la mía. Wink

En efecto, estamos de acuerdo. Yo solo intentaba no "asustar" a OKI con puntos fijos y senos y cosenos que es algo que puede asustar al programador novel.

Realmente para calcular una parábola no hace falta mucho más. Luego ya depende de la complejidad que quieras darle. Si quieres tener un impulso inicial y por ejemplo un punto de inicio y final de la misma pues el cálculo ya es mucho más complejo (aunque se puede precalcular antes y usarlo despues).

Si quieres que se ejecute en un tiempo determinado pues el cálculo es de otra forma. Si quieres que alcance una altura dada, pues es de otra manera. Pero en ninguno de esos calculos se necesitan senos y cosenos. Eso si, decimales, cuantos más pues mejor precisión. Smiley

Y como bien dices en tu GMONKEY te era obligado usarlos por el hecho de utilizar grados para tirar los plátanos. Smiley Es obvio.




En línea
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!