{"id":225,"date":"2022-08-31T01:23:32","date_gmt":"2022-08-31T00:23:32","guid":{"rendered":"https:\/\/specnext.dev\/es\/?p=225"},"modified":"2022-08-31T01:26:07","modified_gmt":"2022-08-31T00:26:07","slug":"sprites-2-rotando-voy","status":"publish","type":"post","link":"https:\/\/specnext.dev\/es\/2022\/08\/31\/sprites-2-rotando-voy\/","title":{"rendered":"Sprites 2, rotando voy\u2026"},"content":{"rendered":"<p>En este art\u00edculo daremos un pasito m\u00e1s en el tratamiento de los sprites.<\/p>\n<p>\u00a0<\/p>\n<h1>Antes de empezar<\/h1>\n<p>Si es la primera vez que llegas aqu\u00ed, te recomiendo que consultes antes estos art\u00edculos:<\/p>\n<ul>\n<li><a href=\"https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/\">Preparando el ambiente para programar para Next con Boriel ZX Basic y NextBuild<\/a><\/li>\n<li><a href=\"https:\/\/specnext.dev\/es\/2022\/07\/31\/sprites-101\/\">Sprites 101<\/a><\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<h1>El objetivo<\/h1>\n<p>En este art\u00edculo hablaremos sobre algunas capacidades \u201cextra\u201d de los sprites relacionadas con la rotaci\u00f3n, espejos horizontales y verticales, y la paleta de colores. En el art\u00edculo anterior \u201c<a href=\"https:\/\/specnext.dev\/es\/2022\/07\/31\/sprites-101\/\">Sprites 101<\/a>\u201d vimos como crear sprites y dibujarlos en la pantalla, hoy vamos a jugar un poco con las posibilidades del m\u00e9todo \u201cUpdateSprite\u201d que nos proporciona NextLib.<\/p>\n<p>Vamos a trabajar solo con sprites de 8 bits, ya que me parecen m\u00e1s interesantes, al mismo tiempo que sencillos, al coincidir un pixel con un byte. Pod\u00e9is encontrar el archivo de sprites dentro del proyecto \u201cNextSprites2.zip\u201d, en la carpeta \u201cdata\u201d<\/p>\n<p>\u00a0<\/p>\n<h1>El proyecto<\/h1>\n<p>En la secci\u00f3n \u201cRecursos\u201d del final de este art\u00edculo pod\u00e9is descargar el proyecto completo con todos los ficheros, incluido el fichero de sprites y todo el c\u00f3digo .bas<\/p>\n<p>Vamos a crear una carpeta \u201cNextSprites2\u201d dentro de la carpeta \u201cC:\\ZXNext\\NextBuildv7\\Sources\\\u201d, y dentro colocaremos el contenido del fichero \u201cNextSprites2.zip\u201d, quedando algo parecido a esto:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-226 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Proyecto.png\" alt=\"\" width=\"194\" height=\"86\" \/><\/p>\n<p>\u00a0<\/p>\n<h1>UpdateSprite<\/h1>\n<p>El m\u00e9todo UpdateSprite require los siguientes par\u00e1metros:<\/p>\n<ul>\n<li><strong>x (uinteger)<\/strong>: Posici\u00f3n X del Sprite, de 0 a 320<\/li>\n<li><strong>y (ubyte)<\/strong>: Posici\u00f3n Y del Sprite, de 0 a 256<\/li>\n<li><strong>spriteId (ubyte)<\/strong>: Identificador del Sprite con el que queremos trabajar, de 0 a 128<\/li>\n<li><strong>pattern (ubyte)<\/strong>: Patr\u00f3n\/imagen que utilizaremos para el Sprite indicado de 0 a 63 para sprites de 8 bits<\/li>\n<li><strong>mflip (ubyte)<\/strong>: Atributo 2*<\/li>\n<li><strong>anchor (ubyte)<\/strong>: Atributo 4*<\/li>\n<\/ul>\n<p>Como ya explicamos en el art\u00edculo anterior, X e Y funcionan a resoluci\u00f3n de 320\u00d7256, aunque los podemos configurar para que solo sean visibles dentro de la resoluci\u00f3n cl\u00e1sica de 256\u00d7192. En ese caso, el Sprite empieza a ser visible a partir de la coordenada (32,32), que ser\u00eda la esquina superior izquierda, y dejan de ser visibles en las coordenadas (287,223), que es la esquina inferior derecha en la resoluci\u00f3n cl\u00e1sica de 256\u00d7192.<\/p>\n<ul>\n<li><strong>spriteId<\/strong> indica el Sprite con el que queremos trabajar. Podemos tener hasta 128 sprites, aunque solo se garantiza la impresi\u00f3n de 100 de ellos en pantalla.<\/li>\n<li><strong>pattern<\/strong> indica el n\u00famero del gr\u00e1fico, dentro de nuestro archivo de sprites .spr, que utilizaremos para el spriteId que hemos generado. Esto nos permite usar el mismo patr\u00f3n\/imagen para dos sprites diferentes, o cambiar el patr\u00f3n\/imagen de un Sprite, por ejemplo, para simular un movimiento.<\/li>\n<li><strong>mflip<\/strong>, que as\u00ed se etiqueta en NextLib, realmente equivale a parte del atributo 2 de los sprites, y que veremos en detalle un poco m\u00e1s abajo.<\/li>\n<li><strong>anchor<\/strong>, representa el atributo 4 de los sprites, que veremos en el siguiente art\u00edculo.<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<h1>mflip: Atributo 2<\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-227\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Atributo2-300x63.png\" alt=\"\" width=\"300\" height=\"63\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Atributo2-300x63.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Atributo2.png 449w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<ul>\n<li><strong>PPPP (bits 4 a 7)<\/strong>: Son cuatro bits que representan el desplazamiento sobre la paleta de 4 bits, lo que nos permite \u201cjugar\u201d con efectos de paleta que solo afectan a los sprites.<\/li>\n<li><strong>XM (bit 3)<\/strong>: Controla el espejo horizontal. Si este bit est\u00e1 a 1, el Sprite se refleja horizontalmente, si es 0 se muestra tal como est\u00e1 definido en el patr\u00f3n\/imagen.<\/li>\n<li><strong>YM (bit 2)<\/strong>: Controla el espejo vertical. De forma similar a XM, cuando est\u00e1 a 1 hace que el Sprite se refleje verticalmente.<\/li>\n<li><strong>R (bit 1)<\/strong>: Hace que el Sprite se rote 90 grados en el sentido de las agujas del reloj.<\/li>\n<li><strong>X8\/PR (bit 0)<\/strong>: Este bit se machaca con la parte alta de la coordenada X, por lo que su valor es ignorado.<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<h1>Sprites2.bas<\/h1>\n<p>El c\u00f3digo de ejemplo de este proyecto es similar al que ya hemos visto en el art\u00edculo anterior. Este es el c\u00f3digo completo:<\/p>\n<p><code>' -----------------------------------------------------------------------------<br \/>\n' - Sprites2 ------------------------------------------------------------------<br \/>\n' - Licencia MIT (Haz lo que quieras con el c\u00f3digo) ---------------------------<br \/>\n' - Gr\u00e1ficos por F3M0 (@Bit_fans -> https:\/\/twitter.com\/bit_fans) -------------<br \/>\n' -----------------------------------------------------------------------------<br \/>\n<\/code><code><br \/>\n' - Includes ------------------------------------------------------------------<\/code><br \/>\n<code>#include <NextLib.bas><br \/>\n<\/code><code><br \/>\n' - Inicio --------------------------------------------------------------------<\/code><br \/>\n<code>Main()<\/code><br \/>\n<code>stop<br \/>\n<\/code><code><br \/>\n' - Sub principal -------------------------------------------------------------<\/code><br \/>\n<code>sub Main()<\/code><br \/>\n<code>\u00a0 dim contador, paleta as ubyte<br \/>\n<\/code><code><br \/>\n' Inicializamos el sistema<\/code><br \/>\n<code>\u00a0 Inicializar()<br \/>\n<\/code><code><br \/>\n' Par\u00e1metros mflip<\/code><br \/>\n<code>\u00a0 print at 0,0;ink 5;\"Parametro mflip\"<\/code><br \/>\n<code>\u00a0 print at 1,0;\" -- XM YM R \"<\/code><br \/>\n<code>\u00a0 UpdateSprite( 40,48,0,0,0,0) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0' Sin atributos<\/code><br \/>\n<code>\u00a0 UpdateSprite( 64,48,1,0,%00001000,0) \u00a0 \u00a0' XM - Espejo horizontal (bit 3)<\/code><br \/>\n<code>\u00a0 UpdateSprite( 88,48,2,0,%00000100,0) \u00a0 \u00a0' YM - Espejo vertical (bit 2)<\/code><br \/>\n<code>\u00a0 UpdateSprite(112,48,3,0,%00000010,0) \u00a0 \u00a0' R - Rotaci\u00f3n 90 grados (bit 1)<br \/>\n<\/code><code><br \/>\n' Rotaciones<\/code><br \/>\n<code>\u00a0 print at 5,0;ink 6;\"Rotaciones\"<\/code><br \/>\n<code>\u00a0 print at 6,3;\"Norte: Sin parametros\"<\/code><br \/>\n<code>\u00a0 UpdateSprite(40, 80,4,0,0,0) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0' Sin par\u00e1metros'<\/code><br \/>\n<code>\u00a0 print at 9,3;\"Este: R (bit 1)\"<\/code><br \/>\n<code>\u00a0 UpdateSprite(40,104,5,0,%00000010,0) \u00a0 \u00a0' Rotar 90 grados (bit 1)<\/code><br \/>\n<code>\u00a0 print at 12,3;\"Sur: XM + YM (bits 3+2)\"<\/code><br \/>\n<code>\u00a0 UpdateSprite(40,128,6,0,%00001100,0) \u00a0 \u00a0' Espejo horizontal + espejo vertical (bit 3+2)<\/code><br \/>\n<code>\u00a0 print at 15,3;\"Oeste: XM + R (bits 3+1)\"<\/code><br \/>\n<code>\u00a0 UpdateSprite(40,152,7,0,%00001010,0) \u00a0 \u00a0' Espejo horizontal + rotaci\u00f3n 90 (bit 3+1)<br \/>\n<\/code><code><br \/>\n' Bucle de rotaci\u00f3n de la paleta<\/code><br \/>\n<code>\u00a0 contador=0<\/code><br \/>\n<code>\u00a0 while inkey$=\"\" \u00a0 \u00a0 ' Repetimos hasta que se pulse una tecla'<\/code><br \/>\n<code>\u00a0 \u00a0 print at 18,0;ink 6;\"Paleta \";contador<br \/>\n<\/code><code><br \/>\n' El desplazamiento de la paleta se define en los bits 4 a 7<\/code><br \/>\n<code>\u00a0 \u00a0 paleta=contador << 5 \u00a0 \u00a0' En este caso desplazaremos el contador x 2, por eso rotamos 5 bytes en vez de 4<\/code><br \/>\n<code>\u00a0 \u00a0 if contador=7 then \u00a0 \u00a0 \u00a0' Contamos de 0 a 7<\/code><br \/>\n<code>\u00a0 \u00a0 \u00a0 contador=0<\/code><br \/>\n<code>\u00a0 \u00a0 else<\/code><br \/>\n<code>\u00a0 \u00a0 \u00a0 contador=contador+1<\/code><br \/>\n<code>\u00a0 \u00a0 end if<br \/>\n<\/code><code><br \/>\n' Mostramos 4 sprites con el mismo patr\u00f3n y paleta<\/code><br \/>\n<code>\u00a0 \u00a0 UpdateSprite(40,184,8,1,paleta,0)<\/code><br \/>\n<code>\u00a0 \u00a0 UpdateSprite(56,184,9,1,paleta,0)<\/code><br \/>\n<code>\u00a0 \u00a0 UpdateSprite(72,184,10,1,paleta,0)<\/code><br \/>\n<code>\u00a0 \u00a0 UpdateSprite(88,184,11,1,paleta,0)<br \/>\n<\/code><code><br \/>\n' Pausa para ralentizar la animaci\u00f3n<\/code><br \/>\n<code>\u00a0 \u00a0 asm<\/code><br \/>\n<code>\u00a0 \u00a0 \u00a0 halt<\/code><br \/>\n<code>\u00a0 \u00a0 end asm<\/code><br \/>\n<code>\u00a0 wend<\/code><br \/>\n<code>end sub<br \/>\n<\/code><code><br \/>\n' - Inicializa el sistema -----------------------------------------------------<\/code><br \/>\n<code>sub Inicializar()<\/code><br \/>\n<code>\u00a0 NextReg($07,3) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0' Velocidad del procesador a 28MHz<br \/>\n<\/code><code><br \/>\n' Inicializamos ULA<\/code><br \/>\n<code>\u00a0 border 0: paper 0: ink 7: cls<br \/>\n<\/code><code><br \/>\n' Inicializamos Layer2<\/code><br \/>\n<code>\u00a0 NextReg($15,%00001001) \u00a0' Activamos Sprites y layers como SUL<\/code><br \/>\n<code>\u00a0 ShowLayer2(1) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ' Mostramos la layer 2<br \/>\n<\/code><code><br \/>\n' Creamos los sprites<\/code><br \/>\n<code>\u00a0 LoadSD(\"Sprites2.spr\",$c000,$4000,0) \u00a0 ' Cargamos los sprites en $c000<\/code><br \/>\n<code>\u00a0 InitSprites(2,$c000) \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0' Inicializamos 10 sprites<\/code><br \/>\n<code>end sub<\/code><\/p>\n<p>\u00a0<\/p>\n<p>Tenemos una SUB Inicializar, que prepara el sistema, y un m\u00e9todo Main que implementa el ejemplo.<\/p>\n<p>\u00a0<\/p>\n<h2>Rotaci\u00f3n y espejo<\/h2>\n<p>Para este ejemplo usaremos el patr\u00f3n\/imagen 0:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-232 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite0.png\" alt=\"\" width=\"1068\" height=\"797\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite0.png 1068w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite0-300x224.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite0-1024x764.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite0-768x573.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite0-131x98.png 131w\" sizes=\"auto, (max-width: 1068px) 100vw, 1068px\" \/><\/p>\n<p>En la primera parte, despu\u00e9s del comentario \u201cPar\u00e1metros mflip\u201d, imprimimos 4 sprites (0 a 3) activando los atributos espejo horizontal, espejo vertical y rotaci\u00f3n para ver su efecto por separado.<\/p>\n<p>UpdateSprite( 64,48,1,0,%00001000,0)<\/p>\n<p>En este caso imprimimos el Sprite 1 en las coordenadas 64,48 que para la ULA cl\u00e1sica ser\u00edan las coordenadas 32,16, usando el patr\u00f3n\/imagen 0, con el atributo \u201cEspejo horizontal\u201d (bit 3) activado.<\/p>\n<p>El s\u00edmbolo % en Boriel ZX Basic significa que el valor se representa en binario. Un byte est\u00e1 compuesto por 8 bits, es decir por ocho ceros o unos, que normalmente se enumeran de izquierda a derecha empezando por el 0, as\u00ed que el bit 3 es el cuarto d\u00edgito empezando por la izquierda.<\/p>\n<p>A partir del comentario \u201cRotaciones\u201d, imprimimos otros 4 sprites (del 4 al 7) del patr\u00f3n\/imagen 0, mezclando los diferentes atributos de espejo y rotaci\u00f3n para conseguir que la bandera apunte hacia los 4 puntos cardinales, tal como vemos en la imagen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-233 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Demo.png\" alt=\"\" width=\"960\" height=\"756\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Demo.png 960w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Demo-300x236.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Demo-768x605.png 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/p>\n<p>En el siguiente caso estamos haciendo un espejo horizontal (bit 3) y una rotaci\u00f3n (bit 1):<\/p>\n<p>UpdateSprite(40,152,7,0,%00001010,0)<\/p>\n<p>\u00a0<\/p>\n<h2>Paleta<\/h2>\n<p>A partir del comentario \u201cBucle de rotaci\u00f3n de la paleta\u201d, podemos ver un ejemplo de rotaci\u00f3n de la paleta. Para ello usamos el patr\u00f3n\/imagen 1 de los sprites:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-234 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite1.png\" alt=\"\" width=\"1053\" height=\"797\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite1.png 1053w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite1-300x227.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite1-1024x775.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite1-768x581.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Sprite1-131x98.png 131w\" sizes=\"auto, (max-width: 1053px) 100vw, 1053px\" \/><\/p>\n<p>Vamos a imprimir 4 veces seguidas el mismo patr\u00f3n\/imagen usando 4 sprites diferentes, y aplic\u00e1ndole el mismo atributo.<\/p>\n<p>La variable \u201ccontador\u201d cuenta de 0 a 7, y la variable \u201cpaleta\u201d nos ayuda a crear el atributo adecuado.<\/p>\n<p>El primer factor a tener en cuenta es que para no complicar m\u00e1s el tema, utilizaremos la paleta por defecto del Next, por lo que vamos a utilizar los colores: 0, 32, 64, 96, 128, 160, 192 y 224. Para crear esta secuencia, desplazaremos 5 bits a la izquierda el \u201ccontador\u201d con el operador \u201c<<\u201d que sirve para desplazar bits a la izquierda. Normalmente deber\u00edamos desplazar 4 bits el valor del contador, pero para conseguir la secuencia deseada, rotamos 5 bits.<\/p>\n<p>La secuencia se repite de forma indefinida, lo que hace que se produzca un efecto de movimiento, cuando realmente los sprites no se mueven.<\/p>\n<p>\u00a0<\/p>\n<h1>Conclusiones<\/h1>\n<p>Podemos ahorrar memoria definiendo solo parte de los sprites que necesitamos, y adem\u00e1s podemos crear efectos chulos con la paleta, pero a\u00fan hay m\u00e1s\u2026<\/p>\n<p>En el siguiente art\u00edculo seguiremos trabajando con los sprites para intentar desgranar todas, o casi todas, sus posibilidades.<\/p>\n<p>\u00a0<\/p>\n<h1>Menciones y agradecimientos<\/h1>\n<p>Como siempre, a Boriel y a em00K por su labor, y muy especialmente a mis mecenas que me apoyan de forma incondicional.<\/p>\n<p>\u00a0<\/p>\n<h1>Recursos<\/h1>\n<ul>\n<li>Proyecto completo:\u00a0 <a href=\"https:\/\/1drv.ms\/u\/s!ArCJF44YRdJrl7ZnmZva7aioTdLO4A?e=RqWNw9\">NextSprites2.zip<\/a><\/li>\n<\/ul>\n<p>\u00a0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo daremos un pasito m\u00e1s en el tratamiento de los sprites. \u00a0 Antes de empezar Si es la primera vez que llegas aqu\u00ed, te recomiendo que consultes antes estos art\u00edculos: Preparando el ambiente para programar para Next con Boriel ZX Basic y NextBuild Sprites 101 \u00a0 El objetivo En este art\u00edculo hablaremos sobre [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":233,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[13,3],"tags":[7,8,16],"class_list":["post-225","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-boriel-zx-basic","category-desarrollo","tag-boriel-zx-basic","tag-nextlib","tag-sprites"],"jetpack_featured_media_url":"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/08\/Sprites2-Demo.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/comments?post=225"}],"version-history":[{"count":12,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/225\/revisions"}],"predecessor-version":[{"id":242,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/225\/revisions\/242"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media\/233"}],"wp:attachment":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media?parent=225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/categories?post=225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/tags?post=225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}