SlideShare uma empresa Scribd logo
1 de 40
Baixar para ler offline
DESIGN PATTERNS NA
PROGRAMAÇÃO DE JOGOS
Bruno Cicanci @ GameDays 2015
LIVROS
DESIGN PATTERNS
➤ Command
➤ Flyweight
➤ Observer
➤ Prototype
➤ States
➤ Singleton
COMMAND
Padrão comportamental de objetos
“Encapsular uma solicitação como um objeto,
desta forma permitindo parametrizar clientes
com diferentes solicitações, enfileirar ou fazer o
registro (log) de solicitações e suportar
operações que podem ser desfeitas.
GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 222 p.
COMMAND: O PROBLEMA
void InputHandler::handleInput()
{
if (isPressed(BUTTON_X)) jump();
else if (isPressed(BUTTON_Y)) fireGun();
else if (isPressed(BUTTON_A)) swapWeapon();
else if (isPressed(BUTTON_B)) reloadWeapon();
}
COMMAND: A SOLUÇÃO
class Command
{
public:
virtual ~Command() {}
virtual void execute() = 0;
};
class JumpCommand : public Command
{
public:
virtual void execute() { jump(); }
};
void InputHandler::handleInput()
{
if (isPressed(BUTTON_X))
buttonX_->execute();
else if (isPressed(BUTTON_Y))
buttonY_->execute();
else if (isPressed(BUTTON_A))
buttonA_->execute();
else if (isPressed(BUTTON_B))
buttonB_->execute();
}
COMMAND: EXEMPLOS DE USO
FLYWEIGHT
Padrão estrutural de objetos
“Usar compartilhamento para suportar
eficientemente grandes quantidades de objetos
de granularidade fina.
GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 187 p.
FLYWEIGHT: O PROBLEMA
class Tree
{
private:
Mesh mesh_;
Texture bark_;
Texture leaves_;
Vector position_;
double height_;
double thickness_;
Color barkTint_;
Color leafTint_;
};
FLYWEIGHT: A SOLUÇÃO
class TreeModel
{
private:
Mesh mesh_;
Texture bark_;
Texture leaves_;
};
class Tree
{
private:
TreeModel* model_;
Vector position_;
double height_;
double thickness_;
Color barkTint_;
Color leafTint_;
};
FLYWEIGHT: EXEMPLOS DE USO
OBSERVER
Padrão comportamental de objetos
“Definir uma dependência um-para-muitos entre
objetos, de maneira que quando um objeto muda
de estado todos os seus dependentes são
notificados e atualizados automaticamente.
GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 274 p.
OBSERVER: O PROBLEMA
void Physics::updateEntity(Entity& entity)
{
bool wasOnSurface = entity.isOnSurface();
entity.accelerate(GRAVITY);
entity.update();
if (wasOnSurface && !entity.isOnSurface())
{
notify(entity, EVENT_START_FALL);
}
}
OBSERVER: A SOLUÇÃO - PARTE 1
class Observer
{
public:
virtual ~Observer() {}
virtual void onNotify(const Entity& entity, Event event) = 0;
};
class Achievements : public Observer
{
public:
virtual void onNotify(const Entity& entity, Event event)
{
switch (event)
{
case EVENT_ENTITY_FELL:
if (entity.isHero() && heroIsOnBridge_)
{
unlock(ACHIEVEMENT_FELL_OFF_BRIDGE);
}
break;
}
}
};
OBSERVER: A SOLUÇÃO - PARTE 2
class Physics : public Subject
{
public:
void updateEntity(Entity& entity);
};
class Subject
{
private:
Observer* observers_[MAX_OBSERVERS];
int numObservers_;
protected:
void notify(const Entity& entity, Event event)
{
for (int i = 0; i < numObservers_; i++)
{
observers_[i]->onNotify(entity, event);
}
}
};
OBSERVER: EXEMPLOS DE USO
PROTOTYPE
Padrão de criação de objetos
“Especificar os tipos de objetos a serem criados
usando uma instância-protótipo e criar novos
objetos pela cópia desse protótipo.
GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 121 p.
PROTOTYPE: O PROBLEMA
class Monster
{
// Stuff...
};
class Ghost : public Monster {};
class Demon : public Monster {};
class Sorcerer : public Monster {};
class Spawner
{
public:
virtual ~Spawner() {}
virtual Monster* spawnMonster() = 0;
};
class GhostSpawner : public Spawner
{
public:
virtual Monster* spawnMonster()
{
return new Ghost();
}
};
PROTOTYPE: A SOLUÇÃO - PARTE 1
class Monster
{
public:
virtual ~Monster() {}
virtual Monster* clone() = 0;
// Other stuff...
};
class Ghost : public Monster {
public:
Ghost(int health, int speed)
: health_(health),
speed_(speed)
{}
virtual Monster* clone()
{
return new Ghost(health_, speed_);
}
private:
int health_;
int speed_;
};
PROTOTYPE: A SOLUÇÃO - PARTE 2
class Spawner
{
public:
Spawner(Monster* prototype)
: prototype_(prototype)
{}
Monster* spawnMonster()
{
return prototype_->clone();
}
private:
Monster* prototype_;
};
PROTOTYPE: EXEMPLOS DE USO
STATE
Padrão comportamental de objetos
“Permite a um objeto alterar seu comportamento
quando o seu estado interno muda. O objeto
parecerá ter mudado sua classe.
GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 284 p.
STATE: O PROBLEMA
void Heroine::handleInput(Input input)
{
if (input == PRESS_B)
{
if (!isJumping_ && !isDucking_)
{
// Jump...
}
}
else if (input == PRESS_DOWN)
{
if (!isJumping_)
{
isDucking_ = true;
}
}
else if (input == RELEASE_DOWN)
{
if (isDucking_)
{
isDucking_ = false;
}
}
}
STATE: A SOLUÇÃO
void Heroine::handleInput(Input input)
{
switch (state_)
{
case STATE_STANDING:
if (input == PRESS_B)
{
state_ = STATE_JUMPING;
}
else if (input == PRESS_DOWN)
{
state_ = STATE_DUCKING;
}
break;
case STATE_JUMPING:
if (input == PRESS_DOWN)
{
state_ = STATE_DIVING;
}
break;
case STATE_DUCKING:
if (input == RELEASE_DOWN)
{
state_ = STATE_STANDING;
}
break;
}
}
STATE: EXEMPLOS DE USO
SINGLETON
Padrão de criação de objetos
“Garantir que uma classe tenha somente uma
instância E fornecer um ponto global de acesso
para a mesma.
GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 130 p.
“(…) friends don’t let friends create singletons.
NYSTROM, Robert. Game Programing Patterns. Middletown: Genever Bening, 2014. 31 p.
SINGLETON: O PROBLEMA E A SOLUÇÃO
class FileSystem
{
public:
static FileSystem& instance()
{
if (instance_ == NULL) instance_ = new FileSystem();
return *instance_;
}
private:
FileSystem() {}
static FileSystem* instance_;
};
SINGLETON: SUGESTÕES DE USO
class FileSystem
{
public:
FileSystem()
{
assert(!instantiated_);
instantiated_ = true;
}
~FileSystem() { instantiated_ = false; }
private:
static bool instantiated_;
};
bool FileSystem::instantiated_ = false;
OUTROS DESIGN PATTERNS
➤ Double Buffer
➤ Game Loop
➤ Update Method
➤ Bytecode
➤ Subclass Sandbox
➤ Type Object
➤ Component
➤ Event Queue
➤ Service Locator
➤ Data Locality
➤ Dirty Flag
➤ Object Pool
➤ Spatial Partition
➤ Abstract Factory
➤ Builder
➤ Factory Method
➤ Adapter
➤ Bridge
➤ Composite
➤ Decorator
➤ Facade
➤ Proxy
➤ Chain of Responsibility
➤ Interpreter
➤ Iterator
➤ Mediator
➤ Memento
➤ Strategy
➤ Template Method
➤ Visitor
HTTP://GAMEPROGRAMMINGPATTERNS.COM
OUTROS LIVROS
Programação
Code Complete
Clean Code
Programação de Jogos
Game Programming Patterns
Game Programming Algorithms and Techniques
Game Coding Complete
Inteligência Artificial
Programming Game AI by Example
Física
Physics for Game Developers
Computação Gráfica
3D Math Primer for Graphics and Game
Game Design
Game Design Workshop
Level Up! The Guide to Great Game Design
Produção
The Game Production Handbook
Agile Game Development with Scrum
HTTP://GAMEDEVELOPER.COM.BR
OBRIGADO!
bruno@gamedeveloper.com.br
@cicanci

