public:vj1231:fsm:start
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
| public:vj1231:fsm:start [2025/10/08 12:13] – creado mperez | public:vj1231:fsm:start [2026/10/13 16:42] (actual) – [Componentes de la FSM] mperez | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ====== Máquinas de estado finitos | + | ====== Máquinas de Estados Finitos |
| - | Una máquina | + | Una Máquinas |
| + | |||
| + | * Estados: Representan las distintas " | ||
| + | * Transiciones: | ||
| + | * Eventos o condiciones: | ||
| + | * Acciones: Lo que el NPC hace mientras está en un estado determinado (animaciones, | ||
| + | |||
| + | |||
| + | ====== ¿Cómo se modela? ====== | ||
| + | |||
| + | Las FSM pueden implementarse utilizando simples estructuras condicionales if-then-else (o switch/ | ||
| + | |||
| + | Los principales inconvenientes que plantea este enfoque son: | ||
| + | |||
| + | * | ||
| + | * | ||
| + | * | ||
| + | |||
| + | |||
| + | Existen otras formas más robustas, modulares | ||
| + | |||
| + | Las ventajas de este modelo es que cada estado encapsula su lógica lo que lo hace fácil de extender ya que añadir un nuevo estado solo requiere una nueva clase y evita grandes bloques de if/else que hacen el código ilegible. | ||
| + | |||
| + | ====== Enfoque orientado a Objetos ====== | ||
| + | ===== class State: ===== | ||
| + | |||
| + | Clase base para todos los estados del NPC. Cada estado define | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | def enter(self, npc): → Acción al entrar en el estado. | ||
| + | |||
| + | def execute(self, | ||
| + | |||
| + | def exit(self, npc): → Acción al salir del estado. | ||
| + | |||
| + | def get_next_state_class(self, | ||
| + | |||
| + | ===== class StateMachine ===== | ||
| + | |||
| + | Esta clase implementa la Máquina de estados que gestiona el estado actual de un NPC. | ||
| + | |||
| + | ===== Nuevos estados ===== | ||
| + | |||
| + | Para definir nuevos estados se define una nueva clase que hereda de State: | ||
| + | |||
| + | <code python> | ||
| + | class TimidoPatrolState(State): | ||
| + | """ | ||
| + | Estado en el que el NPC tímido patrulla por el borde. | ||
| + | """ | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | ===== Transiciones entre estados ===== | ||
| + | |||
| + | |||
| + | Las transiciones de un estado | ||
| + | |||
| + | |||
| + | Otras implementaciones definen las transiciones entre estados como un diccionario de pares ''" | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | # Definir transiciones para NPCTimido | ||
| + | TimidoPatrolState.transitions = {" | ||
| + | TimidoChaseState.transitions = {" | ||
| + | ... | ||
| + | </ | ||
| + | |||
| + | ====== Ejemplo ====== | ||
| + | |||
| + | En esta imagen se muestra el comportamiento de tres NPCs distintos modelados usando FSM. Los estados se muestran en azul los eventos que provocan las transiciones entre estados aparecen sobre las flechas. | ||
| + | |||
| + | ### 🟢 NPC Normal | ||
| + | |||
| + | Es el más simple: solo decide entre perseguir o patrullar según si detecta al jugador. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ### 🟠 NPC Tímido | ||
| + | |||
| + | Su comportamiento cambia drásticamente dependiendo de si está en " | ||
| + | - Si **está en alerta**, prioriza su seguridad (huye hacia un guardia o completa un informe). | ||
| + | - Si **no está en alerta**, se comporta de forma más agresiva (inicia la alerta si el jugador está cerca, o lo sigue si está lejos). | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | ### 🔵 NPC Guardia | ||
| + | |||
| + | tiene un comportamiento intermedio. Si no ve al jugador, actúa como un " | ||
| + | |||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | Puedes ver y ejecutar el ejemplo en este {{ : | ||
public/vj1231/fsm/start.1759925631.txt.gz · Última modificación: por mperez
