design patterns na programação de jogo
TRANSCRIPT
![Page 1: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/1.jpg)
DESIGN PATTERNS NA PROGRAMAÇÃO DE JOGOS
Bruno Cicanci @ GameDays 2015
![Page 2: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/2.jpg)
LIVROS
![Page 3: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/3.jpg)
DESIGN PATTERNS
➤ Command
➤ Flyweight
➤ Observer
➤ Prototype
➤ States
➤ Singleton
![Page 4: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/4.jpg)
COMMANDPadrão comportamental de objetos
![Page 5: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/5.jpg)
“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.
![Page 6: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/6.jpg)
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();
}
![Page 7: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/7.jpg)
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();
}
![Page 8: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/8.jpg)
COMMAND: EXEMPLOS DE USO
![Page 9: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/9.jpg)
FLYWEIGHTPadrão estrutural de objetos
![Page 10: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/10.jpg)
“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.
![Page 11: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/11.jpg)
FLYWEIGHT: O PROBLEMAclass Tree
{
private:
Mesh mesh_;
Texture bark_;
Texture leaves_;
Vector position_;
double height_;
double thickness_;
Color barkTint_;
Color leafTint_;
};
![Page 12: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/12.jpg)
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_;
};
![Page 13: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/13.jpg)
FLYWEIGHT: EXEMPLOS DE USO
![Page 14: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/14.jpg)
OBSERVERPadrão comportamental de objetos
![Page 15: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/15.jpg)
“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.
![Page 16: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/16.jpg)
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);
}
}
![Page 17: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/17.jpg)
OBSERVER: A SOLUÇÃO - PARTE 1class 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;
}
}
};
![Page 18: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/18.jpg)
OBSERVER: A SOLUÇÃO - PARTE 2class 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);
}
}
};
![Page 19: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/19.jpg)
OBSERVER: EXEMPLOS DE USO
![Page 20: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/20.jpg)
PROTOTYPEPadrão de criação de objetos
![Page 21: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/21.jpg)
“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.
![Page 22: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/22.jpg)
PROTOTYPE: O PROBLEMAclass 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();
}
};
![Page 23: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/23.jpg)
PROTOTYPE: A SOLUÇÃO - PARTE 1class 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_;
};
![Page 24: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/24.jpg)
PROTOTYPE: A SOLUÇÃO - PARTE 2class Spawner
{
public:
Spawner(Monster* prototype)
: prototype_(prototype)
{}
Monster* spawnMonster()
{
return prototype_->clone();
}
private:
Monster* prototype_;
};
![Page 25: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/25.jpg)
PROTOTYPE: EXEMPLOS DE USO
![Page 26: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/26.jpg)
STATEPadrão comportamental de objetos
![Page 27: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/27.jpg)
“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.
![Page 28: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/28.jpg)
STATE: O PROBLEMAvoid 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;
}
}
}
![Page 29: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/29.jpg)
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;
}
}
![Page 30: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/30.jpg)
STATE: EXEMPLOS DE USO
![Page 31: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/31.jpg)
SINGLETONPadrão de criação de objetos
![Page 32: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/32.jpg)
“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.
![Page 33: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/33.jpg)
“(…) friends don’t let friends create singletons.
NYSTROM, Robert. Game Programing Patterns. Middletown: Genever Bening, 2014. 31 p.
![Page 34: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/34.jpg)
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_;
};
![Page 35: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/35.jpg)
SINGLETON: SUGESTÕES DE USOclass FileSystem
{
public:
FileSystem()
{
assert(!instantiated_);
instantiated_ = true;
}
~FileSystem() { instantiated_ = false; }
private:
static bool instantiated_;
};
bool FileSystem::instantiated_ = false;
![Page 36: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/36.jpg)
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
![Page 38: Design Patterns na Programação de Jogo](https://reader033.vdocuments.site/reader033/viewer/2022061415/58eefcc91a28ab0d758b4583/html5/thumbnails/38.jpg)
OUTROS LIVROSProgramaçã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