{"id":215,"date":"2022-07-31T02:15:03","date_gmt":"2022-07-31T01:15:03","guid":{"rendered":"https:\/\/specnext.dev\/es\/?p=215"},"modified":"2022-07-31T02:15:03","modified_gmt":"2022-07-31T01:15:03","slug":"sprites-101","status":"publish","type":"post","link":"https:\/\/specnext.dev\/es\/2022\/07\/31\/sprites-101\/","title":{"rendered":"Sprites 101"},"content":{"rendered":"<p>En este art\u00edculo veremos c\u00f3mo crear sprites desde cero, y darles vida en nuestro Next usando Boriel ZX Basic, NextLib y las herramientas de Remy Sharp.<\/p>\n<p>Antes de empezar con este art\u00edculo, deber\u00edas haber preparado tu ambiente de programaci\u00f3n con NextBuild: <a href=\"https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/\">https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/<\/a><\/p>\n<p>&nbsp;<\/p>\n<h1>El personaje<\/h1>\n<p>Para este tutorial vamos a mostrar un personaje de 16&#215;16 pixels en pantalla, que haremos que camine alternando 4 frames. Como mis habilidades de dibujo son nulas, he comprado en Itch.io un pack de gr\u00e1ficos creado por Vryell, llamado \u201cTiny Village Pack\u201d, y he seleccionado un personaje.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-217 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Original-4x.png\" alt=\"\" width=\"575\" height=\"120\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Original-4x.png 575w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Original-4x-300x63.png 300w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h1>Creando los sprites<\/h1>\n<p>Vamos a crear 4 sprites a partir de la imagen original. Para ello utilizaremos las herramientas de Remmy Sharp: <a href=\"https:\/\/zx.remysharp.com\/sprites\/\">https:\/\/zx.remysharp.com\/sprites\/<\/a><\/p>\n<p>Seleccionamos la pesta\u00f1a \u201cImport\u201d y arrastramos el fichero con las im\u00e1genes sobre la pantalla del navegador.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-218 size-large\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Import-1024x738.png\" alt=\"\" width=\"800\" height=\"577\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Import-1024x738.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Import-300x216.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Import-768x553.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Import.png 1088w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>En el \u00e1rea de sprites de la izquierda, seleccionamos el primer cuadro y pulsamos el bot\u00f3n \u201cCopy in\u201d. SI ahora seleccionamos la pesta\u00f1a \u201cSprite editor, veremos que el Sprite se puede haber copia cortado o incompleto.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-219 size-large\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor1-1024x751.png\" alt=\"\" width=\"800\" height=\"587\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor1-1024x751.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor1-300x220.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor1-768x563.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor1.png 1061w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Para solucionar esto, volvemos a la pesta\u00f1a \u201cImport\u201d y movemos la imagen con el rat\u00f3n o con las teclas \u201cMay\u00fasculas + Flecha\u201d o \u201cControl + May\u00fasculas + Flecha\u201d. Volvemos a pulsar \u201cCopy in\u201d y repetimos la operaci\u00f3n hasta que tenemos el Sprite deseado.<\/p>\n<p>En este ejemplo las im\u00e1genes ocupan 16&#215;16, pero podemos crear sprites m\u00e1s grandes juntando varios, para ello podemos ir jugando con las opciones \u201cDimension\u201d y \u201cAuto repeat impot\u201d.<\/p>\n<p>Repetimos la operaci\u00f3n con las tres im\u00e1genes restantes, eso s\u00ed, seleccionamos el segundo, tercer y cuarto caj\u00f3n de la izquierda para ir definiendo cada uno de los 4 sprites.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-220 size-large\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor2-1024x739.png\" alt=\"\" width=\"800\" height=\"577\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor2-1024x739.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor2-300x216.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor2-768x554.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor2.png 1069w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Al tratarse de un personaje animado, podemos previsualizar la animaci\u00f3n pulsando sobre el icono \u201cShow animation options\u201d.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-221 size-large\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor.Animacion-1024x621.png\" alt=\"\" width=\"800\" height=\"485\" srcset=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor.Animacion-1024x621.png 1024w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor.Animacion-300x182.png 300w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor.Animacion-768x466.png 768w, https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Editor.Animacion.png 1273w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Ahora, pulsamos sobre el bot\u00f3n \u201cDownload spritesheet\u201d y le damos el nombre \u201cChica.spr\u201d<\/p>\n<p>&nbsp;<\/p>\n<h1>Creando las carpetas del programa<\/h1>\n<p>Abriremos la carpeta \u201cC:\\ZXNext\\NextBuildv7\\Sources\\\u201d desde Visual Studio Code, tal como vimos en el post: <a href=\"https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/\">https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/<\/a><\/p>\n<p>Vamos a crear una carpeta que llamaremos \u201cSprites101\u201d dentro de \u201cC:\\ZXNext\\NextBuildv7\\Sources\\\u201d. Dentro de esta carpeta vamos a crear el fichero \u201cSpriteTest1.bas\u201d, que es con el que vamos a trabajar.<\/p>\n<p>Tambi\u00e9n vamos a crear una carpeta que llamaremos \u201cdata\u201d dentro de \u201cC:\\ZXNext\\NextBuildv7\\Sources\\Sprites101\u201d, y copiaremos el fichero \u201cChica.spr\u201d dentro.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-222 size-full\" src=\"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite102.Carpetas.png\" alt=\"\" width=\"239\" height=\"107\" \/><\/p>\n<p>&nbsp;<\/p>\n<h1>El c\u00f3digo<\/h1>\n<p>Abrimos el fichero \u201cSpriteTest1.bas\u201d y tecleamos el c\u00f3digo siguiente (sugiero teclearlo en vez de copiarlo y pegarlo, con el fin de analizar que hace cada l\u00ednea).<\/p>\n<p><code>' -----------------------------------------------------------------------------<\/code><br \/>\n<code>' - Sprites101 ----------------------------------------------------------------<\/code><br \/>\n<code>' - Licencia MIT (Haz lo que quieras con el c\u00f3digo) ---------------------------<\/code><br \/>\n<code>' -----------------------------------------------------------------------------<\/code><\/p>\n<p><code>' - Includes ------------------------------------------------------------------<\/code><br \/>\n<code>#include &lt;NextLib.bas&gt;<\/code><\/p>\n<p><code>' - Variables globales --------------------------------------------------------<\/code><br \/>\n<code>dim x as uinteger\u00a0\u00a0 ' Coordenada X del sprite<\/code><br \/>\n<code>dim paso as ubyte\u00a0\u00a0 ' Paso de la animaci\u00f3n<\/code><br \/>\n<code>dim animacion(5) as ubyte =&gt; { 0,1,2,3,2,1 }\u00a0 ' Secuencia de frames de la animaci\u00f3n<\/code><\/p>\n<p><code>' - Inicio --------------------------------------------------------------------<\/code><br \/>\n<code>Main()<\/code><br \/>\n<code>stop<\/code><\/p>\n<p><code>' - Sub principal -------------------------------------------------------------<\/code><br \/>\n<code>sub Main()<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 ' Inicializamos el sistema<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 Inicializar()<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 ' Inicializamos las variables del sprite<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 x=0<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 paso=0<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 ' Bucle principal<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 while inkey$=\"\"<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Mostramos el sprite en pantalla<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 UpdateSprite(x,50,0,animacion(paso),0,0)<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Mover la coordenada x<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if x&lt;320 then<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=x+1<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0else<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=0<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end if<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Cambiamos el frame de la animaci\u00f3n<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if paso&lt;5 then<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paso=paso+1<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 paso=0<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end if<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Pausa para ralentizar la animaci\u00f3n<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 asm<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 halt<\/code><br \/>\n<code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 end asm<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 wend<\/code><br \/>\n<code>end sub<\/code><\/p>\n<p><code>' - Inicializa el sistema -----------------------------------------------------<\/code><br \/>\n<code>sub Inicializar()<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 NextReg($07,3)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Velocidad del procesador a 28MHz<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 ' Inicializamos Layer2<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 NextReg($15,%00001001)\u00a0 ' Activamos Sprites y layers como SUL<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 ShowLayer2(1)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Mostramos la layer 2<\/code><\/p>\n<p><code>\u00a0\u00a0\u00a0 ' Creamos los sprites<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 LoadSD(\"Chica.spr\",$c000,$4000,0)\u00a0\u00a0 ' Cargamos los sprites en $c000<\/code><br \/>\n<code>\u00a0\u00a0\u00a0 InitSprites(4,$c000)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ' Inicializamos 4 sprites<\/code><br \/>\n<code>end sub<\/code><\/p>\n<p>&nbsp;<\/p>\n<h2>Includes<\/h2>\n<p>Lo primero que nos encontramos es un \u201cinclude\u201d para a\u00f1adir la librer\u00eda NextLib. Esta librer\u00eda es necesaria para poder utilizar las caracter\u00edsticas avanzadas del Next.<\/p>\n<p>&nbsp;<\/p>\n<h2>Las variables globales<\/h2>\n<p>Acto seguido definimos tres variables:<\/p>\n<ul>\n<li><strong>x:<\/strong> Almacena la coordenada x del Sprite, que ir\u00e1 desde 0 a 320, por esa raz\u00f3n la definimos como uinteger.<\/li>\n<li><strong>paso:<\/strong> Contiene el paso de la animaci\u00f3n a mostrar.<\/li>\n<li><strong>animacion:<\/strong> Guarda la secuencia de frames que se usar\u00e1 para animar el personaje. Esta secuencia es 0, 1, 2, 3, 2, 1 y repetimos, lo que har\u00e1 que el personaje<\/li>\n<\/ul>\n<p>Despu\u00e9s se llama al SUB Main, que es la funci\u00f3n principal del programa.<\/p>\n<p>Justo despu\u00e9s nos encontramos una sentencia \u201cSTOP\u201d, que lo que hace es detener el programa. Es una buena pr\u00e1ctica colocar este comando al final de nuestro programa para que este se detenga, ya que el emulador puede entrar en bucle al terminar.<\/p>\n<p>&nbsp;<\/p>\n<h2>Inicializando el sistema<\/h2>\n<p>El SUB Main, llama al m\u00e9todo \u201cInicializar\u201d, que inicializa el sistema.<\/p>\n<p>Lo primero que hacemos es fijar la velocidad de la CPU a 28MHz:<\/p>\n<p><code>NextReg($07,3)<\/code><\/p>\n<p>El registro $07 permite controlar la velocidad de la CPU: 0=3.5Mhz (velocidad original), 1=7MHz, 2=14MHz, 3=28MHz.<\/p>\n<p>Despu\u00e9s definimos la visibilidad de los Sprites y la prioridad de las capas gr\u00e1ficas.<\/p>\n<p><code>NextReg($15,%00001001)<\/code><\/p>\n<p>El registro $15 permite configurar la visibilidad de los sprites: <a href=\"https:\/\/wiki.specnext.dev\/Sprite_and_Layers_System_Register\">https:\/\/wiki.specnext.dev\/Sprite_and_Layers_System_Register<\/a><\/p>\n<p>En nuestro caso, activamos la visibilidad de los sprites (bit 0), ocultamos los sprites fuera de la pantalla convencional, es decir, en el borde (bit 5), y definimos la prioridad de capas como Sprites encima, despu\u00e9s ULA (pantalla cl\u00e1sica) y Layer 2 al fondo (bits 4, 3 y 2).<\/p>\n<p>El comando ShowLayer hace la Layer 2 visible.<\/p>\n<p>&nbsp;<\/p>\n<h2>Inicializando los Sprites<\/h2>\n<p>Para crear un sprite se deben \u201cOUTear\u201d los datos del sprite al puerto de control de sprites $303b. \u00a0Para ello, cargamos los datos de los sprites, creados con Remy Sharp, en memoria:<\/p>\n<p><code>LoadSD(\"Chica.spr\",$c000,$4000,0)<\/code><\/p>\n<p>Con este comando, cargamos el contenido del fichero \u201cChica.spr\u201d en la direcci\u00f3n de memoria $c000. Se cargar\u00e1n 16Kb desde el fichero ($4000 = 16384 bytes), desde el principio del fichero (0). Cada pixel de un Sprite ocupa un byte, por lo que un Sprite de 16&#215;16 ocupa 256 bytes, as\u00ed que en 16Kb podemos almacenar 64 definiciones de Sprites de 16&#215;16.<\/p>\n<p>Una vez cargados, los \u201cOUTeamos\u201d con ayuda del m\u00e9todo \u201cInitSprites\u201d de NextLib:<\/p>\n<p><code>InitSprites(4,$c000)<\/code><\/p>\n<p>Esto inicializa 4 sprites ubicados a partir de la posici\u00f3n de memoria $c000<\/p>\n<p>Cabe destacar que una vez hemos inicializado los sprites, ya se pueden borrar de la memoria o machacarlos con otros datos si lo necesitamos.<\/p>\n<p>&nbsp;<\/p>\n<h2>Bucle principal<\/h2>\n<p>Una vez inicializado el sistema y definidos los sprites, reseteamos las variables \u201cx\u201d y \u201cpaso\u201d.<\/p>\n<p>Definimos un bucle del tipo WHILE\u2026WEND, que se repetir\u00e1 hasta que pulsemos una tecla.<\/p>\n<p><code>while inkey$=\"\"<\/code><\/p>\n<p>Dentro de este bucle, lo primero que hacemos es mostrar el Sprite en pantalla.<\/p>\n<p><code>UpdateSprite(x,50,0,animacion(paso),0,0)<\/code><\/p>\n<p>Coloca el Sprite en la coordenada horizontal definida por la variable global \u201cx\u201d y la coordenada vertical fija 50.<br \/>\nUsaremos el Sprite 0, y mostraremos la definici\u00f3n de Sprite indicada por la variable \u201canimaci\u00f3n(paso)\u201d.<\/p>\n<p>Los par\u00e1metros adicionales \u201c0,0\u201d indican que el Sprite se muestre sin modificadores, es decir, sin escalar, rotar ni aplicando espejo.<\/p>\n<p>Lo siguiente es incrementar la coordenada \u201cx\u201d del Sprite hasta que tenga el valor de 320, y en ese caso la resetemos a 0.<\/p>\n<p>La pantalla del Next en Layer 2 puede trabajar a 256&#215;192, misma resoluci\u00f3n que la ULA cl\u00e1sica del Spectrum) o a 320&#215;256, en cuyo caso utiliza el borde de la pantalla, es decir, no se comprime la imagen, sino que se amplia al borde.<br \/>\nLos Sprites siempre utilizan la resoluci\u00f3n de 320&#215;256, por esa raz\u00f3n hemos definido la variable \u201cx\u201d como uinteger, y hemos definido que los sprites no se muestren en el borde con el NextReg $15. As\u00ed que el Sprite ser\u00e1 visible entre las coordenadaas horizontales 32 a 288 y verticales 32 a 224.<\/p>\n<p>Lo siguiente que hacemos es incrementar el n\u00famero de frame a mostrar, incrementando la variable \u201cpaso\u201d hasta que vale 5.<\/p>\n<p>Por \u00faltimo, hacemos una peque\u00f1a pausa esperando a que suceda una interruci\u00f3n:<\/p>\n<p><code>asm<\/code><br \/>\n<code>\u00a0 \u00a0 \u00a0halt<\/code><br \/>\n<code>end asm<\/code><\/p>\n<p>Para ello usamos el comando HALT de assembler, que detiene la ejecuci\u00f3n hasta que se lanza la pr\u00f3xima interrupci\u00f3n. Esto permite sincronizar el programa e impedir que se produzcan \u201ctirones\u201d en la ejecuci\u00f3n del mismo.<\/p>\n<p>&nbsp;<\/p>\n<p>En un futuro art\u00edculo trataremos los temas que no se han podido tratar, como las propiedades avanzadas de los sprites: ampliaci\u00f3n, rotaci\u00f3n y espejo, ni el control de visibilidad.<\/p>\n<p>&nbsp;<\/p>\n<h1>Menciones y agradecimientos<\/h1>\n<p>Como siempre, a Boriel y a em00K por su labor.<\/p>\n<p>Los gr\u00e1ficos utilizados en este tutor\u00edal pertenecen al pack \u201cTiny Village Pack\u201d de Vryell, que pod\u00e9is encontrar en <a href=\"https:\/\/vryell.itch.io\/tiny-village-pack\">https:\/\/vryell.itch.io\/tiny-village-pack<\/a> a un precio rid\u00edculo para todo lo que ofrece.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este art\u00edculo veremos c\u00f3mo crear sprites desde cero, y darles vida en nuestro Next usando Boriel ZX Basic, NextLib y las herramientas de Remy Sharp. Antes de empezar con este art\u00edculo, deber\u00edas haber preparado tu ambiente de programaci\u00f3n con NextBuild: https:\/\/specnext.dev\/es\/2022\/07\/28\/preparando-el-ambiente-para-programar-para-next-con-boriel-zx-basic-y-nextbuild\/ &nbsp; El personaje Para este tutorial vamos a mostrar un personaje de 16&#215;16 [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":217,"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,23,16],"class_list":["post-215","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-boriel-zx-basic","category-desarrollo","tag-boriel-zx-basic","tag-nextlib","tag-nextreg","tag-sprites"],"jetpack_featured_media_url":"https:\/\/specnext.dev\/es\/wp-content\/uploads\/sites\/2\/2022\/07\/Sprite101.Original-4x.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/215","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=215"}],"version-history":[{"count":1,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/215\/revisions"}],"predecessor-version":[{"id":223,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/posts\/215\/revisions\/223"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media\/217"}],"wp:attachment":[{"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/media?parent=215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/categories?post=215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/specnext.dev\/es\/wp-json\/wp\/v2\/tags?post=215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}