Traducción de macros en los demas días y revisiones del Día 6

This commit is contained in:
jota 2022-01-11 18:10:49 -03:00
parent 804a750d8b
commit 22323c4ab5
4 changed files with 112 additions and 75 deletions

View File

@ -1018,32 +1018,32 @@ por ejemplo, lo siguiente dividirá el ancho de la pantalla en dos, utilizando e
#01 SFT2 #01 SFT2
``` ```
### macros HALF ### macros MITAD
para seguir ilustrando el uso de las macros, podríamos definir unas macros HALF y HALF2, utilizando DIV o SFT. para seguir ilustrando el uso de las macros, podríamos definir unas macros MITAD y MITAD2, utilizando DIV o SFT.
usando DIV: usando DIV:
``` ```
%HALF { #02 DIV } ( numero -- numero/2 ) %MITAD { #02 DIV } ( numero -- numero/2 )
%HALF2 { #0002 DIV2 } ( numero -- numero/2 ) %MITAD2 { #0002 DIV2 } ( numero -- numero/2 )
``` ```
usando SFT: usando SFT:
``` ```
%HALF { #01 SFT } ( numero -- numero/2 ) %MITAD { #01 SFT } ( numero -- numero/2 )
%HALF2 { #01 SFT2 } ( numero -- numero/2 ) %MITAD2 { #01 SFT2 } ( numero -- numero/2 )
``` ```
and use any of them to calculate the center: and use any of them to calculate the center:
``` ```
.Pantalla/ancho DEI2 HALF2 .Pantalla/x DEO2 .Pantalla/ancho DEI2 MITAD2 .Pantalla/x DEO2
.Pantalla/alto DEI2 HALF2 .Pantalla/y DEO2 .Pantalla/alto DEI2 MITAD2 .Pantalla/y DEO2
``` ```
notemos que la macro HALF2 que utiliza SFT2 necesitará un byte menos que la que utiliza DIV2. esto puede o no ser importante dependiendo de tus prioridades :) notemos que la macro MITAD2 que utiliza SFT2 necesitará un byte menos que la que utiliza DIV2. esto puede o no ser importante dependiendo de tus prioridades :)
## dibujando sprites en posiciones específicas ## dibujando sprites en posiciones específicas

View File

@ -286,7 +286,7 @@ una posible desventaja es que podría ser menos legible. pero una posible ventaj
``` ```
( incrementar un short desde la página cero ) ( incrementar un short desde la página cero )
%ZP-INC2 { DUP LDZ2 INC2 ROT STZ2 } ( zp-dirección -- ) %PC-INC2 { DUP LDZ2 INC2 ROT STZ2 } ( pc-dirección -- )
``` ```
## variables en direcciones relativas ## variables en direcciones relativas
@ -402,7 +402,7 @@ el siguiente programa ilustra los puntos anteriores, haciendo que nuestro cuadra
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ] |20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
( macros/constantes ) ( macros/constantes )
%HALF2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 ) %MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%color-borrar { #40 } ( borrar 1bpp sprite del primer plano ) %color-borrar { #40 } ( borrar 1bpp sprite del primer plano )
%color-2 { #4a } ( dibujar sprite de 1bpp con color 2 y transparencia ) %color-2 { #4a } ( dibujar sprite de 1bpp con color 2 y transparencia )
@ -418,7 +418,7 @@ el siguiente programa ilustra los puntos anteriores, haciendo que nuestro cuadra
#2ce5 .Sistema/b DEO2 #2ce5 .Sistema/b DEO2
( fijar la Pantalla/y a la mitad de la pantalla, menos 4 ) ( fijar la Pantalla/y a la mitad de la pantalla, menos 4 )
.Pantalla/alto DEI2 HALF2 #0004 SUB2 .Pantalla/y DEO2 .Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( fijar la dirección del sprite ) ( fijar la dirección del sprite )
;cuadrado .Pantalla/direc DEO2 ;cuadrado .Pantalla/direc DEO2
@ -503,7 +503,7 @@ el siguiente programa nos permite controlar la posición horizontal de nuestro c
|80 @Controlador [ &vector $2 &boton $1 &tecla $1 ] |80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros/constantes ) ( macros/constantes )
%HALF2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 ) %MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%color-borrar { #40 } ( borrar 1bpp sprite del primer plano ) %color-borrar { #40 } ( borrar 1bpp sprite del primer plano )
%color-2 { #4a } ( dibujar sprite de 1bpp con color 2 y transparencia ) %color-2 { #4a } ( dibujar sprite de 1bpp con color 2 y transparencia )
@ -519,7 +519,7 @@ el siguiente programa nos permite controlar la posición horizontal de nuestro c
#2ce5 .Sistema/b DEO2 #2ce5 .Sistema/b DEO2
( fijar la Pantalla/y a la mitad de la pantalla, menos 4 ) ( fijar la Pantalla/y a la mitad de la pantalla, menos 4 )
.Pantalla/alto DEI2 HALF2 #0004 SUB2 .Pantalla/y DEO2 .Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( fijar la dirección del sprite ) ( fijar la dirección del sprite )
;cuadrado .Pantalla/direc DEO2 ;cuadrado .Pantalla/direc DEO2
@ -826,7 +826,7 @@ la sección "borrar el sprite" no es realmente necesaria en este caso debido a l
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ] |20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &pad $2 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
( macros/constantes ) ( macros/constantes )
%HALF2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 ) %MITAD2 { #01 SFT2 } ( desplazar un bit a la derecha ) ( corto -- corto/2 )
%8MOD { #07 AND } ( byte -- byte%8 ) %8MOD { #07 AND } ( byte -- byte%8 )
%A-CORTO { #00 SWP } ( byte -- corto ) %A-CORTO { #00 SWP } ( byte -- corto )
@ -845,8 +845,8 @@ la sección "borrar el sprite" no es realmente necesaria en este caso debido a l
#2ce5 .Sistema/b DEO2 #2ce5 .Sistema/b DEO2
( fijar Pantalla/x y y a la mitad de la pantalla menos 4 ) ( fijar Pantalla/x y y a la mitad de la pantalla menos 4 )
.Pantalla/ancho DEI2 HALF2 #0004 SUB2 .Pantalla/x DEO2 .Pantalla/ancho DEI2 MITAD2 #0004 SUB2 .Pantalla/x DEO2
.Pantalla/alto DEI2 HALF2 #0004 SUB2 .Pantalla/y DEO2 .Pantalla/alto DEI2 MITAD2 #0004 SUB2 .Pantalla/y DEO2
( establecer la dirección del sprite ) ( establecer la dirección del sprite )
;animación .Pantalla/direc DEO2 ;animación .Pantalla/direc DEO2

View File

@ -562,7 +562,7 @@ para llamar a la subrutina, podrías hacer algo como lo siguiente
``` ```
#0008 ( empujar x inicial ) #0008 ( empujar x inicial )
.Pantalla/altura DEI2 HALF2 ( empujar y ) .Pantalla/altura DEI2 MITAD2 ( empujar y )
#ff ( empujar longitud de la línea ) #ff ( empujar longitud de la línea )
;dibujar-linea-horizontal JSR2 ( llamar subrutina ) ;dibujar-linea-horizontal JSR2 ( llamar subrutina )
``` ```

View File

@ -32,7 +32,7 @@ empecemos con el siguiente programa como plantilla. incluye los datos para un sp
( dispositivos ) ( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ] |00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ] |20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &llave $1 ] |80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros ) ( macros )
%RTN { JMP2r } %RTN { JMP2r }
@ -44,7 +44,7 @@ empecemos con el siguiente programa como plantilla. incluye los datos para un sp
#2ce9 .Sistema/r DEO2 #2ce9 .Sistema/r DEO2
#01c0 .Sistema/g DEO2 #01c0 .Sistema/g DEO2
#2ce5 .Sistema/b DEO2 #2ce5 .Sistema/b DEO2
BRK BRK
@ -138,11 +138,11 @@ en este punto, la pila tiene la nueva x en la parte superior de la pila, y el an
podemos compararlos en modo mantener para conservar esos valores en la pila, y hacer nuestro salto como antes: podemos compararlos en modo mantener para conservar esos valores en la pila, y hacer nuestro salto como antes:
``` ```
GTH2k ( ¿es ese ancho mayor que x? aka ¿es x menor que el ancho? ) GTH2k ( ¿es ese ancho mayor que x?, o también, ¿es x menor que el ancho? )
,&bucle-x JCN ( salta si x es menor que el límite ) ,&bucle-x JCN ( salta si x es menor que el límite )
``` ```
cuando terminamos el bucle, tenemos que POP ambos valores. cuando terminamos el bucle, tenemos que hacer POP de ambos valores.
usando esta estrategia, obtendríamos el siguiente bucle: usando esta estrategia, obtendríamos el siguiente bucle:
@ -177,7 +177,7 @@ lo siguiente muestra nuestro programa en contexto, llenando completamente la pri
( dispositivos ) ( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ] |00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ] |20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &llave $1 ] |80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros ) ( macros )
%RTN { JMP2r } %RTN { JMP2r }
@ -331,7 +331,7 @@ podemos pensar en las dos palas del juego como dos rectángulos, cada uno con su
la coordenada x de cada pala puede ser constante, y la coordenada y debe ser de seguro una variable. la coordenada x de cada pala puede ser constante, y la coordenada y debe ser de seguro una variable.
en esta parte veremos como dibujar las palas en base a estos parámetros, y también recapitularemos como cambiar sus coordenadas y con el controlador. en esta parte veremos como dibujar las palas en base a estos parámetros, y también recapitularemos como cambiar sus coordenadas `y` con el controlador.
## dibujar las palas multi-tile ## dibujar las palas multi-tile
@ -521,7 +521,7 @@ un margen para separar las palas de los bordes podría ser agradable también:
por último, recuperemos nuestra macro HALF2 de días anteriores: por último, recuperemos nuestra macro HALF2 de días anteriores:
``` ```
%HALF2 { #01 SFT2 } ( corto -- corto/2 ) %MITAD2 { #01 SFT2 } ( corto -- corto/2 )
``` ```
### iniciar posiciones ### iniciar posiciones
@ -542,7 +542,7 @@ MARGEN SUB2 ANCHO-PALA SUB2
.derecha/x STZ2 .derecha/x STZ2
``` ```
para centrar las coordenadas y podemos restar la altura de la pala a la altura de la pantalla, y luego dividir entre dos: para centrar las coordenadas `y` podemos restar la altura de la pala a la altura de la pantalla, y luego dividir entre dos:
``` ```
.Pantalla/alto DEI2 ALTO-PALA SUB2 HALF2 .Pantalla/alto DEI2 ALTO-PALA SUB2 HALF2
@ -573,11 +573,11 @@ omitiendo la definición de las subrutinas dibuja-fondo y dibuja-pala, y como fo
( dispositivos ) ( dispositivos )
|00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ] |00 @Sistema [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ] |20 @Pantalla [ &vector $2 &ancho $2 &alto $2 &auto $1 &pad $1 &x $2 &y $2 &direc $2 &pixel $1 &sprite $1 ]
|80 @Controlador [ &vector $2 &boton $1 &llave $1 ] |80 @Controlador [ &vector $2 &boton $1 &tecla $1 ]
( macros ) ( macros )
%RTN { JMP2r } %RTN { JMP2r }
%HALF2 { #01 SFT2 } ( corto -- corto/2 ) %MITAD2 { #01 SFT2 } ( corto -- corto/2 )
( constantes ) ( constantes )
%ANCHO-PALA { #0010 } ( 2 tiles ) %ANCHO-PALA { #0010 } ( 2 tiles )
@ -668,7 +668,7 @@ podemos usar las flechas arriba y abajo para cambiar la posición de la pala izq
podemos tener una macro para definir la velocidad de la pala, es decir, cuánto sumaremos o restaremos al mover cada cuadro: podemos tener una macro para definir la velocidad de la pala, es decir, cuánto sumaremos o restaremos al mover cada cuadro:
``` ```
%VELOC-PALA { #0001 } %VEL-PALA { #0001 }
``` ```
todo esto puede ir dentro de su propia subrutina para facilitar la lectura: todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
@ -686,10 +686,10 @@ todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
&derecha JMP ( salta si no se ha pulsado ninguno de los dos ) &derecha JMP ( salta si no se ha pulsado ninguno de los dos )
&izquierda-arriba &izquierda-arriba
.izquierda/y LDZ2 VELOC-PALA SUB2 .izquierda/y STZ2 .izquierda/y LDZ2 VEL-PALA SUB2 .izquierda/y STZ2
,&derecha JMP ,&derecha JMP
&izquierda-abajo &izquierda-abajo
.izquierda/y LDZ2 VELOC-PALA ADD2 .izquierda/y STZ2 .izquierda/y LDZ2 VEL-PALA ADD2 .izquierda/y STZ2
,&derecha JMP ,&derecha JMP
&derecha &derecha
@ -702,13 +702,13 @@ todo esto puede ir dentro de su propia subrutina para facilitar la lectura:
&fin JMP ( salta si no se ha pulsado ninguno de los dos ) &fin JMP ( salta si no se ha pulsado ninguno de los dos )
&derecha-arriba &derecha-arriba
.derecha/y LDZ2 VELOC-PALA SUB2 .derecha/y STZ2 .derecha/y LDZ2 VEL-PALA SUB2 .derecha/y STZ2
,&fin JMP ,&fin JMP
&derecha-abajo &derecha-abajo
.derecha/y LDZ2 VELOC-PALA ADD2 .derecha/y STZ2 .derecha/y LDZ2 VEL-PALA ADD2 .derecha/y STZ2
&fin &fin
POP ( hacer pop al valor duplicado del botón ) POP ( hacer POP al valor duplicado del botón )
RTN RTN
``` ```
@ -879,22 +879,22 @@ utilizaremos este último enfoque con la velocidad, ya que nos ayudará a discut
incluimos estas variables en nuestra página cero, complementando las x e y que ya teníamos: incluimos estas variables en nuestra página cero, complementando las x e y que ya teníamos:
``` ```
@pelota [ &x $2 &y $2 &veloc-x $2 &veloc-y $2 ] @pelota [ &x $2 &y $2 &vel-x $2 &vel-y $2 ]
``` ```
### diferentes direcciones ### diferentes direcciones
si, por ejemplo, iniciamos veloc-x con 1 si, por ejemplo, iniciamos vel-x con 1
``` ```
#0001 .pelota/veloc-x STZ2 #0001 .pelota/vel-x STZ2
``` ```
podemos hacer que la pelota se mueva hacia la derecha haciendo: podemos hacer que la pelota se mueva hacia la derecha haciendo:
``` ```
( dentro de actualiza-pelota ) ( dentro de actualiza-pelota )
.pelota/veloc-x LDZ2 ( obtener veloc-x ) .pelota/vel-x LDZ2 ( obtener vel-x )
.pelota/x LDZ2 ( obtener x ) .pelota/x LDZ2 ( obtener x )
ADD2 ( sumarlos ) ADD2 ( sumarlos )
.pelota/x STZ2 ( almacenar nueva x ) .pelota/x STZ2 ( almacenar nueva x )
@ -908,7 +908,7 @@ en otros contextos, uno podría decir, ¡"-1"!
pero no hemos utilizado signos negativos en uxn; ¡no podemos! pero no hemos utilizado signos negativos en uxn; ¡no podemos!
entonces, ¿existe un valor positivo de veloc-x que haga que x se reduzca al sumarlos? entonces, ¿existe un valor positivo de vel-x que haga que x se reduzca al sumarlos?
¡normalmente pensaríamos que no lo hay y que la pregunta no tiene sentido! ¡normalmente pensaríamos que no lo hay y que la pregunta no tiene sentido!
@ -960,14 +960,14 @@ podríamos continuar así obteniendo más y más números "negativos" que funcio
volviendo a nuestro código, si inicializamos nuestra velocidad con: volviendo a nuestro código, si inicializamos nuestra velocidad con:
``` ```
#ffff .pelota/veloc-x STZ2 #ffff .pelota/vel-x STZ2
``` ```
y luego usamos exactamente el mismo código para actualizar la posición: y luego usamos exactamente el mismo código para actualizar la posición:
``` ```
( dentro de actualiza-pelota ) ( dentro de actualiza-pelota )
.pelota/veloc-x LDZ2 ( obtener veloc-x ) .pelota/vel-x LDZ2 ( obtener vel-x )
.pelota/x LDZ2 ( obtener x ) .pelota/x LDZ2 ( obtener x )
ADD2 ( sumarlas ) ADD2 ( sumarlas )
.pelota/x STZ2 ( almacenar nueva x ) .pelota/x STZ2 ( almacenar nueva x )
@ -978,8 +978,8 @@ ADD2 ( sumarlas )
podría tener sentido establecer estos valores como macros: podría tener sentido establecer estos valores como macros:
``` ```
%PELOTA-VELOC-POS { #0001 } ( +1 ) %PELOTA-VEL-POS { #0001 } ( +1 )
%PELOTA-VELOC-NEG { #ffff } ( -1 ) %PELOTA-VEL-NEG { #ffff } ( -1 )
``` ```
### implementando el movimiento de la pelota ### implementando el movimiento de la pelota
@ -989,12 +989,12 @@ basándonos en lo que acabamos de discutir, podemos empezar nuestra subrutina de
``` ```
@actualiza-pelota ( -- ) @actualiza-pelota ( -- )
( obtener velocidad-x y x ) ( obtener velocidad-x y x )
.pelota/veloc-x LDZ2 .pelota/x LDZ2 .pelota/vel-x LDZ2 .pelota/x LDZ2
ADD2 ( sumarlos ) ADD2 ( sumarlos )
.pelota/x STZ2 ( guarda la nueva x ) .pelota/x STZ2 ( guarda la nueva x )
( obtener velocidad-y e y ) ( obtener velocidad-y e y )
.pelota/velocidad-y LDZ2 .pelota/y LDZ2 .pelota/vel-y LDZ2 .pelota/y LDZ2
ADD2 ( sumarlos ) ADD2 ( sumarlos )
.pelota/y STZ2 ( almacenar nueva y ) .pelota/y STZ2 ( almacenar nueva y )
RTN RTN
@ -1011,8 +1011,8 @@ HALF2 .pelota/x STZ2
HALF2 .pelota/y STZ2 HALF2 .pelota/y STZ2
( iniciar la velocidad de la pelota ) ( iniciar la velocidad de la pelota )
PELOTA-VELOC-POS .pelota/veloc-x STZ2 PELOTA-VEL-POS .pelota/vel-x STZ2
PELOTA-VELOC-POS .pelota/veloc-y STZ2 PELOTA-VEL-POS .pelota/vel-y STZ2
``` ```
woohoo! se mueve, pero de momento sale volando :) woohoo! se mueve, pero de momento sale volando :)
@ -1057,11 +1057,11 @@ considerando que hay un margen en la parte superior, podemos hacer esta comproba
.pelota/y LDZ2 .pelota/y LDZ2
MARGEN-PARED MARGEN-PARED
LTH2 ( ¿es pelota-y menos que el margen? ) LTH2 ( ¿es pelota-y menos que el margen? )
,&establecer-veloc-pos JCN ,&establecer-vel-pos JCN
,&verif-pared-inf JMP ,&verif-pared-inf JMP
&establecer-veloc-pos &establecer-vel-pos
PELOTA-VELOC-POS .pelota/veloc-y STZ2 PELOTA-VEL-POS .pelota/vel-y STZ2
&continuar JMP &continuar JMP
&verif-pared-inf &verif-pared-inf
``` ```
@ -1081,11 +1081,11 @@ la coordenada y de la pared inferior sería la altura de la pantalla, menos el m
.Pantalla/alto DEI2 .Pantalla/alto DEI2
MARGEN-PARED SUB2 ( altura - margen ) MARGEN-PARED SUB2 ( altura - margen )
GTH2 ( ¿es la pelota-y mayor que la pared-y? ) GTH2 ( ¿es la pelota-y mayor que la pared-y? )
,&establecer-veloc-neg JCN ,&establecer-vel-neg JCN
&continuar JMP &continuar JMP
&establecer-veloc-neg &establecer-vel-neg
PELOTA-VELOC-NEG .pelota/veloc-y STZ2 PELOTA-VEL-NEG .pelota/vel-y STZ2
&continuar &continuar
``` ```
@ -1097,13 +1097,13 @@ nuestra subrutina de actualización de la pelota tiene el siguiente aspecto ahor
@actualiza-pelota ( -- ) @actualiza-pelota ( -- )
( actualizar x ) ( actualizar x )
( obtener velocidad-x y x ) ( obtener velocidad-x y x )
.pelota/speed-x LDZ2 .pelota/x LDZ2 .pelota/vel-x LDZ2 .pelota/x LDZ2
ADD2 ( sumarlas ) ADD2 ( sumarlas )
.pelota/x STZ2 ( guardar la nueva x ) .pelota/x STZ2 ( guardar la nueva x )
( actualizar y ) ( actualizar y )
( obtener velocidad-y e y ) ( obtener velocidad-y e y )
.pelota/veloc-y LDZ2 .pelota/y LDZ2 .pelota/vel-y LDZ2 .pelota/y LDZ2
ADD2 ( sumarlos ) ADD2 ( sumarlos )
.pelota/y STZ2 ( almacenar nueva y ) .pelota/y STZ2 ( almacenar nueva y )
@ -1112,11 +1112,11 @@ nuestra subrutina de actualización de la pelota tiene el siguiente aspecto ahor
.pelota/y LDZ2 .pelota/y LDZ2
MARGEN-PARED MARGEN-PARED
LTH2 ( ¿es la pelota-y menor que el margen? ) LTH2 ( ¿es la pelota-y menor que el margen? )
,&establecer-veloc-pos JCN ,&establecer-vel-pos JCN
,&verif-pared-inf JMP ,&verif-pared-inf JMP
&establecer-veloc-pos &establecer-vel-pos
PELOTA-VELOC-POS .pelota/veloc-y STZ2 PELOTA-VEL-POS .pelota/vel-y STZ2
&continuar JMP &continuar JMP
&verif-pared-inf &verif-pared-inf
@ -1124,11 +1124,11 @@ nuestra subrutina de actualización de la pelota tiene el siguiente aspecto ahor
.pantalla/alto DEI2 .pantalla/alto DEI2
MARGEN-PARED SUB2 ( altura - margen ) MARGEN-PARED SUB2 ( altura - margen )
GTH2 ( ¿es la pelota-y mayor que la pared-y? ) GTH2 ( ¿es la pelota-y mayor que la pared-y? )
,&establecer-veloc-neg JCN ,&establecer-vel-neg JCN
&continuar JMP &continuar JMP
&establecer-veloc-neg &establecer-vel-neg
PELOTA-VELOC-NEG .pelota/veloc-y STZ2 PELOTA-VEL-NEG .pelota/vel-y STZ2
&continuar &continuar
RTN RTN
``` ```
@ -1149,12 +1149,12 @@ para ello, podemos comprobar si x es menor que la suma del margen y el ancho de
( dentro de actualiza-pelota ) ( dentro de actualiza-pelota )
&verif-pala-izq &verif-pala-izq
.pelota/x LDZ2 .pelota/x LDZ2
MARGEN ALTO-PALA ADD2 MARGEN ANCHO-PALA ADD2
LTH2 ( ¿es la pelota-x menor que el margen + el ancho-de-pala? ) LTH2 ( ¿es la pelota-x menor que el margen + el ancho-de-pala? )
,&x-en-izq JCN ,&x-en-izquierda JCN
,&verif-pala-der JMP ,&verif-pala-der JMP
&x-en-izq &x-en-izquierda
( ... ) ( ... )
&verif-pala-der &verif-pala-der
@ -1171,20 +1171,20 @@ si esas dos condiciones se cumplen, entonces podemos establecer una velocidad po
``` ```
( dentro de actualiza-pelota ) ( dentro de actualiza-pelota )
&x-en-izq &x-en-izquierda
.pelota/y LDZ2 DUP2 .pelota/y LDZ2 DUP2
.izquierda/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH .izquierda/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH
.izquierda/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera ) .izquierda/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera )
STHr ( recupera la primera bandera ) STHr ( recupera la primera bandera )
AND ( hacer AND en ambas banderas ) AND ( hacer AND en ambas banderas )
&rebote-izq JCN &rebote-izquierda JCN
``` ```
donde rebote-izq sería: donde rebote-izquierda sería:
``` ```
&rebote-izq &rebote-izquierda
PELOTA-VELOC-POS .pelota/veloc-x STZ2 PELOTA-VEL-POS .pelota/vel-x STZ2
,&fin JMP ,&fin JMP
``` ```
@ -1192,17 +1192,17 @@ donde rebote-izq sería:
podemos dejar que la pelota siga moviéndose, pero comprobando que no ha cruzado la pared izquierda, comparando con 0000. podemos dejar que la pelota siga moviéndose, pero comprobando que no ha cruzado la pared izquierda, comparando con 0000.
todo el código x-en-izq terminaría pareciendo: todo el código x-en-izquierda terminaría pareciendo:
``` ```
( dentro de actualiza-pelota ) ( dentro de actualiza-pelota )
&x-en-izq &x-en-izquierda
.pelota/y LDZ2 DUP2 .pelota/y LDZ2 DUP2
.izquierda/y LDZ2 BALL-SIZE SUB2 GTH2 ( primera bandera ) STH .izquierda/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH
.izquierda/y LDZ2 PADDLE-HEIGHT ADD2 LTH2 ( segunda bandera ) .izquierda/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera )
STHr ( recupera la primera bandera ) STHr ( recupera la primera bandera )
AND ( hacer AND en ambas banderas ) AND ( hacer AND en ambas banderas )
,&rebote-izq JCN ,&rebote-izquierda JCN
.pelota/x LDZ2 #0000 NEQ2 ( ¿ha llegado a la pared? ) .pelota/x LDZ2 #0000 NEQ2 ( ¿ha llegado a la pared? )
,&fin JCN ,&fin JCN
@ -1214,7 +1214,7 @@ todo el código x-en-izq terminaría pareciendo:
,&fin JMP ,&fin JMP
&rebote-izquierda &rebote-izquierda
PELOTA-VELOC-POS .pelota/veloc-x STZ2 PELOTA-VEL-POS .pelota/vel-x STZ2
,&fin JMP ,&fin JMP
&verif-pala-der &verif-pala-der
@ -1230,3 +1230,40 @@ si comprobáramos que la coordenada x es menor que ffff, ¡entonces cada valor p
este puede ser otro buen ejercicio para ti: ¿cómo comprobarías si la bola ha cruzado la pared izquierda independientemente de su velocidad? este puede ser otro buen ejercicio para ti: ¿cómo comprobarías si la bola ha cruzado la pared izquierda independientemente de su velocidad?
### pala derecha
para la pala derecha haremos lo mismo que arriba, pero cambiando las comparaciones relativas a la coordenada x de la pelota: usaremos el ancho de la pantalla como referencia para la pared derecha, y a partir de ahí le restaremos el margen y el ancho.
```
&verif-pala-der
.pelota/x LDZ2 TAM-PELOTA ADD2 ( pelota-x + tamaño-pelota )
.Pantalla/ancho DEI2 MARGEN SUB2 ANCHO-PALA SUB2
GTH2 ( ¿es la coordenada derecha de la bola mayor que el ancho de la pantalla - margen - ancho de la paleta? )
,&x-en-derecha JCN
&fin JMP
&x-en-derecha
.pelota/y LDZ2 DUP2
.derecha/y LDZ2 TAM-PELOTA SUB2 GTH2 ( primera bandera ) STH
.derecha/y LDZ2 ALTO-PALA ADD2 LTH2 ( segunda bandera )
STHr ( recupera la primera bandera )
AND ( juntar las dos banderas )
,&rebote-derecha JCN
.pelota/x LDZ2
.Pantalla/ancho DEI2 NEQ2 ( ¿ha llegado a la pared? )
,&fin JCN
&reset-derecha
( aquí puedes aumentar la puntuación
de la paleta izquierda )
;reset JSR2
,&fin JMP
&rebote-derecha
PELOTA-VEL-NEG .pelota/vel-x STZ2
,&fin JMP
&fin
RTN
```