Contenido generado con IA — puede contener errores.

Menús

Movimiento

Entradas, listas que aparecen una a una, animaciones en bucle o de una sola vez, texto que se escribe solo y lo que cuesta cada cosa.

Todo en una pantalla puede moverse, y nada de eso necesita Java. El movimiento se escribe en CSS, como el resto del aspecto, más una acción, animate, que reproduce una animación al hacer clic.

El movimiento es barato porque lo hace el cliente: el servidor envía hacia dónde va una caja y cuánto debe tardar, y el juego del jugador la desliza hasta allí. Una pantalla entera que aparece, una cuadrícula que se llena tarjeta a tarjeta o una insignia que late durante un minuto cuestan unas decenas de paquetes pequeños, no uno por fotograma.

Requiere ExyliaLib 1.565.0

stagger, text-reveal, la acción animate, las curvas bounce y elastic, los retrasos, repeticiones y alternate de las animaciones, y los keyframes incluidos llegaron en ExyliaLib 1.565.0. Las entradas, los levantamientos al pasar el cursor y las animaciones en bucle son anteriores.

Los cinco tipos de movimiento

QuéSe escribeSe reproduce
Un cambiotransition: transform 3t ease-out;cuando cambia un valor: un hover, un clic, una página
Una entradaenter: translateY(8px) 5t back;cuando una caja aparece por primera vez
Una salidaleave: scale(0.94) 3t ease-in;cuando una caja desaparece
Un bucle o una secuenciaanimation: float 60t ease-in-out infinite;mientras la caja se muestre
Una reacciónaction="animate pop"una vez, cuando se ejecuta la acción

Cada uno mueve la transformación de una caja: translate(x, y), translateX, translateY (píxeles, la y va hacia abajo), scale(s) y scaleX(s) (se estrecha a lo ancho, así es como una tarjeta se da la vuelta). Una caja arrastra todo lo que lleva dentro.

card { transition: transform 3t ease-out; }
card:hover { transform: translateY(-3px); }          /* se levanta bajo el cursor */
card:active { transform: scale(0.96); }              /* pulsada un instante */
.page { enter: translateX(16px) 6t ease-out; leave: translateX(-12px) 3t ease-in; }

Los tiempos son ticks (4t, o un simple 4), milisegundos (200ms) o segundos (0.3s). Veinte ticks son un segundo.

Curvas: linear, ease-in, ease-out (o ease), ease-in-out, back (se pasa un poco y se asienta), bounce (cae y rebota dos veces) y elastic (se estira y oscila hasta quedar en su sitio).

Listas que se llenan una a una

stagger en una caja hace que sus hijos lleguen uno tras otro en lugar de todos a la vez:

.modes { stagger: 4t; }
.mode { enter: translateY(12px) scale(0.94) 7t back; }

La primera tarjeta llega de inmediato, la segunda 4 ticks después, y así. Cada una espera reducida a nada hasta que le toca, y entonces reproduce su propio enter. Las filas que solo organizan el diseño (las líneas de una cuadrícula) se atraviesan, así que un grid con stagger se llena celda a celda. La espera deja de crecer a los dos segundos, de modo que una lista larga se llena rápido en lugar de gotear.

Las animaciones empiezan igual de separadas, lo que convierte un bucle en una ola: da a las tarjetas de una fila con stagger animation: float 60t ease-in-out infinite y se mecerán una tras otra.

Animaciones

.badge { animation: pulse 40t ease-in-out infinite; }
@keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.06); } 100% { transform: scale(1); } }

La forma completa es animation: <keyframes> <duración> [curva] [retraso] [repeticiones | infinite] [alternate]:

PalabraSignifica
El primer tiempoCuánto dura una reproducción.
Un segundo tiempoCuánto espera antes de empezar, manteniendo su primer fotograma.
Un númeroCuántas veces se reproduce (una sola si se omite).
infiniteSe reproduce mientras la caja se muestre.
alternateUna de cada dos reproducciones va al revés, así que el bucle va y viene.

animation-delay, animation-iteration-count y animation-direction fijan lo mismo de una en una y ganan a la forma abreviada.

Keyframes que tiene toda pantalla

El tema base de ExyliaLib trae estos, así que cualquier pantalla puede usarlos por su nombre sin escribir los suyos:

