SlideShare a Scribd company logo
1 of 47
MÁQUINA DE ESTADOS:
CONTROLANDO O JOGO,
DO MENU À IA
André KishimotoWICA 2012
Hello, World!
 André Kishimoto
 UNICSUL, Electronic Arts
 andre@kishimoto.com.br
Imagens, logos e marcas usadas nessa apresentação © respectivos detentores dos direitos autorais, utilizadas única e exclusivamente com o intuito de informar e exemplificar.
Agenda
 O que é uma FSM?
 Onde FSM é aplicada
 Transições entre estados
 Representação gráfica
 FSM v0.1
 FSM v1.0
 Estados intermediários
 Estados globais
 Exemplo
 Ideias para expansão
 Q&A
Represe
ntação
gráfica
Onde
FSM é
aplicada
Transiçõ
es entre
estados
O que é
uma
FSM?
FSM
v1.0
FSM
v0.1
Estados
globais
Estados
interme
diários
Idéias
para
expansão
Exempl
o
Q&A
O que é uma FSM?
 FSM?
 Finite State Machine
 Máquina de Estados Finitos
 Historicamente
 Modelo matemático usado para modelar problemas,
projetar programas de computador e circuitos lógicos
digitais
 Máquina de Turing
 Máquina abstrata que possui um número finito de
estados e diversas transições entre esses
estados
O que é uma FSM? (cont.)
 A ideia é “quebrar” o comportamento de um objeto em
estados (ou “pedaços”) facilmente gerenciáveis
 Em um dado momento, a máquina pode estar
somente em um único estado
 Current state (estado atual)
 No geral:
 Fáceis de depurar
 Código quebrado em pedaços
 Não necessitam de muito processamento
 If-else
 Flexíveis
 Novos estados e transições podem ser adicionados à FSM
O que é uma FSM? (cont.)
http://www.brasilescola.com/fisica/circuito-simples.htm
 bool lampadaAcesa = false;
 lampadaAcesa = true;
Onde FSM é aplicada
 Fluxo de telas (estados) do jogo
 Elementos de interface (UI)
 Personagens
 Controlados pelo jogador
 NPC’s
 Objetos
 Fases
 Resumindo: em todo o jogo
Onde FSM é aplicada (cont.)
 Fluxo de telas (estados) do jogo
 Splash
 Loading inicial
 Vídeo/Animação de introdução
 Menu principal
 Créditos
 Opções
 Ajuda
 Novo Jogo
 Gameplay
 Pause
 Game over
 Fim de jogo
 Loading entre fases/telas
 Lobby
 Etc.
Onde FSM é aplicada (cont.)
 Elementos de interface (UI)
 Textos, Botões, Links, Campos de texto, Menus, Etc.
 Ativado
 Desativado
 Selecionado
 Não selecionado
 Animado
 Vísivel
 Etc.
Onde FSM é aplicada (cont.)
 Personagens
 Idle/Parado
 Andando
 Correndo
 Pulando
 Golpeando
 Morto
 Etc.
http://www.spriters-resource.com/other_systems/alexkiddmw/sheet/10911
Onde FSM é aplicada (cont.)
 Objetos
 Estático
 Animado
 Quebrado
 Visível
 Invisível
 Etc.
http://activeden.net/item/breakable-crate-prefab/1585898
Onde FSM é aplicada (cont.)
 Fases
 Início de fase
 Fim de fase
 Etc.
http://www.148apps.com/reviews/real-racing-2-review/
(Importância dos estados em GUI)
 GUI: Graphical User Interface
 Nem todas as libs/API’s/SDK’s/frameworks possuem suporte
nativo de componentes GUI, sendo necessário desenvolver
tais componentes
 Flash
 ex. Button (Up, Over, Down)
 Java desktop
 AWT/Swing
 OpenGL/DirectX/XNA
 ???
 FSM para cada componente
 Set/get: ativado/desativado, mouse over/out, clique down/up,
focus/blur, etc.
Transições entre estados
 Relação entre dois estados, indicando que o
objeto sai do estado atual e passa para o novo
estado em resposta a um evento ou condição
 Lâmpada acesa em decorrência da chave
fechada (ativando passagem de corrente)
 Define de qual estado para qual estado a
máquina deve mudar
Transições entre estados (cont.)
 Tabela de transições de estados
 Mecanismo para organizar estados e suas
transições
Estado atual Condição Transição para estado
Patrulhando Inimigo à vista && mais forte que
inimigo
Atacando
Patrulhando Inimigo à vista && mais fraco que
inimigo
Fugindo
Atacando Mais fraco que inimigo Fugindo
Atacando Inimigo morto Patrulhando
Fugindo São e salvo Patrulhando
Representação gráfica
Estado
A
Estado
Transição
Estado
B
condição
Condição para transição de A para B
Condição para transição de B para A
Representação gráfica (cont.)
 Exemplo: botão
Normal Highlighted
Mouse sobre o botão
Down
Clique
no botão
Mouse saiu de cima do botão
Mouse saiu de cima do botão
Botão liberado
Representação gráfica (cont.)
 Exemplo: personagem
Patrulhando Atacando
Inimigo à vista && mais forte que inimigo
Fugindo
Mais fraco
que inimigo
Inimigo morto
Inimigo à vista
&& mais fraco que inimigo
São e salvo
FSM v0.1
 Uso de if-else e switch-case