Mais conteúdo relacionado

Mais procurados

C++: Constructor, Copy Constructor and Assignment operator
C++: Constructor, Copy Constructor and Assignment operatorC++: Constructor, Copy Constructor and Assignment operator
C++: Constructor, Copy Constructor and Assignment operator
Jussi Pohjolainen
 
Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultas
julianaveregue
 

Mais procurados (20)

C++: Constructor, Copy Constructor and Assignment operator
C++: Constructor, Copy Constructor and Assignment operatorC++: Constructor, Copy Constructor and Assignment operator
C++: Constructor, Copy Constructor and Assignment operator
 
Apresentação Clean Code
Apresentação Clean CodeApresentação Clean Code
Apresentação Clean Code
 
clean code book summary - uncle bob - English version
clean code book summary - uncle bob - English versionclean code book summary - uncle bob - English version
clean code book summary - uncle bob - English version
 
Racket perusteet 3. Funktio
Racket perusteet 3. FunktioRacket perusteet 3. Funktio
Racket perusteet 3. Funktio
 
Object Oriented Programming using C++ - Part 4
Object Oriented Programming using C++ - Part 4Object Oriented Programming using C++ - Part 4
Object Oriented Programming using C++ - Part 4
 
BD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
BD I - Aula 08 B - Algebra Relacional - Exercicios ResolucaoBD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
BD I - Aula 08 B - Algebra Relacional - Exercicios Resolucao
 
