{"id":3032,"date":"2025-06-09T09:10:07","date_gmt":"2025-06-09T09:10:07","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=3032"},"modified":"2025-06-24T18:19:26","modified_gmt":"2025-06-24T18:19:26","slug":"arac-sdl3-ilk-adimlar-i","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/","title":{"rendered":"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar &#8211; I"},"content":{"rendered":"<p>Evet sevgili yaz\u0131l\u0131mperver dostlar\u0131m, haftal\u0131k yaz\u0131lar\u0131m\u0131za devam ediyoruz. Ge\u00e7en hafta SDL ve SDL2\/SDL3 farklar\u0131na k\u0131sa bir bak\u0131\u015f atm\u0131\u015ft\u0131k.<\/p>\n<p><strong><a href=\"https:\/\/www.yazilimperver.com\/index.php\/2025\/05\/25\/arac-merhaba-sdl3\/\">[ARA\u00c7] Merhaba SDL3<\/a><\/strong><\/p>\n<p>Art\u0131k b\u00fct\u00fcn bunlar\u0131 ete kemi\u011fe\u00a0 b\u00fcr\u00fcnd\u00fcrmenin vakti geldi. Bir s\u00fcre \u00f6nce SDL ile ilgili ne var ne yok diye internete bakt\u0131\u011f\u0131mda, SDL2&#8217;ye y\u00f6nelik olduk\u00e7a fazla kaynak mevcut fakat bunlar\u0131n \u00e7o\u011fu genelde k\u00fc\u00e7\u00fck k\u00fc\u00e7\u00fck kabiliyetlere de\u011finmi\u015f ve uygulama seviyesinde \u00e7ok bilgi vermiyor gibiydi. SDL3&#8217;e y\u00f6nelik de o kadar \u00e7ok kaynak olmasa da, durum benzer. T\u00fcrk\u00e7e kayna\u011f\u0131n da \u00e7ok olmamas\u0131 da ayr\u0131 bir konu. Bu sebeple bu ve birka\u00e7 yaz\u0131m\u0131 SDL&#8217;e ay\u0131raca\u011f\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kapsam<\/strong><\/span><\/h2>\n<p>Daha fazla uzatmadan, bu \u00f6rne\u011fin amac\u0131na de\u011finelim. Bu \u00f6rne\u011fin amac\u0131, 2025 ve sonras\u0131nda modern C++ kullanarak, g\u00f6rsel uygulamalar\/oyunlar geli\u015ftirebilmeniz i\u00e7in SDL3&#8217;e y\u00f6nelik bir \u00f6n izleme sunmak ve bilgilendirmede bulunmak.<\/p>\n<p>Bunu da yaparken, modern C++ ve temel yaz\u0131l\u0131m geli\u015ftirme pratikleri, tasar\u0131m \u00f6r\u00fcnt\u00fcleri ve sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 olu\u015fturmak olacak. Elbette, al\u0131p hemen b\u00fct\u00fcn \u00fcr\u00fcnlerinizde kullan\u0131labilecek d\u00fczeyde olmayabilir, bununla birlikte \u00e7ok az bir u\u011fra\u015f ile bunu kullanabilir hale getirmenizi hedefliyorum. Bu noktada, okunabilirlik, esneklik ve performans hususlar\u0131 konusunda da bir denge g\u00f6zetmeye \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p>Benzeri yaz\u0131larda, SDL&#8217;e y\u00f6nelik ilave kabiliyetleri de bu \u00f6rnek \u00fczerine ekleyerek devam ediyor olaca\u011f\u0131z.<\/p>\n<p>Haydi kurulum ile ba\u015flayal\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kurulum\/Olu\u015fturma<\/strong><\/span><\/h2>\n<p>Bir \u00f6nceki yaz\u0131mda bahsetti\u011fim gibi, SDL3 ile birlikte CMake deste\u011fi \u00e7ok daha iyi bir noktaya gelmi\u015f durumda. Bununla birlikte, tek bir yerde birden fazla platform i\u00e7in kurulum yine de zahmetli olabiliyor. Onun i\u00e7in hem Linux hem de Windows i\u00e7in ihtiya\u00e7 duyaca\u011f\u0131n\u0131z ad\u0131mlar\u0131 bu ba\u015fl\u0131k alt\u0131na ekleyece\u011fim. SDL2 i\u00e7in gerekli ad\u0131mlar\u0131 merak ederseniz, uEngine4 reposu i\u00e7erisinde hem Windows hem de Linux i\u00e7in gerekli ad\u0131m ve betikleri bulabilirsiniz. \u015eimdi SDL3&#8217;e bakal\u0131m.<\/p>\n<p>\u00d6ncelikle Linux&#8217;e bakal\u0131m. Temelde ilgili repoyu indirip, derlemek d\u0131\u015f\u0131nda yapman\u0131z gereken bir \u015fey yok:<\/p>\n<pre class=\"lang:zsh decode:true\"># SDL K\u00fct\u00fcphanesi\r\nwget https:\/\/github.com\/libsdl-org\/SDL\/releases\/download\/release-3.2.14\/SDL3-3.2.14.tar.gz\r\ntar xvf SDL3-3.2.14.tar.gz\r\ncd SDL3-3.2.14\r\ncmake -S . -B build\r\ncmake --build build\r\nsudo cmake --install build --prefix \/usr\/local<\/pre>\n<p>Windows i\u00e7in de benzer ad\u0131mlar\u0131 izleyebilirsiniz.<\/p>\n<pre class=\"lang:c++ decode:true\"># SDL K\u00fct\u00fcphanesi\r\ncurl.exe -L --ssl-revoke-best-effort https:\/\/github.com\/libsdl-org\/SDL\/releases\/download\/release-3.2.14\/SDL3-3.2.14.zip --output SDL3-3.2.14.zip\r\ntar -xvf SDL3-3.2.14.zip\r\ncd SDL3-3.2.14\r\n\r\n# VS2022 d\u0131\u015f\u0131nda bir visual studio var ise a\u015fa\u011f\u0131da ilgili komutu \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z\r\ncall \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Auxiliary\\Build\\vcvars64.bat\"\r\n\r\n# Ninja'y\u0131 path'e ekledi\u011finizden emin olun\r\ncmake -B build_ninja -G \"Ninja Multi-Config\" -DBUILD_STATIC_LIBS=ON\r\ncmake --build build_ninja --config Release\r\ncmake --install build_ninja --config Release  --prefix C:\/sdl3\r\ncmake --build build_ninja --config Debug\r\ncmake --install build_ninja --config Debug --prefix C:\/sdl3\r\n<\/pre>\n<p>Evet kurulumlar\u0131 ger\u00e7ekle\u015ftirdikten sonra, \u00f6rnek uygulamam\u0131za g\u00f6z atmaya ba\u015flayabiliriz. Yukar\u0131daki ad\u0131mlara y\u00f6nelik de betikleri en k\u0131sa s\u00fcrede ekleyece\u011fim.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Temel Kabiliyetler<\/strong><\/span><\/h2>\n<p>\u015eimdi projemizdeki \u00f6nemli s\u0131n\u0131flara ve bunlar\u0131 geli\u015ftirirken izledi\u011fimiz ve kulland\u0131\u011f\u0131m\u0131z yakla\u015f\u0131mlara g\u00f6z atal\u0131m. Bunu yapmadan \u00f6nce a\u015fa\u011f\u0131daki adresten kodu indirmeyi unutmay\u0131n. \u015eu an kod hem windows hem de linux i\u00e7in derlenebiliyor (derlenmiyorsa, bana ula\u015fabilirsiniz).<\/p>\n<p><span style=\"color: #0000ff;\"><strong><a style=\"color: #0000ff;\" href=\"https:\/\/github.com\/yazilimperver\/cpp-playground\">https:\/\/github.com\/yazilimperver\/cpp-playground<\/a><\/strong><\/span><\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Kaynak Y\u00f6netimi (RAII Kullan\u0131larak)<\/strong><\/span><\/h3>\n<p>\u00d6ncelikli olarak SDL kaynak y\u00f6netimine bak\u0131yor olaca\u011f\u0131z. Burada ve benzer bir\u00e7ok yerde RAII prensibini kullanabilirsiniz. Asl\u0131nda bakarsan\u0131z, benzer yakla\u015f\u0131m\u0131 OpenGL ve benzeri k\u00fct\u00fcphaneler i\u00e7in de kolayca kullanabilirsiniz.\u00a0 Peki RAII nedir?<\/p>\n<p data-start=\"351\" data-end=\"815\">SDL gibi k\u00fct\u00fcphaneler yan\u0131nda C++\u2019ta da bellek, dosya tan\u0131t\u0131c\u0131lar\u0131, mutex ve benzeri kaynaklar\u0131n y\u00f6netimi ve ne zaman silinece\u011fini takip etmek zorlu olabilir. \u0130\u015fte bu noktada,\u00a0 <em data-start=\"463\" data-end=\"510\">RAII (Resource Acquisition Is Initialization)<\/em> prensibi ile kaynak y\u00f6netimini hem g\u00fcvenli hem de otomatik hale getirerek, bu karma\u015f\u0131kl\u0131\u011f\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde ortadan kald\u0131rabiliriz. RAII\u2019nin temel fikri, bir kayna\u011f\u0131n \u00f6mr\u00fcn\u00fc bir nesnenin \u00f6mr\u00fc ile otomatik olarak hizalamak\/ba\u011flamakt\u0131r. \u015e\u00f6yle ki; bir nesne olu\u015fturuldu\u011funda kaynak elde edilir, nesne yok edildi\u011finde ise kaynak otomatik olarak serbest b\u0131rak\u0131l\u0131r\/silinir. A\u015fa\u011f\u0131da \u00e7ok basit bir \u015fekilde bu g\u00f6sterilmi\u015ftir:<\/p>\n<p data-start=\"817\" data-end=\"1254\"><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/java-design-patterns.com\/assets\/img\/raii-sequence-diagram.fc3d918b.png\" alt=\"Resource Acquisition Is Initialization in Java: Ensuring Safe Resource Management | Java Design Patterns\" width=\"451\" height=\"302\" \/><\/p>\n<p data-start=\"817\" data-end=\"1254\">Modern C++\u2019ta <code data-start=\"831\" data-end=\"848\">std::unique_ptr<\/code>, <code data-start=\"850\" data-end=\"867\">std::shared_ptr<\/code>, <code data-start=\"869\" data-end=\"886\">std::lock_guard<\/code> ve <code data-start=\"890\" data-end=\"904\">std::fstream<\/code> gibi s\u0131n\u0131flar da RAII prensibini takip ederler. \u00d6rne\u011fin <code data-start=\"965\" data-end=\"982\">std::lock_guard<\/code>, bir mutex\u2019i kilitleyip otomatik olarak serbest b\u0131rak\u0131rken, <code data-start=\"1043\" data-end=\"1060\">std::unique_ptr<\/code> dinamik belle\u011fi g\u00fcvenli bir \u015fekilde y\u00f6netir. Bu sayede <code data-start=\"1116\" data-end=\"1124\">delete<\/code> veya <code data-start=\"1130\" data-end=\"1138\">unlock<\/code> gibi \u00e7a\u011fr\u0131lar\u0131 manuel olarak yapman\u0131za gerek kalmaz, bu da bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 ve &#8220;race condition&#8221; gibi durumlar\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur.<\/p>\n<p>RAII prensibi sadece daha temiz ve okunabilir kod \u00fcretmekle kalmaz, ayn\u0131 zamanda hata y\u00f6netimini kolayla\u015ft\u0131r\u0131r. Bu yakla\u015f\u0131m \u00f6zellikle grafik ve b\u00fcy\u00fck \u00e7apl\u0131 uygulamalarda, kaynak y\u00f6netimi i\u00e7in de olduk\u00e7a \u00f6nemlidir. \u00d6rnek uygulamam\u0131zda ise RAII&#8217;yi SDL kaynak s\u0131n\u0131flar\u0131 i\u00e7in kullanaca\u011f\u0131z. <em>SDLResource<\/em> s\u0131n\u0131f\u0131n\u0131 da tam olarak bu ama\u00e7la geli\u015ftirdik. Bu sayede;<\/p>\n<ul class=\"[&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc space-y-1.5 pl-7\">\n<li class=\"whitespace-normal break-words\"><strong>Otomatik temizlik<\/strong>: Destructor&#8217;da kaynak otomatik olarak SDL API&#8217;leri kullan\u0131larak serbest b\u0131rak\u0131l\u0131r,<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Modern C++<\/strong>: Move semantics ile kopyalaman\u0131n \u00f6n\u00fcne ge\u00e7iyoruz,<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Tip G\u00fcvenli\u011fi<\/strong>: Template ile derleme zaman\u0131nda tip kontrol\u00fc yapabiliyoruz.<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">template&lt;typename T, void(*Deleter)(T*)&gt;\r\nclass SDLResource {\r\nprivate:\r\n    T* mResource;\r\npublic:\r\n    explicit SDLResource(T* resource = nullptr) : mResource(resource) {}\r\n    ~SDLResource() {\r\n        if (mResource) {\r\n            Deleter(mResource);\r\n        }\r\n    }\r\n    \/\/ Move semantics ve di\u011fer API'ler\r\n};\r\n\r\n\/\/ SDLWindow, Renderer ve Texture i\u00e7in kullan\u0131labilecek olan tan\u0131mlamalar\u0131m\u0131z\r\nusing SDLWindow = SDLResource&lt;SDL_Window, SDL_DestroyWindow&gt;;\r\nusing SDLRenderer = SDLResource&lt;SDL_Renderer, SDL_DestroyRenderer&gt;;\r\nusing SDLTexture = SDLResource&lt;SDL_Texture, SDL_DestroyTexture&gt;;<\/pre>\n<h3><span style=\"color: #0000ff;\"><strong>Olay (Event) Y\u00f6netimi (Observer Pattern&#8217;i Kullan\u0131larak)<\/strong><\/span><\/h3>\n<p>SDL k\u00fct\u00fcphanesi ve benzeri bir \u00e7ok i\u015fletim sistemi ve pencere soyutlama k\u00fct\u00fcphanesi bir \u015fekilde etkile\u015fimleri size sunmak i\u00e7in gerekli API&#8217;leri sa\u011flarlar. SDL kapsam\u0131nda da benzer bir mekanizma mevcut.<\/p>\n<div>\n<div><em>SDL_PollEvent<\/em> API&#8217;si ile s\u0131radaki eventleri alabiliyorsunuz. uEngine4&#8217;te de hat\u0131rlarsan\u0131z, &#8220;Listener&#8221; uzant\u0131l\u0131 aray\u00fcz s\u0131n\u0131flar\u0131 ile alt s\u0131n\u0131flar\u0131 haberdar ediyorduk. Bu \u00f6rne\u011fimizde ise, &#8220;Observer&#8221; tasar\u0131m \u00f6r\u00fcnt\u00fcs\u00fcn\u00fc kullanarak bunu yapaca\u011f\u0131z. Bu tasar\u0131m \u00f6r\u00fcnt\u00fcs\u00fc, Gang of Four&#8217;un en \u00fcnl\u00fc \u00f6r\u00fcnt\u00fclerinden birisidir.<\/div>\n<div>Nedir peki?<\/div>\n<div>K\u0131saca, bir nesnemizde olan de\u011fi\u015fikliklerin, bununla ilgilenen, di\u011fer nesnelere otomatik olarak bildirilmesine dayanan davran\u0131\u015fsal bir tasar\u0131m \u00f6r\u00fcnt\u00fcs\u00fcd\u00fcr. Tahmin edebilece\u011finiz \u00fczere grafiksel kullan\u0131c\u0131 aray\u00fczlerinde, kullan\u0131c\u0131 taraf\u0131ndan tetiklenen olaylarda, bunlara y\u00f6nelik gerekli aksiyonlar\u0131n al\u0131nmas\u0131 i\u00e7in de bu \u00f6r\u00fcnt\u00fc kullan\u0131l\u0131r. Bir di\u011fer yayg\u0131n \u00f6rne\u011fi de, QT framework&#8217;\u00fc ile sunulan sinyal\/slot mekanizmas\u0131d\u0131r. A\u015fa\u011f\u0131da bu \u00f6r\u00fcnt\u00fcye y\u00f6nelik genel bir s\u0131n\u0131f diyagram\u0131n\u0131 g\u00f6rebilirsiniz. Burada, &#8220;observer&#8221;&#8216;lar\u0131n ilgilendikleri konudan <em>notify<\/em> API&#8217;si ile nas\u0131l haberdar edildiklerini g\u00f6rebilirsiniz.<\/div>\n<\/div>\n<p><img decoding=\"async\" src=\"https:\/\/www.modernescpp.com\/wp-content\/uploads\/2017\/08\/Observer.png\" alt=\"The Observer Pattern \u2013 MC++ BLOG\" \/><\/p>\n<p>Biz de bu \u00f6r\u00fcnt\u00fcy\u00fc SDL olaylar\u0131n\u0131n ilgili uygulama s\u0131n\u0131flar\u0131na ge\u00e7irilmesinde kullanaca\u011f\u0131z. Peki bu bize ne sa\u011fl\u0131yor?<\/p>\n<ul>\n<li class=\"whitespace-normal break-words\"><strong>D\u00fc\u015f\u00fck Ba\u011f\u0131ml\u0131l\u0131k (&#8220;Loose coupling&#8221;)<\/strong>:\u00a0 Olay\u0131 tetikleyen ile bunu t\u00fcketenler aras\u0131ndan ba\u011f\u0131ms\u0131zl\u0131k,<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Geni\u015fleyebilirlik (&#8220;Extensibility&#8221;)<\/strong>: Yeni dinleyiciler kolay eklenebilmekte,<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Konular\u0131n Ayr\u0131lmas\u0131 (&#8220;Separation of concerns&#8221;)<\/strong>: Farkl\u0131 farkl\u0131 mekanizmalar\u0131n birbirlerinden ayr\u0131labilmesi (UI, Girdi\/\u00c7\u0131kt\u0131, vs). Bunlar\u0131n her bir farkl\u0131 bir dinleyici olabilir.<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true \">class EventObserver {\r\npublic:\r\n    virtual ~EventObserver() = default;\r\n    virtual void OnEvent(const SDL_Event&amp; event) = 0;\r\n};\r\n\r\nclass EventSubject {\r\nprivate:\r\n    std::vector&lt;EventObserver*&gt; mObservers;\r\n\r\npublic:\r\n    void AddObserver(EventObserver* observer);    \r\n    void RemoveObserver(EventObserver* observer);    \r\n    void NotifyObservers(const SDL_Event&amp; event);\r\n};<\/pre>\n<p>SDL&#8217;e y\u00f6nelik olaylar\u0131 dinlemek isteyen s\u0131n\u0131flar (ki \u00f6rne\u011fimizde <em>Sdl3Application\u00a0<\/em>s\u0131n\u0131f\u0131),\u00a0<em>EventObserver<\/em> aray\u00fcz\u00fcn\u00fc ger\u00e7ekleyerek, olaylardan\u00a0<em>OnEvent<\/em> API&#8217;si ile haberdar olabilmektedir. Dinlemek i\u00e7in de <em>EventSubject\u00a0<\/em>s\u0131n\u0131f\u0131n\u0131n bir nesnesini uygulama s\u0131n\u0131f\u0131 i\u00e7erisinde olu\u015fturup, s\u0131n\u0131f\u0131n kendisini dinleyici olarak ekliyoruz.<\/p>\n<p>Daha karma\u015f\u0131k uygulamalarda, sadece ilgili s\u0131n\u0131flar\u0131 da buraya dinleyici olarak ekleyebiliriz. \u0130laveten, uEngine4&#8217;teki gibi, olay tiplerine g\u00f6re de \u00f6zelle\u015ftirmeye gidilebilir. \u00d6rne\u011fi \u00e7ok karma\u015f\u0131kla\u015ft\u0131rmamak ad\u0131na \u015fu an bu \u015fekilde ilerliyor olaca\u011f\u0131z. <em>Sdl3Application\u00a0<\/em>s\u0131n\u0131f\u0131 i\u00e7erisindeki, <em>OnEvent\u00a0<\/em>fonksiyonu i\u00e7erisinde de, bu olaylar\u0131n tipine g\u00f6re (event.type, SDL_EVENT_*), gerekli i\u015flemlerin yap\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<p>SDL_Event detaylar\u0131 i\u00e7in <strong><a href=\"https:\/\/wiki.libsdl.org\/SDL3\/SDL_Event\">https:\/\/wiki.libsdl.org\/SDL3\/SDL_Event<\/a><\/strong> adresine g\u00f6z atabilirsiniz.<\/p>\n<h3><span style=\"color: #0000ff;\"><strong>G\u00f6rsel Nesneler (Bile\u015fen \u00d6r\u00fcnt\u00fcs\u00fc) ve Bunlar\u0131n Olu\u015fturulmas\u0131 (Fabrika \u00d6r\u00fcnt\u00fcs\u00fc)<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">Bu ba\u015fl\u0131\u011f\u0131m\u0131zda ise, basit g\u00f6rsel bile\u015fenleri nas\u0131l olu\u015fturaca\u011f\u0131m\u0131za bakaca\u011f\u0131z. uEngine4 ve QT tarz\u0131 k\u00fct\u00fcphaneler bu ama\u00e7la &#8220;Painter&#8221; dedi\u011fimiz ve temel \u00e7izim kabiliyetlerini i\u00e7eren API&#8217;ler sunmaktad\u0131rlar. <\/span><\/p>\n<p><span style=\"color: #000000;\">Oyunlarda ise son zamanlar, ECS (Entity Component System) denilen ve performans\u0131 da \u00f6ne \u00e7\u0131karan yakla\u015f\u0131mlar yayg\u0131n olarak kullan\u0131lmakta. Biz ise \u00f6rne\u011fimizde, miras tabanl\u0131 bir bile\u015fen yakla\u015f\u0131m\u0131 izleyece\u011fiz. Hemen \u00f6rnek bir kod par\u00e7as\u0131 ile ba\u015flayal\u0131m:<\/span><\/p>\n<pre class=\"lang:c++ decode:true\">class Component {\r\npublic:\r\n    GraphicalObject* mOwner = nullptr;\r\n    virtual ~Component() = default;\r\n    virtual void Update(float deltaTime) {}\r\n    virtual void Render(Renderer&amp; renderer) {}\r\n};\r\n\r\nclass Transform : public Component {\r\npublic:\r\n    float mX = 0.0F;    float mY = 0.0F;\r\n    float mRotation = 0.0F;    float mScaleX = 1.0F;    float mScaleY = 1.0F;\r\n    ...\r\n};\r\n\r\nclass Velocity : public Component {\r\npublic:\r\n    float mVx = 0.0F;  float mVy = 0.0F;\r\n    ...\r\n};\r\n\r\nclass GraphicalObject {\r\nprivate:\r\n    std::vector&lt;std::unique_ptr&lt;Component&gt;&gt; mComponents;\r\n    \r\npublic:\r\n    template&lt;typename T, typename... Args&gt;\r\n    T* AddComponent(Args&amp;&amp;... args) {\r\n        ...\r\n    }\r\n    \r\n    template&lt;typename T&gt;\r\n    T* GetComponent() const {\r\n        ...\r\n    }\r\n};<\/pre>\n<p>Burada her bir g\u00f6rsel nesnemiz i\u00e7in temsili olarak <em>GraphicalObject\u00a0<\/em>s\u0131n\u0131f\u0131m\u0131z bulunmakta, daha sonra bu nesnelerimize kullan\u0131m\u0131na g\u00f6re\u00a0<em>Component\u00a0<\/em>aray\u00fcz s\u0131n\u0131f\u0131ndan t\u00fcretilen bile\u015fenleri (Transform, Velocity ve RendererComponent) ekleyerek davran\u0131\u015f\u0131n\u0131 belirleyebiliyoruz. Daha \u00f6nce de ifade etti\u011fim gibi burada miras tabanl\u0131 bir yakla\u015f\u0131m izliyoruz ve Nesne Y\u00f6nelimli Yaz\u0131l\u0131m geli\u015ftirme pratiklerini uyguluyoruz. Bu da temel uygulamalar\u0131n\u0131z i\u00e7in yeterli olacakt\u0131r.<\/p>\n<p>Peki bu nesneleri nas\u0131l olu\u015fturabiliriz?<\/p>\n<p>Bunun i\u00e7in de yine \u00e7ok bilindik bir tasar\u0131m \u00f6r\u00fcnt\u00fcs\u00fc olan Fabrika \u00d6r\u00fcnt\u00fcs\u00fcn\u00fc kullanaca\u011f\u0131z. Bu \u00f6r\u00fcnt\u00fcy\u00fc \u00f6zellikle nesne olu\u015fturma i\u015flemlerinin kontrol\u00fcn\u00fc soyutlamak ve geni\u015fleyebilirli\u011fi y\u00f6netmek i\u00e7in kullan\u0131yoruz. Burada temel olarak, ilgili s\u0131n\u0131f\u0131 direk olu\u015fturmak yerine, bir fabrika s\u0131n\u0131f\u0131 marifeti ile ilgili s\u0131n\u0131flar\u0131 olu\u015fturmaya dayan\u0131yor. Burada da, modern C++ ile gelen ak\u0131ll\u0131 i\u015faret\u00e7ileri ve yukar\u0131da bahsetti\u011fim, bile\u015fen tabanl\u0131 yakla\u015f\u0131m\u0131 uygulayabiliriz. Hemen ilgili s\u0131n\u0131f\u0131m\u0131za g\u00f6z atal\u0131m:<\/p>\n<pre class=\"lang:c++ decode:true\">class GraphicalObjectFactory {\r\npublic:\r\n    static std::unique_ptr&lt;GraphicalObject&gt; CreateRectangle(float x, float y) {\r\n        auto rectangleObj = std::make_unique&lt;GraphicalObject&gt;();\r\n        rectangleObj-&gt;AddComponent&lt;Transform&gt;(x, y);\r\n        rectangleObj-&gt;AddComponent&lt;Velocity&gt;(0.0f, 0.0f);\r\n    \r\n        auto renderStrategy = std::make_unique&lt;RectangleRenderer&gt;(\r\n            SDL_Color{0, 255, 0, 255}, 50, 50);\r\n        rectangleObj-&gt;AddComponent&lt;RenderComponent&gt;(std::move(renderStrategy));\r\n        return rectangleObj;\r\n    }\r\n\r\n    static std::unique_ptr&lt;GraphicalObject&gt; CreateCircle(float x, float y){\r\n       ...\r\n    }\r\n\r\n    static std::unique_ptr&lt;GraphicalObject&gt; CreateTriangle(float x, float y){\r\n       ...\r\n    }\r\n};<\/pre>\n<p>Yukar\u0131daki fabrika s\u0131n\u0131f\u0131 ile dikd\u00f6rtgen, daire ve \u00fc\u00e7gen \u015fekiller olu\u015fturabiliyoruz. \u0130lgili nesneleri de <em>Sdl3Application::Initialize\u00a0<\/em>metodu i\u00e7erisinde olu\u015fturuyoruz.<\/p>\n<p>Fabrika \u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn faydalar\u0131na bakacak olursak:<\/p>\n<ul>\n<li><strong>Enkaps\u00fclasyon (Encapsulation)<\/strong>: Nesne olu\u015fturma mant\u0131\u011f\u0131 bir yerde,<\/li>\n<li><strong>Tutarl\u0131l\u0131k:<\/strong> Ayn\u0131 tip nesneler hep ayn\u0131 \u015fekilde yarat\u0131lmakta,<\/li>\n<li><strong>Uyarlama:<\/strong> \u00d6rnekte b\u00f6yle de\u011fil ama, farkl\u0131 konfig\u00fcrasyon dosyas\u0131 ya da girdileri ile nesne olu\u015fturma uyarlanabilir.<\/li>\n<\/ul>\n<h2><span style=\"color: #0000ff;\"><strong>Sonraki Ad\u0131mlar<\/strong><\/span><\/h2>\n<p>Evet sevgili yaz\u0131l\u0131mperver dostlar\u0131m. Bu yaz\u0131m\u0131n sonuna geldik ama uygulamaya y\u00f6nelik s\u00f6yleyeceklerim hen\u00fcz bitmedi. Bir sonraki yaz\u0131mda, bu geometrik nesneleri nas\u0131l g\u00f6rselle\u015ftirece\u011fimize, uygulaman\u0131n nihai haline ve bir araya getirilmesine bak\u0131yor olaca\u011f\u0131z. O zaman kadar kendinize iyi bak\u0131n ve repodaki uygulamay\u0131 incelemeyi ve \u00e7al\u0131\u015ft\u0131rmay\u0131 unutmayal\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Kaynaklar<\/strong><\/span><\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Resource_acquisition_is_initialization#:~:text=Resource%20acquisition%20is%20initialization%20(RAII,is%20tied%20to%20object%20lifetime.\">https:\/\/en.wikipedia.org\/wiki\/Resource_acquisition_is_initialization#:~:text=Resource%20acquisition%20is%20initialization%20(RAII,is%20tied%20to%20object%20lifetime.<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/en.cppreference.com\/w\/cpp\/language\/raii.html\">https:\/\/en.cppreference.com\/w\/cpp\/language\/raii.html<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/www.youtube.com\/watch?v=Rfu06XAhx90\">https:\/\/www.youtube.com\/watch?v=Rfu06XAhx90<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/refactoring.guru\/design-patterns\/observer\/cpp\/example\">https:\/\/refactoring.guru\/design-patterns\/observer\/cpp\/example<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/gameprogrammingpatterns.com\/\">https:\/\/gameprogrammingpatterns.com\/<\/a><\/strong><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Evet sevgili yaz\u0131l\u0131mperver dostlar\u0131m, haftal\u0131k yaz\u0131lar\u0131m\u0131za devam ediyoruz. Ge\u00e7en hafta SDL ve SDL2\/SDL3 farklar\u0131na k\u0131sa bir bak\u0131\u015f atm\u0131\u015ft\u0131k. [ARA\u00c7] Merhaba SDL3 Art\u0131k b\u00fct\u00fcn bunlar\u0131 ete kemi\u011fe\u00a0 b\u00fcr\u00fcnd\u00fcrmenin vakti geldi. Bir s\u00fcre \u00f6nce SDL ile ilgili ne var ne yok diye internete bakt\u0131\u011f\u0131mda, SDL2&#8217;ye y\u00f6nelik olduk\u00e7a fazla kaynak mevcut fakat bunlar\u0131n \u00e7o\u011fu genelde k\u00fc\u00e7\u00fck k\u00fc\u00e7\u00fck kabiliyetlere&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\">Continue reading <span class=\"meta-nav\">&#8594;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,41,25,188],"tags":[155,336,1177,1175,1172,42,1176,1173,1174,62,1155,72],"class_list":["post-3032","post","type-post","status-publish","format-standard","hentry","category-c","category-modern-c","category-oyun-gelistirme","category-yazilim-muhendisligi","tag-cmake","tag-design-patterns","tag-event-management","tag-factory-designe-pattern","tag-installation","tag-modern-c","tag-observer-pattern","tag-raii","tag-resource-management","tag-sdl","tag-sdl3","tag-smart-pointers"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar - I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar - I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Evet sevgili yaz\u0131l\u0131mperver dostlar\u0131m, haftal\u0131k yaz\u0131lar\u0131m\u0131za devam ediyoruz. Ge\u00e7en hafta SDL ve SDL2\/SDL3 farklar\u0131na k\u0131sa bir bak\u0131\u015f atm\u0131\u015ft\u0131k. [ARA\u00c7] Merhaba SDL3 Art\u0131k b\u00fct\u00fcn bunlar\u0131 ete kemi\u011fe\u00a0 b\u00fcr\u00fcnd\u00fcrmenin vakti geldi. Bir s\u00fcre \u00f6nce SDL ile ilgili ne var ne yok diye internete bakt\u0131\u011f\u0131mda, SDL2&#8217;ye y\u00f6nelik olduk\u00e7a fazla kaynak mevcut fakat bunlar\u0131n \u00e7o\u011fu genelde k\u00fc\u00e7\u00fck k\u00fc\u00e7\u00fck kabiliyetlere... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-09T09:10:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-24T18:19:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/java-design-patterns.com\/assets\/img\/raii-sequence-diagram.fc3d918b.png\" \/>\n<meta name=\"author\" content=\"yaz\u0131l\u0131mperver\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"yaz\u0131l\u0131mperver\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar &#8211; I\",\"datePublished\":\"2025-06-09T09:10:07+00:00\",\"dateModified\":\"2025-06-24T18:19:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\"},\"wordCount\":1728,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"CMAKE\",\"Design patterns\",\"event management\",\"factory designe pattern\",\"installation\",\"Modern C++\",\"observer pattern\",\"RAII\",\"resource management\",\"SDL\",\"SDL3\",\"smart pointers\"],\"articleSection\":[\"C++\",\"Modern C++\",\"Oyun Geli\u015ftirme\",\"Yaz\u0131l\u0131m M\u00fchendisli\u011fi\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\",\"name\":\"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar - I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2025-06-09T09:10:07+00:00\",\"dateModified\":\"2025-06-24T18:19:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar &#8211; I\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yazilimperver.com\/#website\",\"url\":\"https:\/\/www.yazilimperver.com\/\",\"name\":\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"description\":\"Payla\u015fmak g\u00fczeldir.\",\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yazilimperver.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\",\"name\":\"yaz\u0131l\u0131mperver\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"contentUrl\":\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png\",\"caption\":\"yaz\u0131l\u0131mperver\"},\"logo\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar - I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/","og_locale":"tr_TR","og_type":"article","og_title":"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar - I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Evet sevgili yaz\u0131l\u0131mperver dostlar\u0131m, haftal\u0131k yaz\u0131lar\u0131m\u0131za devam ediyoruz. Ge\u00e7en hafta SDL ve SDL2\/SDL3 farklar\u0131na k\u0131sa bir bak\u0131\u015f atm\u0131\u015ft\u0131k. [ARA\u00c7] Merhaba SDL3 Art\u0131k b\u00fct\u00fcn bunlar\u0131 ete kemi\u011fe\u00a0 b\u00fcr\u00fcnd\u00fcrmenin vakti geldi. Bir s\u00fcre \u00f6nce SDL ile ilgili ne var ne yok diye internete bakt\u0131\u011f\u0131mda, SDL2&#8217;ye y\u00f6nelik olduk\u00e7a fazla kaynak mevcut fakat bunlar\u0131n \u00e7o\u011fu genelde k\u00fc\u00e7\u00fck k\u00fc\u00e7\u00fck kabiliyetlere... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2025-06-09T09:10:07+00:00","article_modified_time":"2025-06-24T18:19:26+00:00","og_image":[{"url":"https:\/\/java-design-patterns.com\/assets\/img\/raii-sequence-diagram.fc3d918b.png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"8 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar &#8211; I","datePublished":"2025-06-09T09:10:07+00:00","dateModified":"2025-06-24T18:19:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/"},"wordCount":1728,"commentCount":2,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["CMAKE","Design patterns","event management","factory designe pattern","installation","Modern C++","observer pattern","RAII","resource management","SDL","SDL3","smart pointers"],"articleSection":["C++","Modern C++","Oyun Geli\u015ftirme","Yaz\u0131l\u0131m M\u00fchendisli\u011fi"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/","name":"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar - I - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2025-06-09T09:10:07+00:00","dateModified":"2025-06-24T18:19:26+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2025\/06\/09\/arac-sdl3-ilk-adimlar-i\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"[ARA\u00c7] SDL3 \u0130lk Ad\u0131mlar &#8211; I"}]},{"@type":"WebSite","@id":"https:\/\/www.yazilimperver.com\/#website","url":"https:\/\/www.yazilimperver.com\/","name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","description":"Payla\u015fmak g\u00fczeldir.","publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yazilimperver.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb","name":"yaz\u0131l\u0131mperver","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/","url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","contentUrl":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2018\/04\/OnlyIcon-1-114x114.png","caption":"yaz\u0131l\u0131mperver"},"logo":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3032","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/comments?post=3032"}],"version-history":[{"count":14,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3032\/revisions"}],"predecessor-version":[{"id":3052,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/3032\/revisions\/3052"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=3032"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=3032"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=3032"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}