// Enumera os estados e define estado atual como “Patrulhando”
enum FSM_States { Patrulhando, Atacando, Fugindo };
FSM_States currentState = Patrulhando;
// Verifica o estado atual da FSM e faz transições de acordo com as condições apresentadas
switch (currentState)
{
case Patrulhando:
if (inimigoAVista())
{
if (maisForteQue(inimigo))
estadoAtual = Atacando;
else
estadoAtual = Fugindo;
}
break;
// continua no próximo slide
FSM v0.1 (cont.)
// continuação do slide anterior
case Atacando:
if (matou(inimigo))
currentState = Patrulhando;
else if (maisForteQue(inimigo) == false)
currentState = Fugindo;
break;
case Fugindo:
if (saoESalvo())
currentState = Patrulhando;
}
FSM v0.1 (cont.)
 Straight forward
 Para FSM’s bem simples…
 Alguns problemas
 Manutenção e flexibilidade
 Desastres e dor-de-cabeça
 Spaghetti code (bagunça!)
 Muitos if-else’s e switch’s aninhados
 Transição direta
 Não há ações de entrada e saída para cada estado
(enter/exit – veremos em breve)
FSM v1.0
 Existe um design pattern (padrão de projeto)
comportamental chamado State
http://en.wikipedia.org/wiki/State_pattern
FSM v1.0 (cont.)
 Padrão de Projeto:
 State
 Objetivo:
 Permitir que um objeto altere seu comportamento
quando seu estado interno é alterado.
 Aplicação:
 Use o padrão de projeto State em um dos seguintes
casos:
 O comportamento de um objeto depende de seu estado e
precisa mudar seu comportamento em tempo de execução,
dependendo do estado
 Há códigos de decisão complexos e extensos que
dependem do estado do objeto
FSM v1.0 (cont.)
 Padrão de Projeto:
 State
 Vantagens:
 Fácil de localizar responsabilidades de estados
específicos, remove if’s e switch’s monolíticos
 Mudanças de estado explícitas (getters/setters ao invés de
associar valores à variáveis)
 Estados (objetos do tipo State) podem ser compartilhados
 Facilita a expansão de estados
 Desvantagens:
 Aumenta o número de classes (subclasses) e é menos
compacto que uma única classe
FSM v1.0 (cont.)
// Interface para encapsular o comportamento associado a um estado particular de Context
public abstract class IState
{
public abstract void Handle();
}
// Cada subclasse concreta implementa o comportamento associado a um estado de Context
public class ConcreteStateA : IState
{
public override void Handle()
{
// Do something...
}
}
// continua no próximo slide
FSM v1.0 (cont.)
// continuação do slide anterior
// Cada subclasse concreta implementa o comportamento associado a um estado de Context
public class ConcreteStateB : IState
{
public override void Handle()
{
// Do something different than A...
}
}
// Mantém uma instância de uma subclasse concreta que define o estado atual
public class Context
{
protected IState mCurrentState;
public void Request()
{
mCurrentState.Handle();
}
}
FSM v1.0 (cont.)
 Para ajudar e facilitar a definição do estado
atual de um objeto, a criação de uma classe
do tipo FSM é recomendada
 Tal classe é responsável por manter o estado
atual do objeto, além de realizar as transições
de estados
 Objeto contém uma instância da classe do tipo
FSM
FSM v1.0 (cont.)
// Algumas linhas de código foram omitidas para dar ênfase no assunto
public class StateMachine // FSM
{
protected IState mCurrentState;
protected IState mPreviousState;
public void SetState(IState state) {
mPreviousState = mCurrentState;
mCurrentState = state;
}
public void RevertToPreviousState() {
SetState(mPreviousState);
mPreviousState = null;
}
public void Request() {
if (mCurrentState != null)
mCurrentState.Handle();
}
}
FSM v1.0 (cont.)
// Algumas linhas de código foram omitidas para dar ênfase no assunto
public class MyObject
{
protected StateMachine mFSM;
public void SetState(IState state) {
mFSM.SetState(state);
}
public void Update() {
mFSM.Request();
}
}
FSM v1.0 (cont.)
 O método SetState() recebe como parâmetro
um IState state, que é a instância de uma das
classes concretas que implementam IState
 Para compartilhar um estado entre vários
objetos, basta uma única instância do estado
 É possível usar o padrão de projeto criacional
chamado Singleton
http://en.wikipedia.org/wiki/Singleton_pattern
FSM v1.0 (cont.)
 Padrão de Projeto:
 Singleton
 Objetivo:
 Garante que uma classe possua apenas uma
instância e fornece um ponto global de acesso ao
objeto
 Aplicação:
 Use o padrão de projeto Singleton onde:
 Deve-se existir exatamente uma instância de uma classe,
que deve ser acessível pelos usuários a partir de um ponto
de acesso conhecido
FSM v1.0 (cont.)
 Padrão de Projeto:
 Singleton
 Vantagens:
 Permite o controle sobre como e quando os usuários
acessam a instância do objeto
 Várias classes Singleton podem obedecer a mesma
interface (seleção de Singleton em tempo de execução)
 Mais flexível que métodos estáticos por permitir