Clean code and Code Smells
Clean code and Code SmellsClean code and Code Smells
Clean code and Code Smells
 
C++ classes tutorials
C++ classes tutorialsC++ classes tutorials
C++ classes tutorials
 
User defined functions
User defined functionsUser defined functions
User defined functions
 
Aula 2 - Comandos DDL DML DQL E DCL
Aula 2 - Comandos DDL DML DQL E DCLAula 2 - Comandos DDL DML DQL E DCL
Aula 2 - Comandos DDL DML DQL E DCL
 
Oop in c++ lecture 1
Oop in c++  lecture 1Oop in c++  lecture 1
Oop in c++ lecture 1
 
Clean coding-practices
Clean coding-practicesClean coding-practices
Clean coding-practices
 
Programming For Problem Solving Lecture Notes
Programming For Problem Solving Lecture NotesProgramming For Problem Solving Lecture Notes
Programming For Problem Solving Lecture Notes
 
C Recursion, Pointers, Dynamic memory management
C Recursion, Pointers, Dynamic memory managementC Recursion, Pointers, Dynamic memory management
C Recursion, Pointers, Dynamic memory management
 
C++ Programming
C++ ProgrammingC++ Programming
C++ Programming
 
Clean code
Clean codeClean code
Clean code
 
JAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTOJAVA - ENCAPSULAMENTO
JAVA - ENCAPSULAMENTO
 
Arrays em java
Arrays em javaArrays em java
Arrays em java
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Junções e subconsultas
Junções e subconsultasJunções e subconsultas
Junções e subconsultas
 