NombreHaceBueno para
shakeUn temblor rápido de lado a ladoun clic rechazado
popSe hincha y se asientauna compra, un cobro
pulseUn latido suavealgo que espera al jugador
floatSube y bajaiconos, ilustraciones
nudgeUn pequeño empujón a la derechauna flecha que dice "por aquí"
jumpUn salto grande y uno pequeñouna notificación
flipSe estrecha hasta el borde y vuelveuna tarjeta que se da la vuelta
drop-inCae un poco hasta su sitiouna entrada suelta

Las clases .anim-float, .anim-pulse y .anim-nudge repiten en bucle las tres primeras. Una hoja que declare unos keyframes con el mismo nombre usa los suyos.

Animaciones desde un clic

La acción animate reproduce una animación una vez, encima de lo que la caja ya haga:

<card id="buy-sword"
      require="balance() >= 1000"
      deny="animate shake; sound entity.villager.no 0.4; toast error 'Not enough coins'"
      action="[MONEY] take 1000; [CONSOLE] give %player_name% diamond_sword; animate pop; toast success 'Bought'">

animate pop se reproduce en el elemento pulsado, que necesita un id. animate #balance jump lo hace en otro. Después del nombre puedes añadir una duración y una curva (animate pop 8t back); sin ellas dura 10 ticks.

Un rechazo que tiembla y un éxito que se hincha es la sensación de la casa: úsalo en cada tarjeta que pueda decir que no.

Texto que se escribe solo

.headline { text-reveal: 1t; }

Las palabras aparecen un carácter por tick, cuando la caja ya ha llegado, y otra vez cada vez que cambian (un cambio de página, un valor nuevo). 2t escribe a la mitad de velocidad. Se hereda, así que en una caja escribe todo el texto que lleva dentro, y junto con stagger las líneas se escriben una tras otra:

.words { stagger: 10t; }
.words h2, .words p { text-reveal: 1t; }

Resérvalo para títulos y frases de pocas palabras: un párrafo de 90 caracteres tarda cuatro segundos y medio, y un número que cambia cada segundo se escribiría de nuevo cada segundo.

Lo que cuesta

MovimientoCoste
Una transición, una entrada o una salidaUn paquete por caja, de dos a cuatro si lleva curva (ocho con bounce/elastic).
Una lista con staggerLo mismo que si llegara toda junta, repartido en el tiempo.
Una animación en bucleUn paquete por caja cada 2 a 10 ticks mientras se muestre.
animateUn puñado de paquetes y luego nada.
text-revealUna actualización de texto cada 2 ticks mientras se escribe.

motion-ceiling en screens.yml limita los paquetes de movimiento que recibe cada jugador por segundo; al pasarlo, los deslizamientos van directos y las animaciones esperan. Un jugador que activó Movimiento reducido en /settings (o un servidor con motion: REDUCED) no ve entradas, salidas, animaciones ni texto que se escribe: la pantalla simplemente está ahí.

Los FPS del jugador

El movimiento casi no le cuesta nada al juego del jugador; lo que una pantalla muestra, sí. Cada caja, texto e ítem es una entidad display que el cliente dibuja en cada fotograma, y una imagen (<img>, una cara, un cuerpo, una imagen de fondo) es lo más pesado: cada uno de sus píxeles es un glifo que el cliente coloca cuatro veces. En una tarjeta gráfica media (RTX 3050, 1080p), todos los ejemplos incluidos mantienen el juego cerca de 120 fotogramas por segundo; las recompensas diarias, la más pesada, ocupan la tarjeta un 64 %, y un 40 % con Pantallas ligeras.

  • /screensadmin check lista cada pantalla que ha sido pesada para algún jugador desde que arrancó el servidor, con sus displays y glifos de imagen. Lo que más ayuda es usar menos imágenes o más pequeñas.
  • Un jugador con un ordenador modesto puede activar Pantallas ligeras en /settings → Interfaz: cada pantalla dibuja sus ítems como ítems 3D y deja fuera la decoración, solo para él.

Lo que Minecraft no puede dibujar

Las cajas son rectángulos planos que dibuja el propio juego, sin resource pack. Estas cosas no existen: rotación, fundidos de entrada o salida, colores que se deslizan, esquinas redondeadas, sombras alrededor de las cajas y desenfoque. Un fundido se escribe como una escala desde casi nada (enter: scale(0.6) 6t back), y un cambio de color (un hover) ocurre de golpe.

Siguiente

Las pantallas de ejemplo incluidas usan todos los tipos de movimiento de esta página.

¿Falta algo en esta página? Dínoslo en Discord