Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming...
Transcript of Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming...
![Page 1: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/1.jpg)
Globalcode – Open4education
Design Patterns in Game ProgrammingBruno Cicanci
Senior Software Engineer @ Aquiris Game Studio
![Page 2: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/2.jpg)
Globalcode – Open4education
AgendaWho am I?
Design Patterns
Other Patterns
Software Architecture
![Page 3: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/3.jpg)
Globalcode – Open4education
Who am I?Bruno Cicanci (@cicanci)
Senior Software Engineer at Aquiris Game Studio
14+ years as a professional programmer
9+ years working with mobile games
20+ games developed
10+ years blogging: gamedeveloper.com.br
![Page 4: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/4.jpg)
Globalcode – Open4education
Design PatternsCommand
Flyweight
Observer
Prototype
Singleton
State
![Page 5: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/5.jpg)
Globalcode – Open4education
Command: The problemvoid 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();
}
https://gameprogrammingpatterns.com/command.html
![Page 6: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/6.jpg)
Globalcode – Open4education
Command: The solutionclass 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();
}
https://gameprogrammingpatterns.com/command.html
![Page 7: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/7.jpg)
Globalcode – Open4education
Command: The usageInput
Undo
Redo
https://gameprogrammingpatterns.com/command.html
![Page 8: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/8.jpg)
Globalcode – Open4education
Flyweight: The problemclass Tree{private:
Mesh mesh;Texture bark;Texture leaves;Vector position;double height;double thickness;Color barkTint;Color leafTint;
};
https://gameprogrammingpatterns.com/flyweight.html
![Page 9: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/9.jpg)
Globalcode – Open4education
Flyweight: The solutionclass TreeModel{private:
Mesh mesh;Texture bark;Texture leaves;
};
class Tree{private:TreeModel* model;
Vector position;double height;double thickness;Color barkTint;Color leafTint;
};
https://gameprogrammingpatterns.com/flyweight.html
![Page 10: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/10.jpg)
Globalcode – Open4education
Flyweight: The usageMultiple instances
Tile maps
https://gameprogrammingpatterns.com/flyweight.html
![Page 11: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/11.jpg)
Globalcode – Open4education
Observer: The problemvoid Physics::updateEntity(Entity& entity){
bool wasOnSurface = entity.isOnSurface();entity.accelerate(GRAVITY);entity.update();
if (wasOnSurface && !entity.isOnSurface() && entity.isHero()){
unlockFallOffBridge();}
}
https://gameprogrammingpatterns.com/observer.html
![Page 12: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/12.jpg)
Globalcode – Open4education
Observer: The solution (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()){
unlock(ACHIEVEMENT_FELL_OFF_BRIDGE);}break;
}}
private:void unlock(Achievement achievement) { }
};
https://gameprogrammingpatterns.com/observer.html
![Page 13: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/13.jpg)
Globalcode – Open4education
Observer: The solution (2)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);
}}
public:void addObserver(Observer* observer) { }void removeObserver(Observer* observer) { }
};
class Physics : public Subject{public:void updateEntity(Entity& entity);{bool wasOnSurface = entity.isOnSurface();entity.accelerate(GRAVITY);entity.update();if (wasOnSurface && !entity.isOnSurface()){notify(entity, EVENT_START_FALL);
}}
};
https://gameprogrammingpatterns.com/observer.html
![Page 14: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/14.jpg)
Globalcode – Open4education
Observer: The usageAchievements
VFX/SFX
Events
Messages
Callbacks async
https://gameprogrammingpatterns.com/observer.html
![Page 15: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/15.jpg)
Globalcode – Open4education
Prototype: The problemclass Monster { };
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();
}};
...https://gameprogrammingpatterns.com/prototype.html
![Page 16: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/16.jpg)
Globalcode – Open4education
Prototype: The solution (1)class Monster{public:
virtual ~Monster() {}virtual Monster* clone() = 0;
};
class Ghost : public Monster {public:Ghost(int h, int s): health(h), speed(s){}virtual Monster* clone(){return new Ghost(health, speed);
}private:int health;int speed;
}
https://gameprogrammingpatterns.com/prototype.html
![Page 17: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/17.jpg)
Globalcode – Open4education
Prototype: The solution (2)class Spawner{public:
Spawner(Monster* p): prototype(p){}Monster* spawnMonster(){
return prototype->clone();}
private:Monster* prototype;
};
https://gameprogrammingpatterns.com/prototype.html
![Page 18: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/18.jpg)
Globalcode – Open4education
Prototype: The usageSpawner
Player Items
Shoots
Loot
https://gameprogrammingpatterns.com/prototype.html
![Page 19: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/19.jpg)
Globalcode – Open4education
States: The problemvoid 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;
}}
}
https://gameprogrammingpatterns.com/state.html
![Page 20: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/20.jpg)
Globalcode – Open4education
States: The solutionvoid 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;
}}
https://gameprogrammingpatterns.com/state.html
![Page 21: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/21.jpg)
Globalcode – Open4education
States: The usageAnimations
Screen states
Character actions
https://gameprogrammingpatterns.com/state.html
![Page 22: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/22.jpg)
Globalcode – Open4education
Singleton: The problem
Ensure that only one instance of the singleton class ever exists;
and provide global access to that instance.
Gang of Four, Design Patterns
https://gameprogrammingpatterns.com/singleton.html
![Page 23: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/23.jpg)
Globalcode – Open4education
Singleton: The solutionclass FileSystem{public:
static FileSystem& instance(){
if (instance == NULL) instance = new FileSystem();return *instance;
}private:
FileSystem() {}static FileSystem* instance;
};
https://gameprogrammingpatterns.com/singleton.html
![Page 24: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/24.jpg)
Globalcode – Open4education
Singleton: The usage
“Friends don’t let friends create singletons.”
Robert Nystrom, Game Programming Patterns
https://gameprogrammingpatterns.com/singleton.html
![Page 25: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/25.jpg)
Globalcode – Open4education
Other PatternsSequencing Patterns
Double BufferGame LoopUpdate Method
Behavioral PatternsBytecodeSubclass SandboxType Object
Decoupling PatternsComponentEvent QueueService Locator
Optimization PatternsData LocalityDirty FlagObject PoolSpatial Partition
https://gameprogrammingpatterns.com
![Page 26: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/26.jpg)
Globalcode – Open4education
Game Programming Patterns
gameprogrammingpatterns.com
![Page 27: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/27.jpg)
Globalcode – Open4education
Software ArchitectureIt is not about making diagrams
It is about solving problems… and communicating the solution!
K.I.S.S.
Occam's razor
Less is more
![Page 28: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/28.jpg)
Globalcode – Open4education
SOLID PrinciplesSingle Responsibility
Open/Closed
Liskov Substitution
Interface Segregation
Dependency Inversion
https://devopedia.org/solid-design-principles
![Page 29: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/29.jpg)
gamedeveloper.com.br ggdevcast.com.br
![Page 30: Design Patternsin Game Programming - Amazon S3 · 2019-11-30 · Design Patternsin Game Programming Bruno Cicanci SeniorSoftware Engineer@ AquirisGame Studio. Globalcode –Open4education](https://reader034.fdocuments.in/reader034/viewer/2022042319/5f09586a7e708231d426644e/html5/thumbnails/30.jpg)
aquiris.com.br/work-with-us