Destaque (6)

Programação de Jogos - Design Patterns
Programação de Jogos - Design PatternsProgramação de Jogos - Design Patterns
Programação de Jogos - Design Patterns
 
O fantástico mundo de Android
O fantástico mundo de AndroidO fantástico mundo de Android
O fantástico mundo de Android
 
Para quem você desenvolve?
Para quem você desenvolve?Para quem você desenvolve?
Para quem você desenvolve?
 
Desenvolvimento de jogos com Corona SDK
Desenvolvimento de jogos com Corona SDKDesenvolvimento de jogos com Corona SDK
Desenvolvimento de jogos com Corona SDK
 
Como (não) invadirem o seu banco de dados.
Como (não) invadirem o seu banco de dados. Como (não) invadirem o seu banco de dados.
Como (não) invadirem o seu banco de dados.
 
A Open Web Platform em prol do seu app!
A Open Web Platform em prol do seu app!A Open Web Platform em prol do seu app!
A Open Web Platform em prol do seu app!
 

Semelhante a Design Patterns na Programação de Jogo

[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
Felipe Pimentel
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
elliando dias
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
elliando dias
 

Semelhante a Design Patterns na Programação de Jogo (20)

Clean code
Clean codeClean code
Clean code
 
Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?Programação funcional em JavaScript: como e por quê?
Programação funcional em JavaScript: como e por quê?
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Testes Unitários com GTest e Catch
Testes Unitários com GTest e CatchTestes Unitários com GTest e Catch
Testes Unitários com GTest e Catch
 
Android na Prática
Android na PráticaAndroid na Prática
Android na Prática
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6Palestra Novidades da linguagem C# 6
Palestra Novidades da linguagem C# 6
 
JQuery
JQuery JQuery
JQuery
 
JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
Refatoração e Boas Práticas no Desenvolvimento de Software com a Linguagem Ja...
 
Javascript
JavascriptJavascript
Javascript
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Combatendo code smells em aplicações Java
Combatendo code smells em aplicações JavaCombatendo code smells em aplicações Java
Combatendo code smells em aplicações Java
 
Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days Como escrever bons testes! - Dex transforming days
Como escrever bons testes! - Dex transforming days
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 

Mais de Bruno Cicanci

Mais de Bruno Cicanci (9)

Design Patterns in Game Programming
Design Patterns in Game ProgrammingDesign Patterns in Game Programming
Design Patterns in Game Programming
 
Optimizing Unity games for mobile devices
Optimizing Unity games for mobile devicesOptimizing Unity games for mobile devices
Optimizing Unity games for mobile devices
 
It's all about the game
It's all about the gameIt's all about the game
It's all about the game
 
Game Jams - Como fazer um jogo em 48 horas
Game Jams - Como fazer um jogo em 48 horasGame Jams - Como fazer um jogo em 48 horas
Game Jams - Como fazer um jogo em 48 horas
 
It’s all about the game
It’s all about the gameIt’s all about the game
It’s all about the game
 
Desenvolvimento de Jogos com Corona SDK
Desenvolvimento de Jogos com Corona SDKDesenvolvimento de Jogos com Corona SDK
Desenvolvimento de Jogos com Corona SDK
 
Desenvolvimento de jogos com Cocos2d-x
Desenvolvimento de jogos com Cocos2d-xDesenvolvimento de jogos com Cocos2d-x
Desenvolvimento de jogos com Cocos2d-x
 
TDC 2012 - Desenvolvimento de Jogos Mobile
TDC 2012 - Desenvolvimento de Jogos MobileTDC 2012 - Desenvolvimento de Jogos Mobile
TDC 2012 - Desenvolvimento de Jogos Mobile
 
Desenvolvimento de Jogos Para Dispositivos Móveis - UFRJ - GECOM2011
Desenvolvimento de Jogos Para Dispositivos Móveis - UFRJ - GECOM2011Desenvolvimento de Jogos Para Dispositivos Móveis - UFRJ - GECOM2011
Desenvolvimento de Jogos Para Dispositivos Móveis - UFRJ - GECOM2011
 

Design Patterns na Programação de Jogo

  • 1. DESIGN PATTERNS NA PROGRAMAÇÃO DE JOGOS Bruno Cicanci @ GameDays 2015
  • 3. DESIGN PATTERNS ➤ Command ➤ Flyweight ➤ Observer ➤ Prototype ➤ States ➤ Singleton
  • 5. “Encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações, enfileirar ou fazer o registro (log) de solicitações e suportar operações que podem ser desfeitas. GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 222 p.
  • 6. COMMAND: O PROBLEMA void InputHandler::handleInput() { if (isPressed(BUTTON_X)) jump(); else if (isPressed(BUTTON_Y)) fireGun(); else if (isPressed(BUTTON_A)) swapWeapon(); else if (isPressed(BUTTON_B)) reloadWeapon(); }
  • 7. COMMAND: A SOLUÇÃO class Command { public: virtual ~Command() {} virtual void execute() = 0; }; class JumpCommand : public Command { public: virtual void execute() { jump(); } }; void InputHandler::handleInput() { if (isPressed(BUTTON_X)) buttonX_->execute(); else if (isPressed(BUTTON_Y)) buttonY_->execute(); else if (isPressed(BUTTON_A)) buttonA_->execute(); else if (isPressed(BUTTON_B)) buttonB_->execute(); }
  • 10. “Usar compartilhamento para suportar eficientemente grandes quantidades de objetos de granularidade fina. GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 187 p.
  • 11. FLYWEIGHT: O PROBLEMA class Tree { private: Mesh mesh_; Texture bark_; Texture leaves_; Vector position_; double height_; double thickness_; Color barkTint_; Color leafTint_; };
  • 12. FLYWEIGHT: A SOLUÇÃO class TreeModel { private: Mesh mesh_; Texture bark_; Texture leaves_; }; class Tree { private: TreeModel* model_; Vector position_; double height_; double thickness_; Color barkTint_; Color leafTint_; };
  • 15. “Definir uma dependência um-para-muitos entre objetos, de maneira que quando um objeto muda de estado todos os seus dependentes são notificados e atualizados automaticamente. GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 274 p.
  • 16. OBSERVER: O PROBLEMA void Physics::updateEntity(Entity& entity) { bool wasOnSurface = entity.isOnSurface(); entity.accelerate(GRAVITY); entity.update(); if (wasOnSurface && !entity.isOnSurface()) { notify(entity, EVENT_START_FALL); } }
  • 17. OBSERVER: A SOLUÇÃO - PARTE 1 class Observer { public: virtual ~Observer() {} virtual void onNotify(const Entity& entity, Event event) = 0; }; class Achievements : public Observer { public: virtual void onNotify(const Entity& entity, Event event) { switch (event) { case EVENT_ENTITY_FELL: if (entity.isHero() && heroIsOnBridge_) { unlock(ACHIEVEMENT_FELL_OFF_BRIDGE); } break; } } };
  • 18. OBSERVER: A SOLUÇÃO - PARTE 2 class Physics : public Subject { public: void updateEntity(Entity& entity); }; class Subject { private: Observer* observers_[MAX_OBSERVERS]; int numObservers_; protected: void notify(const Entity& entity, Event event) { for (int i = 0; i < numObservers_; i++) { observers_[i]->onNotify(entity, event); } } };
  • 21. “Especificar os tipos de objetos a serem criados usando uma instância-protótipo e criar novos objetos pela cópia desse protótipo. GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 121 p.
  • 22. PROTOTYPE: O PROBLEMA class Monster { // Stuff... }; class Ghost : public Monster {}; class Demon : public Monster {}; class Sorcerer : public Monster {}; class Spawner { public: virtual ~Spawner() {} virtual Monster* spawnMonster() = 0; }; class GhostSpawner : public Spawner { public: virtual Monster* spawnMonster() { return new Ghost(); } };
  • 23. PROTOTYPE: A SOLUÇÃO - PARTE 1 class Monster { public: virtual ~Monster() {} virtual Monster* clone() = 0; // Other stuff... }; class Ghost : public Monster { public: Ghost(int health, int speed) : health_(health), speed_(speed) {} virtual Monster* clone() { return new Ghost(health_, speed_); } private: int health_; int speed_; };
  • 24. PROTOTYPE: A SOLUÇÃO - PARTE 2 class Spawner { public: Spawner(Monster* prototype) : prototype_(prototype) {} Monster* spawnMonster() { return prototype_->clone(); } private: Monster* prototype_; };
  • 27. “Permite a um objeto alterar seu comportamento quando o seu estado interno muda. O objeto parecerá ter mudado sua classe. GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 284 p.
  • 28. STATE: O PROBLEMA void Heroine::handleInput(Input input) { if (input == PRESS_B) { if (!isJumping_ && !isDucking_) { // Jump... } } else if (input == PRESS_DOWN) { if (!isJumping_) { isDucking_ = true; } } else if (input == RELEASE_DOWN) { if (isDucking_) { isDucking_ = false; } } }
  • 29. STATE: A SOLUÇÃO void Heroine::handleInput(Input input) { switch (state_) { case STATE_STANDING: if (input == PRESS_B) { state_ = STATE_JUMPING; } else if (input == PRESS_DOWN) { state_ = STATE_DUCKING; } break; case STATE_JUMPING: if (input == PRESS_DOWN) { state_ = STATE_DIVING; } break; case STATE_DUCKING: if (input == RELEASE_DOWN) { state_ = STATE_STANDING; } break; } }
  • 32. “Garantir que uma classe tenha somente uma instância E fornecer um ponto global de acesso para a mesma. GAMMA, Erich et al. Design Patterns: soluções reutilizáveis de software orientado a objetos. Porto Alegre: Bookman, 2000. 130 p.
  • 33. “(…) friends don’t let friends create singletons. NYSTROM, Robert. Game Programing Patterns. Middletown: Genever Bening, 2014. 31 p.
  • 34. SINGLETON: O PROBLEMA E A SOLUÇÃO class FileSystem { public: static FileSystem& instance() { if (instance_ == NULL) instance_ = new FileSystem(); return *instance_; } private: FileSystem() {} static FileSystem* instance_; };
  • 35. SINGLETON: SUGESTÕES DE USO class FileSystem { public: FileSystem() { assert(!instantiated_); instantiated_ = true; } ~FileSystem() { instantiated_ = false; } private: static bool instantiated_; }; bool FileSystem::instantiated_ = false;
  • 36. OUTROS DESIGN PATTERNS ➤ Double Buffer ➤ Game Loop ➤ Update Method ➤ Bytecode ➤ Subclass Sandbox ➤ Type Object ➤ Component ➤ Event Queue ➤ Service Locator ➤ Data Locality ➤ Dirty Flag ➤ Object Pool ➤ Spatial Partition ➤ Abstract Factory ➤ Builder ➤ Factory Method ➤ Adapter ➤ Bridge ➤ Composite ➤ Decorator ➤ Facade ➤ Proxy ➤ Chain of Responsibility ➤ Interpreter ➤ Iterator ➤ Mediator ➤ Memento ➤ Strategy ➤ Template Method ➤ Visitor
  • 38. OUTROS LIVROS Programação Code Complete Clean Code Programação de Jogos Game Programming Patterns Game Programming Algorithms and Techniques Game Coding Complete Inteligência Artificial Programming Game AI by Example Física Physics for Game Developers Computação Gráfica 3D Math Primer for Graphics and Game Game Design Game Design Workshop Level Up! The Guide to Great Game Design Produção The Game Production Handbook Agile Game Development with Scrum