polimorfismo
 Desvantagens:
 “Variável global”
 Memory leak (C++)
FSM v1.0 (cont.)
public class ConcreteStateA : IState
{
private static ConcreteStateA mInstance = null;
public static ConcreteStateA Instance()
{
if (mInstance == null)
mInstance = new ConcreteStateA();
return mInstance;
}
// Resto da classe ConcreteStateA
}
FSM v1.0 (cont.)
// Exemplo de como mudar estado de um objeto com State e Singleton
// Algumas linhas de código foram omitidas para dar ênfase no assunto
MyObject objTest = new MyObject();
objTest.SetState(ConcreteStateA.Instance());
Estados intermediários
 Um dos pontos negativos do FSM v0.1 foi:
 Transição direta
 Não há ações de entrada e saída para cada estado
(enter/exit – veremos em breve)
 O ideal é que a transição entre um estado e
outro não seja direta/brusca, mas sim que
exista um processo de saída do estado atual e
um processo de entrada do novo estado
durante a transição
Estados intermediários (cont.)
 Representando graficamente:
Estado
A
Estado
B
Condição para transição de A para outro estado.
Define que próximo estado é B.
Condição para transição de B para outro estado.
Define que próximo estado é A.
Entrando
em A
Saindo
de A
Saindo
de B
Entrando
em B
Estados intermediários (cont.)
 Uma vez que a interface IState e a classe
StateMachine já foram criadas, basta:
 Adicionar dois métodos (Enter() e Exit()) na
interface IState,
 Implementá-los nas subclasses concretas e
 Chamá-los na transição de estados (método
SetState() da StateMachine)
Estados intermediários (cont.)
// Algumas linhas de código foram omitidas para dar ênfase no assunto
public abstract class IState
{
public abstract void Handle();
public abstract void Enter();
public abstract void Exit();
}
public class StateMachine // FSM
{
public void SetState(IState state)
{
mCurrentState.Exit();
mPreviousState = mCurrentState;
mCurrentState = state;
mCurrentState.Enter();
}
}
Estados globais
 Há certas operações que são consideradas
globais, isto é, ocorrem independente do
estado atual do objeto
 Pessoa envelhece a cada momento,
independente do que está fazendo
 Repetição de código em todos os estados
 Para essas operações, é possível criar um (ou
mais) estado global que sempre é executado
junto com o estado atual
 StateMachine terá um novo IState mGlobalState
Estados globais (cont.)
// Algumas linhas de código foram omitidas para dar ênfase no assunto
public class StateMachine // FSM
{
protected IState mGlobalState;
protected IState mCurrentState;
protected IState mPreviousState;
public void SetGlobalState(IState globalState) {...}
public void Request() {
if (mGlobalState != null)
mGlobalState.Handle();
if (mCurrentState != null)
mCurrentState.Handle();
}
}
Exemplo
 Run, Game, Run!
Menu
Principal
Opção
“Créditos”
Créditos
Sair
Gameplay
Opção
“Sair”
Opção
“Iniciar”
Opção
“Voltar”
Opção
“Não”
Tecla Esc
Exemplo (cont.)
 Run, Game, Run!
Trabalhando
EatCounter >= 6.0f
Comendo
Dormindo
Banheiro
SleepCounter >= 8.0f
EatCounter <= 0.0f
SleepCounter <= 0.0f
RelieveCounter <= 0.0f
Global
Morto
RelieveCounter >= 7.0f
LifeCounter <= 0.0f
Exemplo (cont.)
 Onde FSM é aplicada
 Fluxo de telas (estados) do jogo – classes principais
 ScreenManager
 Contém StateMachine, SetState(), instância das telas e tela atual
 GuiScreenStateMainMenu
 GuiScreenStateCredits
 GuiScreenStateExit
 GuiScreenStateGame
 Botões – classes principais
 GuiButton
 Contém StateMachine e SetState()
 Cada tela possui um array de GuiButton
 GuiButtonStateActivated
 GuiButtonStateSelected
 GuiButtonStateUnselected
Exemplo (cont.)
 Onde FSM é aplicada
 NPC – classes principais
 GameNPC
 Contém StateMachine e SetState()
 GameNPCStateWorking
 GameNPCStateEating
 GameNPCStateSleeping
 GameNPCStateRelieving
 GameNPCStateDead
 GameNPCStateIdle
Ideias para expansão
 Mensagens/callback
 Comunicação entre objetos
 Filas / filas com prioridade
 The Sims
 Grafos
 Transições entre estados com Teoria dos Grafos
 Script
 Comportamento dos estados via script (Lua,
Python, Javascript, etc.)
Ideias para expansão (cont.)
Q&A
 Obrigado!

More Related Content

What's hot

Introdução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de ComputadoresIntrodução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de ComputadoresWellington Oliveira
 
Inteligência Artificial
Inteligência ArtificialInteligência Artificial
Inteligência ArtificialNEO Empresarial
 
Sistemas digitais e analógicos
Sistemas digitais e analógicosSistemas digitais e analógicos
Sistemas digitais e analógicosCarlos Pereira
 
Banco de Dados - Modelo Lógico, Chave primária e Chave estrangeira
Banco de Dados - Modelo Lógico, Chave primária e Chave estrangeiraBanco de Dados - Modelo Lógico, Chave primária e Chave estrangeira
Banco de Dados - Modelo Lógico, Chave primária e Chave estrangeiraNatanael Simões
 
