SlideShare une entreprise Scribd logo
1  sur  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!

Contenu connexe

Tendances

Aventura Pronta Hardwire para Kuro RPG
Aventura Pronta Hardwire para Kuro RPGAventura Pronta Hardwire para Kuro RPG
Aventura Pronta Hardwire para Kuro RPGfilhosdagehenna
 
게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소Seungmo Koo
 
Eclipse introduction IDE PRESENTATION
Eclipse introduction IDE PRESENTATIONEclipse introduction IDE PRESENTATION
Eclipse introduction IDE PRESENTATIONAYESHA JAVED
 
행동 기반 게임오브젝트
행동 기반 게임오브젝트행동 기반 게임오브젝트
행동 기반 게임오브젝트kgun86
 
Exercícios Resolvidos - Arquitetura e Organização de Computadores
Exercícios Resolvidos - Arquitetura e Organização de ComputadoresExercícios Resolvidos - Arquitetura e Organização de Computadores
Exercícios Resolvidos - Arquitetura e Organização de ComputadoresRonildo Oliveira
 
Introduce Game Testing And QA
Introduce Game Testing And QAIntroduce Game Testing And QA
Introduce Game Testing And QAPham Anh Tuan
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)Armando Daniel
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Julian Cesar
 
Game Design Principle
Game Design PrincipleGame Design Principle
Game Design PrincipleNaquiah Daud
 
Apresentação dos comandos básicos do Scratch
Apresentação dos comandos básicos do ScratchApresentação dos comandos básicos do Scratch
Apresentação dos comandos básicos do ScratchCecifm
 
P4.맵 에디터 제작하기(2)
P4.맵 에디터 제작하기(2)P4.맵 에디터 제작하기(2)
P4.맵 에디터 제작하기(2)Unitylearningcenter
 
Mobile Game Development in Unity
Mobile Game Development in UnityMobile Game Development in Unity
Mobile Game Development in UnityHakan Saglam
 
Curso Java Inicial 5 Relaciones Entre Objetos
Curso Java Inicial   5 Relaciones Entre ObjetosCurso Java Inicial   5 Relaciones Entre Objetos
Curso Java Inicial 5 Relaciones Entre ObjetosEmilio Aviles Avila
 
Aula 2. Fatores Humanos em IHC
Aula 2. Fatores Humanos em IHCAula 2. Fatores Humanos em IHC
Aula 2. Fatores Humanos em IHCSilvia Dotta
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
What Is A Game Engine
What Is A Game EngineWhat Is A Game Engine
What Is A Game EngineSeth Sivak
 
LAFS Game Design 7 - Prototyping
LAFS Game Design 7 - PrototypingLAFS Game Design 7 - Prototyping
LAFS Game Design 7 - PrototypingDavid Mullich
 

Tendances (20)

Aventura Pronta Hardwire para Kuro RPG
Aventura Pronta Hardwire para Kuro RPGAventura Pronta Hardwire para Kuro RPG
Aventura Pronta Hardwire para Kuro RPG
 
게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소게임제작개론: #2 세부 디자인 요소
게임제작개론: #2 세부 디자인 요소
 
Eclipse introduction IDE PRESENTATION
Eclipse introduction IDE PRESENTATIONEclipse introduction IDE PRESENTATION
Eclipse introduction IDE PRESENTATION
 
행동 기반 게임오브젝트
행동 기반 게임오브젝트행동 기반 게임오브젝트
행동 기반 게임오브젝트
 
Exercícios Resolvidos - Arquitetura e Organização de Computadores
Exercícios Resolvidos - Arquitetura e Organização de ComputadoresExercícios Resolvidos - Arquitetura e Organização de Computadores
Exercícios Resolvidos - Arquitetura e Organização de Computadores
 
Introduce Game Testing And QA
Introduce Game Testing And QAIntroduce Game Testing And QA
Introduce Game Testing And QA
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)
 
Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)Desenvolvimento Front end (AngularJS e Bootstrap)
Desenvolvimento Front end (AngularJS e Bootstrap)
 
Game Design Principle
Game Design PrincipleGame Design Principle
Game Design Principle
 
Apresentação dos comandos básicos do Scratch
Apresentação dos comandos básicos do ScratchApresentação dos comandos básicos do Scratch
Apresentação dos comandos básicos do Scratch
 
P4.맵 에디터 제작하기(2)
P4.맵 에디터 제작하기(2)P4.맵 에디터 제작하기(2)
P4.맵 에디터 제작하기(2)
 
Mobile Game Development in Unity
Mobile Game Development in UnityMobile Game Development in Unity
Mobile Game Development in Unity
 
Curso Java Inicial 5 Relaciones Entre Objetos
Curso Java Inicial   5 Relaciones Entre ObjetosCurso Java Inicial   5 Relaciones Entre Objetos
Curso Java Inicial 5 Relaciones Entre Objetos
 
ASP session object
ASP session objectASP session object
ASP session object
 
Aula 2. Fatores Humanos em IHC
Aula 2. Fatores Humanos em IHCAula 2. Fatores Humanos em IHC
Aula 2. Fatores Humanos em IHC
 
O que é um Banco de Dados Relacional?
O que é um Banco de Dados Relacional?O que é um Banco de Dados Relacional?
O que é um Banco de Dados Relacional?
 
Window object
Window objectWindow object
Window object
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
What Is A Game Engine
What Is A Game EngineWhat Is A Game Engine
What Is A Game Engine
 
LAFS Game Design 7 - Prototyping
LAFS Game Design 7 - PrototypingLAFS Game Design 7 - Prototyping
LAFS Game Design 7 - Prototyping
 

En vedette

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
 
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
 

En vedette (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)
 
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
 
Inteligência Artificial em Jogos
Inteligência Artificial em JogosInteligência Artificial em Jogos
Inteligência Artificial em Jogos
 
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.)