Animações dirigidas por Máquinas de Estado reais (.riv) — você envia a intenção e o arquivo calcula a transição.
Diferente de uma timeline tradicional que apenas avança ou volta frames, o Rive executa uma máquina de estados (State Machine) inteligente dentro do arquivo .riv. A página altera uma entrada nomeada (booleano, número ou gatilho) e o arquivo decide de forma autônoma como transicionar entre poses, expressões e movimentos.
O fluxo é dividido em 4 etapas: 1. O usuário interage com a interface; 2. O JavaScript define o valor de uma entrada (ex.: Level = 2 ou bump.fire()); 3. A máquina de estados avalia as condições internas; 4. O Rive renderiza a transição suave no <canvas> em tempo real.
isHovered = true
Ex.: hover, menu aberto, modo escuro.
level = 2
Ex.: nível de habilidade, progresso, estágio.
bump.fire()
Ex.: solavanco, clique/like, impacto único.
<!--
Os 3 Tipos de Entrada no Rive:
1. Booleano (T/F) : Está ligado ou desligado? (isHovered, active)
2. Número (0...N) : Qual o valor ou estágio? (level = 2)
3. Gatilho (Trigger) : Aconteceu agora? (bump.fire())
-->
<!-- Controle de nível com máquina de estados real do Rive -->
<canvas id="rive-main-canvas" style="width: 100%; height: 260px;"></canvas>
<script>
window.rive.RuntimeLoader.setWasmUrl('../../vendor/rive.wasm');
const player = new window.rive.Rive({
src: '../../assets/rive/skills.riv',
canvas: document.getElementById('rive-main-canvas'),
autoplay: true,
stateMachines: "Designer's Test",
onLoad: () => {
const inputs = player.stateMachineInputs("Designer's Test");
const level = inputs.find(i => i.name === "Level");
level.value = 2; // Transiciona visualmente para o estágio 2
}
});
</script>
Alterna entre dois estados booleanos (Intermediate vs Expert).
Dispara um solavanco na suspensão que não fica travado ligado.
<!-- Comparativo das outras 2 formas de controle do Rive -->
<!-- 1. Entrada Booleana (skills.riv -> State Machine 1) -->
<canvas id="rive-bool-canvas"></canvas>
<!-- 2. Gatilho / Trigger (vehicles.riv -> State Machine bumpy -> bump.fire()) -->
<canvas id="rive-trigger-canvas"></canvas>
<!-- Inicialização declarativa com atributo data-sw="rive" -->
<canvas
data-sw="rive"
data-sw-src="../../assets/rive/skills.riv"
data-sw-machine="Designer's Test"
data-sw-wasm="../../vendor/rive.wasm"
style="width: 220px; height: 220px; margin: 0 auto; display: block;">
</canvas>
// Instanciação programática com busca de entradas:
const canvas = document.querySelector('#meu-canvas');
const player = SWMotion.rive(canvas, {
src: 'skills.riv',
machine: "Designer's Test",
wasm: 'rive.wasm'
});
// Acessando as entradas da State Machine:
player.onLoad = () => {
const inputs = player.stateMachineInputs("Designer's Test");
const level = inputs.find(i => i.name === 'Level');
level.value = 2; // Muda de estado instantaneamente
};
data-sw="rive"data-sw-src="skills.riv"data-sw-machine="Nome"data-sw-wasm="rive.wasm"data-sw-autoplaydata-sw-fit="contain"Entrada Numérica (0…N)Level = 0, 1, 2 para alternar habilidades/veículos)Entrada Booleana (T/F)isHovered = true, menu aberto, modo escuro)Entrada de Gatilho (Trigger)bump.fire() para solavancos, cliques, likes)onLoadonStateChangeSWMotion.rive(canvas, options)player.stateMachineInputs("Nome")input.value = valorinput.fire()player.pause("Nome") / player.play("Nome")ResizeObserver para reajustar o buffer de desenho na resolução exata da tela e evitar borrões.prefers-reduced-motion..riv.vendor/rive-2.40.0.js e vendor/rive.wasm carregados na página.