Modelagem de casos de uso e diagramas de sequência
Modelagem de casos de uso e diagramas de sequênciaModelagem de casos de uso e diagramas de sequência
Modelagem de casos de uso e diagramas de sequênciaJorge Linhares
 
Dispositivos móveis: Conceito, história e mercado
Dispositivos móveis: Conceito, história e mercadoDispositivos móveis: Conceito, história e mercado
Dispositivos móveis: Conceito, história e mercadoDanilo Filitto
 
Aps lista de exercícios
Aps lista de exercíciosAps lista de exercícios
Aps lista de exercíciosGuilherme
 
Interface Humano-Computador (IHC)
Interface Humano-Computador (IHC)Interface Humano-Computador (IHC)
Interface Humano-Computador (IHC)Wellington Oliveira
 
Arquitetura de dispositivos móveis
Arquitetura de dispositivos móveis Arquitetura de dispositivos móveis
Arquitetura de dispositivos móveis Italo Andrade
 
Aula 5 - Estruturas de seleção simples e composta - parte 1
Aula 5 - Estruturas de seleção simples e composta - parte 1Aula 5 - Estruturas de seleção simples e composta - parte 1
Aula 5 - Estruturas de seleção simples e composta - parte 1Pacc UAB
 
Ihc 01-conceitos básicos
Ihc 01-conceitos básicosIhc 01-conceitos básicos
Ihc 01-conceitos básicosEduardo Xavier
 
Topologia em redes
Topologia em redesTopologia em redes
Topologia em redesYohana Alves
 

What's hot (20)

Introdução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de ComputadoresIntrodução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de Computadores
 
Inteligência Artificial
Inteligência ArtificialInteligência Artificial
Inteligência Artificial
 
Pensamento computacional
Pensamento computacionalPensamento computacional
Pensamento computacional
 
Sistemas digitais e analógicos
Sistemas digitais e analógicosSistemas digitais e analógicos
Sistemas digitais e analógicos
 
PDI - Notas De Aula
PDI - Notas De AulaPDI - Notas De Aula
PDI - Notas De Aula
 
Bases De Dados
Bases De DadosBases De Dados
Bases De Dados
 
Banco de Dados - Modelo Lógico, Chave primária e Chave estrangeira
Banco de Dados - Modelo Lógico, Chave primária e Chave estrangeiraBanco de Dados - Modelo Lógico, Chave primária e Chave estrangeira
Banco de Dados - Modelo Lógico, Chave primária e Chave estrangeira
 
Modelagem de casos de uso e diagramas de sequência
Modelagem de casos de uso e diagramas de sequênciaModelagem de casos de uso e diagramas de sequência
Modelagem de casos de uso e diagramas de sequência
 
Diagrama de sequência
Diagrama de sequênciaDiagrama de sequência
Diagrama de sequência
 
Dispositivos móveis: Conceito, história e mercado
Dispositivos móveis: Conceito, história e mercadoDispositivos móveis: Conceito, história e mercado
Dispositivos móveis: Conceito, história e mercado
 
Aps lista de exercícios
Aps lista de exercíciosAps lista de exercícios
Aps lista de exercícios
 
Introdução ao MySQL
Introdução ao MySQLIntrodução ao MySQL
Introdução ao MySQL
 
Interface Humano-Computador (IHC)
Interface Humano-Computador (IHC)Interface Humano-Computador (IHC)
Interface Humano-Computador (IHC)
 
Arquitetura de dispositivos móveis
Arquitetura de dispositivos móveis Arquitetura de dispositivos móveis
Arquitetura de dispositivos móveis
 
As Emoções e a Inteligência Emocional
As Emoções e a Inteligência EmocionalAs Emoções e a Inteligência Emocional
As Emoções e a Inteligência Emocional
 
Aula 5 - Estruturas de seleção simples e composta - parte 1
Aula 5 - Estruturas de seleção simples e composta - parte 1Aula 5 - Estruturas de seleção simples e composta - parte 1
Aula 5 - Estruturas de seleção simples e composta - parte 1
 
Aula de Informática Básica
Aula de Informática BásicaAula de Informática Básica
Aula de Informática Básica
 
Realidade virtual e
Realidade virtual  eRealidade virtual  e
Realidade virtual e
 
Ihc 01-conceitos básicos
Ihc 01-conceitos básicosIhc 01-conceitos básicos
Ihc 01-conceitos básicos
 
Topologia em redes
Topologia em redesTopologia em redes
Topologia em redes
 

Viewers also liked

Game Design para quem não é Game Designer
Game Design para quem não é Game DesignerGame Design para quem não é Game Designer
Game Design para quem não é Game DesignerAndré Kishimoto
 
