ders 4 - hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · desen (texture) terrain...
TRANSCRIPT
![Page 1: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/1.jpg)
Ders 4
![Page 2: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/2.jpg)
Oyun ProgramlamaTasarım Örüntüleri
![Page 3: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/3.jpg)
Command (Emir) Örüntüsü
![Page 4: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/4.jpg)
Nedir?Emir örüntüsü, bir metod çağrısının bir obje ilesarılmasıdır.
Bu şekilde metod çağrısı daha kontrol edilebilirhale gelir.
Mesela emirler bir sıraya konulabilir, gerialınabilir, vs.
![Page 5: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/5.jpg)
Diğer isimleriBenzer örüntüler şu isimlerle de bilinir:
Callback
First-class function
Function pointer
Closure
Partially applied function
![Page 6: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/6.jpg)
Örnek: Girdi Ayarları
![Page 7: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/7.jpg)
Kullanıcı girdisi
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)) lurchIneffectively();}
![Page 8: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/8.jpg)
Kullanıcı girdisiBu fonksiyon her framede game_loop içindeçağrılmaktadır.
Sorun: düğmelerin görevini değiştirmek isteyenoyuncu
Hardcode edilmiş olduğundan mümkün değil
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)) lurchIneffectively();}
![Page 9: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/9.jpg)
Base classclass Command{ public: virtual ~Command() {} virtual void execute() = 0;};
![Page 10: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/10.jpg)
Her aksiyon için bir sub‐classclass JumpCommand : public Command{ public: virtual void execute() { jump(); }};
class FireCommand : public Command{ public: virtual void execute() { fireGun(); }};
// You get the idea...
![Page 11: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/11.jpg)
Input handlerclass InputHandler{ public: void handleInput();
// Methods to bind commands...
private: Command* buttonX_; Command* buttonY_; Command* buttonA_; Command* buttonB_;};
![Page 12: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/12.jpg)
Input handler ve command pointerları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();}
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)) lurchIneffectively();}
![Page 13: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/13.jpg)
What it looks like
![Page 14: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/14.jpg)
Dahası: Aktör tabanlı komutlarEmir örüntüsü ile yalnızca avatarı değil, tümaktörleri yönetebiliriz:
class Command{public: virtual ~Command() {} virtual void execute(GameActor& actor) = 0;};
![Page 15: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/15.jpg)
Aktör tabanlı komutlarclass JumpCommand : public Command{public: virtual void execute(GameActor& actor) { actor.jump(); }};
![Page 16: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/16.jpg)
New handleInputArtık fonksiyonu çağırmak yerine bir emirdönüyor
Command* InputHandler::handleInput(){ if (isPressed(BUTTON_X)) return buttonX_; if (isPressed(BUTTON_Y)) return buttonY_; if (isPressed(BUTTON_A)) return buttonA_; if (isPressed(BUTTON_B)) return buttonB_;
// Nothing pressed, so do nothing. return NULL;}
![Page 17: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/17.jpg)
Hepsini birleş�rmekCommand* command = inputHandler.handleInput();if (command){ command->execute(actor);}
actor ü değiştirerek, istediğimiz karakteri kontroledebiliriz.
![Page 18: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/18.jpg)
AI açısından bakış
AI modülü Command üretir
Bu Command objeleri uygun actor lere gönderilir
AI modülleri, aktörler için plug edilecek objelerhalini alır
![Page 19: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/19.jpg)
Geri al / Tekrar et (Undo/Redo)En bilinen use-caselerden biridir
Gerçek zamanlı oynanmayan bir çok oyunda gerialma özelliği vardır
Aynı zamanda level editörleri vs. için de gereklidir
![Page 20: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/20.jpg)
Örnek: Unit Movementclass MoveUnitCommand : public Command{public: MoveUnitCommand(Unit* unit, int x, int y) : unit_(unit), x_(x), y_(y) {}
virtual void execute() { unit_->moveTo(x_, y_); }
private: Unit* unit_; int x_, y_;};
![Page 21: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/21.jpg)
handleInput
Command* handleInput(){ Unit* unit = getSelectedUnit();
if (isPressed(BUTTON_UP)) { int destY = unit->y() - 1; return new MoveUnitCommand(unit, unit->x(), destY); }
if (isPressed(BUTTON_DOWN)) { int destY = unit->y() + 1; return new MoveUnitCommand(unit, unit->x(), destY); }
// Other moves... return NULL;}
![Page 22: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/22.jpg)
Command classında değişiklikYeni eklenen undo() metodu
class Command{public: virtual ~Command() {} virtual void execute() = 0; virtual void undo() = 0;};
![Page 23: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/23.jpg)
MoveUnitCommand değişikliklericlass MoveUnitCommand : public Command{public: MoveUnitCommand(Unit* unit, int x, int y) : unit_(unit), xBefore_(0), yBefore_(0), x_(x), y_(y) {}
![Page 24: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/24.jpg)
virtual void execute() { // Remember the unit's position before the move // so we can restore it. xBefore_ = unit_->x(); yBefore_ = unit_->y();
unit_->moveTo(x_, y_); }
virtual void undo() { unit_->moveTo(xBefore_, yBefore_); }
private: Unit* unit_; int xBefore_, yBefore_; int x_, y_;};
![Page 25: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/25.jpg)
Emir yığını (Command stack)
Oyun tekrar oynatmaları (game replay) içinfaydalı!
![Page 26: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/26.jpg)
First‐class fonksiyonlarfunction makeMoveUnitCommand(unit, x, y) { var xBefore, yBefore; return { execute: function() { xBefore = unit.x(); yBefore = unit.y(); unit.moveTo(x, y); }, undo: function() { unit.moveTo(xBefore, yBefore); } };}
![Page 27: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/27.jpg)
Sineksiklet (flyweight) Örüntüsü
![Page 28: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/28.jpg)
Bir oyun sahnesiThe fog lifts, revealing a majestic old growthforest. Ancient hemlocks, countless in number,tower over you forming a cathedral of greenery.The stained glass canopy of leaves fragments thesunlight into golden shafts of mist.
“
“
Sis çözülür, ve görkemli yaşlı ormanı açığaçıkarır. Sayısız, kadim baldıran otu, üzerinizdebir yeşillik katedrali oluşturarak yükselir.Yaprakların vitraylı gölgeliği güneş ışığını altınsis şaftlarına böler.
“
“
![Page 29: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/29.jpg)
Anlatmak kolay, yapmak zorBöyle bir sahne milyonlarca poligon demek
Saniyede 60 defa güncellenecek ve tekrarçizilecek milyonlarca poligon
![Page 30: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/30.jpg)
Her bir ağacın özellikleriAğacın unsurlarını tanımlayan poligon mesh
Texture (desen)
Yer ve yön bilgisi
Büyüklük ve tint bilgisi
![Page 31: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/31.jpg)
Örnek kod : Treeclass Tree{private: Mesh mesh_; Texture bark_; Texture leaves_; Vector position_; double height_; double thickness_; Color barkTint_; Color leafTint_;};
![Page 32: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/32.jpg)
Ortak özelliklerin ayrış�rılması
![Page 33: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/33.jpg)
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 34: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/34.jpg)
Nasıl görünüyor?
Modeli GPU'ya bir kerede gönderemezsek biranlamı yok!
“
“
![Page 35: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/35.jpg)
Instanced RenderingHem OpenGL, hem de Direct3D destekliyor
Geometry instancingFrom Wikipedia, the free encyclopedia
In realtime computer graphics, geometry instancing is the practice of rendering multiple copies of the same mesh in a scene atonce. This technique is primarily used for objects such as trees, grass, or buildings which can be represented as repeated geometrywithout appearing unduly repetitive, but may also be used for characters. Although vertex data is duplicated across all instancedmeshes, each instance may have other differentiating parameters (such as color, or skeletal animation pose) changed in order toreduce the appearance of repetition.
Contents
1 API support for geometry instancing2 Geometry instancing in offline rendering3 Video cards that support geometry instancing4 External links5 References
API support for geometry instancing
Starting in Direct3D version 9, Microsoft included support for geometry instancing. This method improves the potential runtime
![Page 36: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/36.jpg)
Peki sineksiklet örüntüsü nedir?Eğer bir nesneden çok fazla varsa, onun ha�folması iyidir
Her nesneyi iki parçaya ayırmaya çalışın
Tüm instance'larda ortak olan kısım
Her instance'a özel olan kısım
Peki amaç sadece hafızadan tasarruf mu?
![Page 37: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/37.jpg)
Bir başka örnek: ZeminBu ağaçların yerleştirileceği zemini düşünelim
Tile-based olsun
Her tile'ın bir türü olsun (çimen, tepe, nehir)
Her tile türünde oyuncunun hızı farklılaşsın
İçinde su olup olmadığı (tekne kullanımı)
Desen (texture)
![Page 38: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/38.jpg)
Terrain enumeratörüTüm bilgileri her tile'da ayrıca tutmak istemeyiz
Bunun yerine tile'in türünü bilmek yeterlidir
enum Terrain{ TERRAIN_GRASS, TERRAIN_HILL, TERRAIN_RIVER // Other terrains...};
![Page 39: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/39.jpg)
World
class World{private: Terrain tiles_[WIDTH][HEIGHT];};
![Page 40: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/40.jpg)
Detaylara erişimint World::getMovementCost(int x, int y) { switch (tiles_[x][y]) { case TERRAIN_GRASS: return 1; case TERRAIN_HILL: return 3; case TERRAIN_RIVER: return 2; }}
bool World::isWater(int x, int y) { switch (tiles_[x][y]) { case TERRAIN_GRASS: return false; case TERRAIN_HILL: return false; case TERRAIN_RIVER: return true; }}
![Page 41: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/41.jpg)
DağınıklıkBu şekilde fazlaca dağınık oldu
Bir zemin türünün bilgisi farklı farklı yerlerdetutuluyor
![Page 42: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/42.jpg)
Daha topluca : Terrain sını�class Terrain { public: Terrain(int moveCost, bool isWater, Texture texture) : movementCost_(moveCost), isWater_(isWater), texture_(texture) {}
int getMovementCost() const { return movementCost_; } bool isWater() const { return isWater_; } const Texture& getTexture() const { return texture_; }
private: int movementCost_; bool isWater_; Texture texture_;};
![Page 43: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/43.jpg)
World
class World{private: Terrain* tiles_[WIDTH][HEIGHT];
// Other stuff...};
![Page 44: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/44.jpg)
Nasıl görünüyor
![Page 45: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/45.jpg)
World , Terrain nesnelerini de tutabilirclass World{ public: World() : grassTerrain_(1, false, GRASS_TEXTURE), hillTerrain_(3, false, HILL_TEXTURE), riverTerrain_(2, true, RIVER_TEXTURE) {}
private: Terrain grassTerrain_; Terrain hillTerrain_; Terrain riverTerrain_;
// Other stuff...};
![Page 46: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/46.jpg)
Örnek: Zeminin hazırlanmasıvoid World::generateTerrain() { // Fill the ground with grass. for (int x = 0; x < WIDTH; x++) { for (int y = 0; y < HEIGHT; y++) { // Sprinkle some hills. if (random(10) == 0) tiles_[x][y] = &hillTerrain_; else tiles_[x][y] = &grassTerrain_; } }
// Lay a river. int x = random(WIDTH); for (int y = 0; y < HEIGHT; y++) { tiles_[x][y] = &riverTerrain_; }}
![Page 47: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/47.jpg)
Erişimconst Terrain& World::getTile(int x, int y) const{ return *tiles_[x][y];}
int cost = world.getTile(2, 3).getMovementCost();
![Page 48: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/48.jpg)
Proto�p Örüntüsü
![Page 49: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/49.jpg)
Nedir?Gauntlet türü bir oyun yaptığımızı farzedin
![Page 50: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/50.jpg)
Nedir?class Monster{ // Stuff...};
class Ghost : public Monster {};class Demon : public Monster {};class Sorcerer : public Monster {};
![Page 51: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/51.jpg)
Spawners
![Page 52: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/52.jpg)
class Spawner { public: virtual ~Spawner() {} virtual Monster* spawnMonster() = 0;};
class GhostSpawner : public Spawner { public: virtual Monster* spawnMonster() { return new Ghost(); }};
class DemonSpawner : public Spawner { public: virtual Monster* spawnMonster() { return new Demon(); }};
![Page 53: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/53.jpg)
SorunlarÇok fazla sınıf
Çok fazla tekrar
Gereksiz kod
![Page 54: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/54.jpg)
Proto�pleme fikri
Her nesne benzerleri için bir prototiptir
class Monster{ public: virtual ~Monster() {} virtual Monster* clone() = 0;
// Other stuff...};
Eğer elinizde bir nesne varsa, bu nesne kendisinebenzer nesneler üretebilir.
“
“
![Page 55: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/55.jpg)
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 56: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/56.jpg)
Spawner koduclass Spawner{ public: Spawner(Monster* prototype) : prototype_(prototype) {}
Monster* spawnMonster() { return prototype_->clone(); }
private: Monster* prototype_;};
![Page 57: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/57.jpg)
Nasıl görünüyor?
![Page 58: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/58.jpg)
Sıkın�larHala bir sürü clone metodu yazılması gerekiyor
Depp clone vs. Shallow clone
Clone by nature is a dif�cult process
![Page 59: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/59.jpg)
Spawn fonksiyonlarıMonster* spawnGhost() { return new Ghost(); }
typedef Monster* (*SpawnCallback)();
class Spawner { public: Spawner(SpawnCallback spawn) : spawn_(spawn) {}
Monster* spawnMonster() { return spawn_(); }
private: SpawnCallback spawn_;};
![Page 60: Ders 4 - Hacettepeyunus.hacettepe.edu.tr/~burkay.genc/courses/bco653... · Desen (texture) Terrain enumeratör ... Hala bir sürü clone metodu yazılması gerekiyor Depp clone vs](https://reader034.vdocuments.site/reader034/viewer/2022050716/5e2edeb56f3226240813a964/html5/thumbnails/60.jpg)
Template (Şablon) kullanımıclass Spawner{ public: virtual ~Spawner() {} virtual Monster* spawnMonster() = 0;};
template <class T>class SpawnerFor : public Spawner{ public: virtual Monster* spawnMonster() { return new T(); }};
Spawner* ghostSpawner = new SpawnerFor<Ghost>();