Game Design para quem não é Game Designer (versão revista e compactada - TDC2...
Game Design para quem não é Game Designer (versão revista e compactada - TDC2...Game Design para quem não é Game Designer (versão revista e compactada - TDC2...
Game Design para quem não é Game Designer (versão revista e compactada - TDC2...André Kishimoto
 
Desenvolvimento e Post-mortem - "Ataque às Mulheres"
Desenvolvimento e Post-mortem - "Ataque às Mulheres"Desenvolvimento e Post-mortem - "Ataque às Mulheres"
Desenvolvimento e Post-mortem - "Ataque às Mulheres"André Kishimoto
 
Conceitos Introdutórios de Física e IA para Jogos
Conceitos Introdutórios de Física e IA para JogosConceitos Introdutórios de Física e IA para Jogos
Conceitos Introdutórios de Física e IA para JogosAndré Kishimoto
 
Game Design para quem não é Game Designer (versão GameDays 2014)
Game Design para quem não é Game Designer (versão GameDays 2014)Game Design para quem não é Game Designer (versão GameDays 2014)
Game Design para quem não é Game Designer (versão GameDays 2014)André Kishimoto
 
Inteligência Artificial em Jogos Eletrônicos
Inteligência Artificial em Jogos EletrônicosInteligência Artificial em Jogos Eletrônicos
Inteligência Artificial em Jogos EletrônicosAndré Kishimoto
 
Games as Zines - Um "novo" meio de expressão
Games as Zines - Um "novo" meio de expressãoGames as Zines - Um "novo" meio de expressão
Games as Zines - Um "novo" meio de expressãoAndré Kishimoto
 
Problemas na produção de jogos - Bounty Hunters
Problemas na produção de jogos - Bounty HuntersProblemas na produção de jogos - Bounty Hunters
Problemas na produção de jogos - Bounty HuntersJogos Digitais, PUC - SP
 
Problemas na produção de jogos - Dirty Control
Problemas na produção de jogos - Dirty ControlProblemas na produção de jogos - Dirty Control
Problemas na produção de jogos - Dirty ControlJogos Digitais, PUC - SP
 
Artigo inteligencia artifical-jogos
Artigo inteligencia artifical-jogosArtigo inteligencia artifical-jogos
Artigo inteligencia artifical-jogosFernando Vargas
 
Tecnicas de programação - Maquinas de estados e Ladder
Tecnicas de programação - Maquinas de estados e LadderTecnicas de programação - Maquinas de estados e Ladder
Tecnicas de programação - Maquinas de estados e LadderHamilton Sena
 
les 5 planemodeling
les 5 planemodelingles 5 planemodeling
les 5 planemodelingICA - HAN
 
Ryan mc kenzie pres 2
Ryan mc kenzie pres 2Ryan mc kenzie pres 2
Ryan mc kenzie pres 2TumblrIDS
 
1 game art creation pgs.en.2
1 game art creation pgs.en.21 game art creation pgs.en.2
1 game art creation pgs.en.2PracowniaGier
 
Problemas na produção de jogos - Projeto Vates (Conceitual)
Problemas na produção de jogos - Projeto Vates (Conceitual)Problemas na produção de jogos - Projeto Vates (Conceitual)
Problemas na produção de jogos - Projeto Vates (Conceitual)Jogos Digitais, PUC - SP
 

Viewers also liked (20)

Game Design para quem não é Game Designer
Game Design para quem não é Game DesignerGame Design para quem não é Game Designer
Game Design para quem não é Game Designer
 
Game Design para quem não é Game Designer (versão revista e compactada - TDC2...
Game Design para quem não é Game Designer (versão revista e compactada - TDC2...Game Design para quem não é Game Designer (versão revista e compactada - TDC2...
Game Design para quem não é Game Designer (versão revista e compactada - TDC2...
 
Desenvolvimento e Post-mortem - "Ataque às Mulheres"
Desenvolvimento e Post-mortem - "Ataque às Mulheres"Desenvolvimento e Post-mortem - "Ataque às Mulheres"
Desenvolvimento e Post-mortem - "Ataque às Mulheres"
 
Conceitos Introdutórios de Física e IA para Jogos
Conceitos Introdutórios de Física e IA para JogosConceitos Introdutórios de Física e IA para Jogos
Conceitos Introdutórios de Física e IA para Jogos
 
Game Design para quem não é Game Designer (versão GameDays 2014)
Game Design para quem não é Game Designer (versão GameDays 2014)Game Design para quem não é Game Designer (versão GameDays 2014)
Game Design para quem não é Game Designer (versão GameDays 2014)
 
Inteligência Artificial em Jogos Eletrônicos
Inteligência Artificial em Jogos EletrônicosInteligência Artificial em Jogos Eletrônicos
Inteligência Artificial em Jogos Eletrônicos
 
Games as Zines - Um "novo" meio de expressão
Games as Zines - Um "novo" meio de expressãoGames as Zines - Um "novo" meio de expressão
Games as Zines - Um "novo" meio de expressão
 
Exemplo de GDD
Exemplo de GDDExemplo de GDD
Exemplo de GDD
 
Roteiro para Games
Roteiro para GamesRoteiro para Games
Roteiro para Games
 
Problemas na produção de jogos - Bounty Hunters
Problemas na produção de jogos - Bounty HuntersProblemas na produção de jogos - Bounty Hunters
Problemas na produção de jogos - Bounty Hunters
 
Problemas na produção de jogos - Dirty Control
Problemas na produção de jogos - Dirty ControlProblemas na produção de jogos - Dirty Control
Problemas na produção de jogos - Dirty Control
 
Artigo inteligencia artifical-jogos
Artigo inteligencia artifical-jogosArtigo inteligencia artifical-jogos
Artigo inteligencia artifical-jogos
 
Técnicas de ia
Técnicas de iaTécnicas de ia
Técnicas de ia
 
Tecnicas de programação - Maquinas de estados e Ladder
Tecnicas de programação - Maquinas de estados e LadderTecnicas de programação - Maquinas de estados e Ladder
Tecnicas de programação - Maquinas de estados e Ladder
 
les 5 planemodeling
les 5 planemodelingles 5 planemodeling
les 5 planemodeling
 
Ryan mc kenzie pres 2
Ryan mc kenzie pres 2Ryan mc kenzie pres 2
Ryan mc kenzie pres 2
 
1 game art creation pgs.en.2
1 game art creation pgs.en.21 game art creation pgs.en.2
1 game art creation pgs.en.2
 
SIEIDI 2015
SIEIDI 2015SIEIDI 2015
SIEIDI 2015
 
Problemas na produção de jogos - Projeto Vates (Conceitual)
Problemas na produção de jogos - Projeto Vates (Conceitual)Problemas na produção de jogos - Projeto Vates (Conceitual)
Problemas na produção de jogos - Projeto Vates (Conceitual)
 
Pesquisa em Games
Pesquisa em GamesPesquisa em Games
Pesquisa em Games
 

Máquina de Estados: Controlando o jogo, do menu à IA

  • 1. MÁQUINA DE ESTADOS: CONTROLANDO O JOGO, DO MENU À IA André KishimotoWICA 2012
  • 2. Hello, World!  André Kishimoto  UNICSUL, Electronic Arts  andre@kishimoto.com.br Imagens, logos e marcas usadas nessa apresentação © respectivos detentores dos direitos autorais, utilizadas única e exclusivamente com o intuito de informar e exemplificar.
  • 3. Agenda  O que é uma FSM?  Onde FSM é aplicada  Transições entre estados  Representação gráfica  FSM v0.1  FSM v1.0  Estados intermediários  Estados globais  Exemplo  Ideias para expansão  Q&A Represe ntação gráfica Onde FSM é aplicada Transiçõ es entre estados O que é uma FSM? FSM v1.0 FSM v0.1 Estados globais Estados interme diários Idéias para expansão Exempl o Q&A
  • 4. O que é uma FSM?  FSM?  Finite State Machine  Máquina de Estados Finitos  Historicamente  Modelo matemático usado para modelar problemas, projetar programas de computador e circuitos lógicos digitais  Máquina de Turing  Máquina abstrata que possui um número finito de estados e diversas transições entre esses estados
  • 5. O que é uma FSM? (cont.)  A ideia é “quebrar” o comportamento de um objeto em estados (ou “pedaços”) facilmente gerenciáveis  Em um dado momento, a máquina pode estar somente em um único estado  Current state (estado atual)  No geral:  Fáceis de depurar  Código quebrado em pedaços  Não necessitam de muito processamento  If-else  Flexíveis  Novos estados e transições podem ser adicionados à FSM
  • 6. O que é uma FSM? (cont.) http://www.brasilescola.com/fisica/circuito-simples.htm  bool lampadaAcesa = false;  lampadaAcesa = true;
  • 7. Onde FSM é aplicada  Fluxo de telas (estados) do jogo  Elementos de interface (UI)  Personagens  Controlados pelo jogador  NPC’s  Objetos  Fases  Resumindo: em todo o jogo
  • 8. Onde FSM é aplicada (cont.)  Fluxo de telas (estados) do jogo  Splash  Loading inicial  Vídeo/Animação de introdução  Menu principal  Créditos  Opções  Ajuda  Novo Jogo  Gameplay  Pause  Game over  Fim de jogo  Loading entre fases/telas  Lobby  Etc.
  • 9. Onde FSM é aplicada (cont.)  Elementos de interface (UI)  Textos, Botões, Links, Campos de texto, Menus, Etc.  Ativado  Desativado  Selecionado  Não selecionado  Animado  Vísivel  Etc.
  • 10. Onde FSM é aplicada (cont.)  Personagens  Idle/Parado  Andando  Correndo  Pulando  Golpeando  Morto  Etc. http://www.spriters-resource.com/other_systems/alexkiddmw/sheet/10911
  • 11. Onde FSM é aplicada (cont.)  Objetos  Estático  Animado  Quebrado  Visível  Invisível  Etc. http://activeden.net/item/breakable-crate-prefab/1585898
  • 12. Onde FSM é aplicada (cont.)  Fases  Início de fase  Fim de fase  Etc. http://www.148apps.com/reviews/real-racing-2-review/
  • 13. (Importância dos estados em GUI)  GUI: Graphical User Interface  Nem todas as libs/API’s/SDK’s/frameworks possuem suporte nativo de componentes GUI, sendo necessário desenvolver tais componentes  Flash  ex. Button (Up, Over, Down)  Java desktop  AWT/Swing  OpenGL/DirectX/XNA  ???  FSM para cada componente  Set/get: ativado/desativado, mouse over/out, clique down/up, focus/blur, etc.
  • 14. Transições entre estados  Relação entre dois estados, indicando que o objeto sai do estado atual e passa para o novo estado em resposta a um evento ou condição  Lâmpada acesa em decorrência da chave fechada (ativando passagem de corrente)  Define de qual estado para qual estado a máquina deve mudar
  • 15. Transições entre estados (cont.)  Tabela de transições de estados  Mecanismo para organizar estados e suas transições Estado atual Condição Transição para estado Patrulhando Inimigo à vista && mais forte que inimigo Atacando Patrulhando Inimigo à vista && mais fraco que inimigo Fugindo Atacando Mais fraco que inimigo Fugindo Atacando Inimigo morto Patrulhando Fugindo São e salvo Patrulhando
  • 16. Representação gráfica Estado A Estado Transição Estado B condição Condição para transição de A para B Condição para transição de B para A
  • 17. Representação gráfica (cont.)  Exemplo: botão Normal Highlighted Mouse sobre o botão Down Clique no botão Mouse saiu de cima do botão Mouse saiu de cima do botão Botão liberado
  • 18. Representação gráfica (cont.)  Exemplo: personagem Patrulhando Atacando Inimigo à vista && mais forte que inimigo Fugindo Mais fraco que inimigo Inimigo morto Inimigo à vista && mais fraco que inimigo São e salvo
  • 19. FSM v0.1  Uso de if-else e switch-case // Enumera os estados e define estado atual como “Patrulhando” enum FSM_States { Patrulhando, Atacando, Fugindo }; FSM_States currentState = Patrulhando; // Verifica o estado atual da FSM e faz transições de acordo com as condições apresentadas switch (currentState) { case Patrulhando: if (inimigoAVista()) { if (maisForteQue(inimigo)) estadoAtual = Atacando; else estadoAtual = Fugindo; } break; // continua no próximo slide
  • 20. FSM v0.1 (cont.) // continuação do slide anterior case Atacando: if (matou(inimigo)) currentState = Patrulhando; else if (maisForteQue(inimigo) == false) currentState = Fugindo; break; case Fugindo: if (saoESalvo()) currentState = Patrulhando; }
  • 21. FSM v0.1 (cont.)  Straight forward  Para FSM’s bem simples…  Alguns problemas  Manutenção e flexibilidade  Desastres e dor-de-cabeça  Spaghetti code (bagunça!)  Muitos if-else’s e switch’s aninhados  Transição direta  Não há ações de entrada e saída para cada estado (enter/exit – veremos em breve)
  • 22. FSM v1.0  Existe um design pattern (padrão de projeto) comportamental chamado State http://en.wikipedia.org/wiki/State_pattern
  • 23. FSM v1.0 (cont.)  Padrão de Projeto:  State  Objetivo:  Permitir que um objeto altere seu comportamento quando seu estado interno é alterado.  Aplicação:  Use o padrão de projeto State em um dos seguintes casos:  O comportamento de um objeto depende de seu estado e precisa mudar seu comportamento em tempo de execução, dependendo do estado  Há códigos de decisão complexos e extensos que dependem do estado do objeto
  • 24. FSM v1.0 (cont.)  Padrão de Projeto:  State  Vantagens:  Fácil de localizar responsabilidades de estados específicos, remove if’s e switch’s monolíticos  Mudanças de estado explícitas (getters/setters ao invés de associar valores à variáveis)  Estados (objetos do tipo State) podem ser compartilhados  Facilita a expansão de estados  Desvantagens:  Aumenta o número de classes (subclasses) e é menos compacto que uma única classe
  • 25. FSM v1.0 (cont.) // Interface para encapsular o comportamento associado a um estado particular de Context public abstract class IState { public abstract void Handle(); } // Cada subclasse concreta implementa o comportamento associado a um estado de Context public class ConcreteStateA : IState { public override void Handle() { // Do something... } } // continua no próximo slide
  • 26. FSM v1.0 (cont.) // continuação do slide anterior // Cada subclasse concreta implementa o comportamento associado a um estado de Context public class ConcreteStateB : IState { public override void Handle() { // Do something different than A... } } // Mantém uma instância de uma subclasse concreta que define o estado atual public class Context { protected IState mCurrentState; public void Request() { mCurrentState.Handle(); } }
  • 27. FSM v1.0 (cont.)  Para ajudar e facilitar a definição do estado atual de um objeto, a criação de uma classe do tipo FSM é recomendada  Tal classe é responsável por manter o estado atual do objeto, além de realizar as transições de estados  Objeto contém uma instância da classe do tipo FSM
  • 28. FSM v1.0 (cont.) // Algumas linhas de código foram omitidas para dar ênfase no assunto public class StateMachine // FSM { protected IState mCurrentState; protected IState mPreviousState; public void SetState(IState state) { mPreviousState = mCurrentState; mCurrentState = state; } public void RevertToPreviousState() { SetState(mPreviousState); mPreviousState = null; } public void Request() { if (mCurrentState != null) mCurrentState.Handle(); } }
  • 29. FSM v1.0 (cont.) // Algumas linhas de código foram omitidas para dar ênfase no assunto public class MyObject { protected StateMachine mFSM; public void SetState(IState state) { mFSM.SetState(state); } public void Update() { mFSM.Request(); } }
  • 30. FSM v1.0 (cont.)  O método SetState() recebe como parâmetro um IState state, que é a instância de uma das classes concretas que implementam IState  Para compartilhar um estado entre vários objetos, basta uma única instância do estado  É possível usar o padrão de projeto criacional chamado Singleton http://en.wikipedia.org/wiki/Singleton_pattern
  • 31. FSM v1.0 (cont.)  Padrão de Projeto:  Singleton  Objetivo:  Garante que uma classe possua apenas uma instância e fornece um ponto global de acesso ao objeto  Aplicação:  Use o padrão de projeto Singleton onde:  Deve-se existir exatamente uma instância de uma classe, que deve ser acessível pelos usuários a partir de um ponto de acesso conhecido
  • 32. FSM v1.0 (cont.)  Padrão de Projeto:  Singleton  Vantagens:  Permite o controle sobre como e quando os usuários acessam a instância do objeto  Várias classes Singleton podem obedecer a mesma interface (seleção de Singleton em tempo de execução)  Mais flexível que métodos estáticos por permitir polimorfismo  Desvantagens:  “Variável global”  Memory leak (C++)
  • 33. FSM v1.0 (cont.) public class ConcreteStateA : IState { private static ConcreteStateA mInstance = null; public static ConcreteStateA Instance() { if (mInstance == null) mInstance = new ConcreteStateA(); return mInstance; } // Resto da classe ConcreteStateA }
  • 34. FSM v1.0 (cont.) // Exemplo de como mudar estado de um objeto com State e Singleton // Algumas linhas de código foram omitidas para dar ênfase no assunto MyObject objTest = new MyObject(); objTest.SetState(ConcreteStateA.Instance());
  • 35. Estados intermediários  Um dos pontos negativos do FSM v0.1 foi:  Transição direta  Não há ações de entrada e saída para cada estado (enter/exit – veremos em breve)  O ideal é que a transição entre um estado e outro não seja direta/brusca, mas sim que exista um processo de saída do estado atual e um processo de entrada do novo estado durante a transição
  • 36. Estados intermediários (cont.)  Representando graficamente: Estado A Estado B Condição para transição de A para outro estado. Define que próximo estado é B. Condição para transição de B para outro estado. Define que próximo estado é A. Entrando em A Saindo de A Saindo de B Entrando em B
  • 37. Estados intermediários (cont.)  Uma vez que a interface IState e a classe StateMachine já foram criadas, basta:  Adicionar dois métodos (Enter() e Exit()) na interface IState,  Implementá-los nas subclasses concretas e  Chamá-los na transição de estados (método SetState() da StateMachine)
  • 38. Estados intermediários (cont.) // Algumas linhas de código foram omitidas para dar ênfase no assunto public abstract class IState { public abstract void Handle(); public abstract void Enter(); public abstract void Exit(); } public class StateMachine // FSM { public void SetState(IState state) { mCurrentState.Exit(); mPreviousState = mCurrentState; mCurrentState = state; mCurrentState.Enter(); } }
  • 39. Estados globais  Há certas operações que são consideradas globais, isto é, ocorrem independente do estado atual do objeto  Pessoa envelhece a cada momento, independente do que está fazendo  Repetição de código em todos os estados  Para essas operações, é possível criar um (ou mais) estado global que sempre é executado junto com o estado atual  StateMachine terá um novo IState mGlobalState
  • 40. Estados globais (cont.) // Algumas linhas de código foram omitidas para dar ênfase no assunto public class StateMachine // FSM { protected IState mGlobalState; protected IState mCurrentState; protected IState mPreviousState; public void SetGlobalState(IState globalState) {...} public void Request() { if (mGlobalState != null) mGlobalState.Handle(); if (mCurrentState != null) mCurrentState.Handle(); } }
  • 41. Exemplo  Run, Game, Run! Menu Principal Opção “Créditos” Créditos Sair Gameplay Opção “Sair” Opção “Iniciar” Opção “Voltar” Opção “Não” Tecla Esc
  • 42. Exemplo (cont.)  Run, Game, Run! Trabalhando EatCounter >= 6.0f Comendo Dormindo Banheiro SleepCounter >= 8.0f EatCounter <= 0.0f SleepCounter <= 0.0f RelieveCounter <= 0.0f Global Morto RelieveCounter >= 7.0f LifeCounter <= 0.0f
  • 43. Exemplo (cont.)  Onde FSM é aplicada  Fluxo de telas (estados) do jogo – classes principais  ScreenManager  Contém StateMachine, SetState(), instância das telas e tela atual  GuiScreenStateMainMenu  GuiScreenStateCredits  GuiScreenStateExit  GuiScreenStateGame  Botões – classes principais  GuiButton  Contém StateMachine e SetState()  Cada tela possui um array de GuiButton  GuiButtonStateActivated  GuiButtonStateSelected  GuiButtonStateUnselected
  • 44. Exemplo (cont.)  Onde FSM é aplicada  NPC – classes principais  GameNPC  Contém StateMachine e SetState()  GameNPCStateWorking  GameNPCStateEating  GameNPCStateSleeping  GameNPCStateRelieving  GameNPCStateDead  GameNPCStateIdle
  • 45. Ideias para expansão  Mensagens/callback  Comunicação entre objetos  Filas / filas com prioridade  The Sims  Grafos  Transições entre estados com Teoria dos Grafos  Script  Comportamento dos estados via script (Lua, Python, Javascript, etc.)