{"id":2786,"date":"2023-06-07T19:49:28","date_gmt":"2023-06-07T19:49:28","guid":{"rendered":"https:\/\/www.yazilimperver.com\/?p=2786"},"modified":"2023-09-10T20:28:56","modified_gmt":"2023-09-10T20:28:56","slug":"uengine4-seruveni-giris-painter-siniflari","status":"publish","type":"post","link":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/","title":{"rendered":"uEngine4 Ser\u00fcveni &#8211; Giri\u015f (Painter S\u0131n\u0131flar\u0131)"},"content":{"rendered":"<p>Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m, uzun s\u00fcredir devam eden C++ yaz\u0131lar\u0131m\u0131zla C++ 17 ile birlikte gelen bir\u00e7ok \u00f6zelli\u011fe bakarak birlikte ke\u015ffettik, bundan sonra da C++ 20 ile gelen \u00f6zelliklere bak\u0131yor olaca\u011f\u0131z. Bunun yan\u0131nda, bir s\u00fcre \u00f6nce de sizlere duyurusunu yapt\u0131\u011f\u0131m, hatta \u00f6rnek bir uygulamay\u0131 sizlerle payla\u015ft\u0131\u011f\u0131m uEngine4 de art\u0131k yumurtadan \u00e7\u0131kt\u0131.<\/p>\n<p><a href=\"https:\/\/www.yazilimperver.com\/index.php\/2022\/12\/11\/uengine4-matrix-dusen-harf-uygulamasi\/\"><span style=\"color: #008000;\"><strong>uEngine4 &#8211; Matrix, D\u00fc\u015fen Harf Uygulamas\u0131<\/strong><\/span><\/a><\/p>\n<p>\u00d6zellikle etkile\u015fimli basit oyun, g\u00f6rselle\u015ftirme ve harita\/CBS (Co\u011frafi Bilgi Sistemi) \u00e7oklu platform uygulamalar\u0131 i\u00e7in kullanabilece\u011finiz k\u00fct\u00fcphanem kullan\u0131labilecek seviyeye geldi. Elbette daha \u00f6n\u00fcnde uzun bir yolu var ama bu yolu hep birlikte katediyor olaca\u011f\u0131z.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Ama\u00e7<\/strong><\/span><\/h2>\n<p>\u00d6ncelikle amac\u0131m\u0131za tekrar bir g\u00f6z atal\u0131m. uEngine4, www.yazilimperver.com sayfas\u0131nda payla\u015ft\u0131\u011f\u0131m konular\u0131 i\u00e7eren, C++ ile g\u00f6rselle\u015ftirme, 2B grafik, oyun ve harita benzeri etkile\u015fimli uygulamalar geli\u015ftirmek isteyenlere yol g\u00f6stermek, ilk ad\u0131m olmak ve fikir vermek i\u00e7in geli\u015ftirilen bir k\u00fct\u00fcphane.<\/p>\n<p>Daha \u00f6nce, OpenGL, SFML, SDL2 derken bir\u00e7ok C++ tabanl\u0131 g\u00f6rselle\u015ftirme k\u00fct\u00fcphanesini, \u00e7oklu platformlar i\u00e7in g\u00f6rsel uygulamalar geli\u015ftirmede kulland\u0131m. Hatta, benzerlerini de profesyonel hayatta geli\u015ftirdim. \u015eu bir ger\u00e7ek ki, bu i\u015flere yeni ba\u015flayan arkada\u015flar i\u00e7in, bu k\u00fct\u00fcphanelerin sunulan API&#8217;lerini anlay\u0131p, zihinlerindeki projeleri hemen hayata ge\u00e7irmeleri \u00f6zellikle OpenGL ve SDL kullan\u0131lmas\u0131 durumunda biraz vakit alabiliyor, SFML belki di\u011ferlerinden bir t\u0131k \u00f6nde olabilir. Bu k\u00fct\u00fcphane ile birlikte bu ilk e\u015fi\u011fi kolay bir \u015fekilde atlat\u0131p, Godot ve benzeri \u00fcst seviye bir ara\u00e7 da kullanmadan ama \u00e7ok da alt seviyeye inmeden ve tabi ki C++ kullanarak bu ve benzeri uygulamalar\u0131 geli\u015ftirmenize yard\u0131mc\u0131 olmas\u0131n\u0131 umut ediyorum.<\/p>\n<p>\u00d6ncelikle, motorun kaynak kodlar\u0131na, \u00f6rnek uygulamalara ve dok\u00fcmanlara a\u015fa\u011f\u0131daki adresten ula\u015fabilirsiniz. Bu sebeple bu adresi hemen, s\u0131k kullan\u0131lanlar ve takip edilenler aras\u0131na ekliyoruz \ud83d\ude42<\/p>\n<p><strong><span style=\"color: #008000;\"><a style=\"color: #008000;\" href=\"https:\/\/github.com\/yazilimperver\/uEngine4\">https:\/\/github.com\/yazilimperver\/uEngine4<\/a><\/span><\/strong><\/p>\n<h2><span style=\"color: #0000ff;\"><strong>Genel Tasar\u0131m<\/strong><\/span><\/h2>\n<p>Genel tasar\u0131m olarak asl\u0131nda, kabiliyetleri b\u00fcy\u00fck bir proje i\u00e7erisinde koymaktansa, k\u00fc\u00e7\u00fck k\u00fc\u00e7\u00fck projelere b\u00f6lmeyi\u00a0 tercih ettim (en az\u0131ndan \u015fimdilik). Her ne kadar bu, idame i\u015fini biraz zorla\u015ft\u0131rm\u0131\u015f gibi g\u00f6r\u00fcnse de uzun vadede hem okunabilirlik hem de kullan\u0131m\u0131 kolayla\u015ft\u0131rd\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorum. Uygulama d\u0131\u015f\u0131ndaki b\u00fct\u00fcn kabiliyetleri, statik k\u00fct\u00fcphane olarak olu\u015fturdum. \u0130lk ba\u015fta VS2022 projesi olu\u015fturup onun \u00fczerinden gitsem de, sonradan art\u0131k tamamen CMake kullan\u0131m\u0131na d\u00f6nd\u00fcm (Vs2022&#8217;yi de ara ara g\u00fcncelleyece\u011fim).<\/p>\n<p>Kaynak kodlar, <strong>&#8220;code\/src&#8221;<\/strong> alt\u0131nda konu\u015fland\u0131r\u0131lm\u0131\u015f durumda. Di\u011fer konu\u015fland\u0131rmalar i\u00e7in <strong>&#8220;doc\/projectRepository.md&#8221;<\/strong> alt\u0131nda verilmi\u015f durumda.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fc parti k\u00fct\u00fcphaneler <strong>&#8220;code\/src\/ext&#8221;<\/strong> alt\u0131nda konu\u015flanm\u0131\u015f durumda. Bunlar a\u00e7\u0131k\u00e7as\u0131 daha \u00e7ok VS2022 i\u00e7in ayarlanm\u0131\u015f oldu\u011fu i\u00e7in tam anlam\u0131yla CMake kullan\u0131m\u0131na uygun de\u011fil ama \u00f6n\u00fcm\u00fczdeki yaz\u0131larda bunlar\u0131 da olmas\u0131 gerekti\u011fi hale getirece\u011fiz.<\/p>\n<p>Kodlama standard\u0131 olarak da Google C++ k\u0131lavuzunu temelde baz ald\u0131m, detaylar\u0131 <strong>&#8220;doc\/codingGuideline.md&#8221;<\/strong> alt\u0131nda \u00f6zetlemeye \u00e7al\u0131\u015ft\u0131m.<\/p>\n<p>C++ olarak, C++ 20 dahil en son \u00f6zellikleri kullanmay\u0131 planl\u0131yorum. Birim test \u015fu an \u00e7ok olmasa da, birim testleri de peyderpey ekleyece\u011fiz, ayr\u0131ca GitHub Actions&#8217;\u0131 da kullan\u0131ma almay\u0131 planl\u0131yorum.<\/p>\n<p>Son olarak, \u00e7e\u015fitli sebeplerle dahil etti\u011fim ya da yazd\u0131\u011f\u0131m\u0131 k\u00fc\u00e7\u00fck, b\u00fcy\u00fck yard\u0131mc\u0131 s\u0131n\u0131flar\u0131 da bu repo alt\u0131nda topluyor olaca\u011f\u0131m (zamanlama, aktif nesneler, thread, vb.).<\/p>\n<p>\u015eimdi biraz daha bile\u015fenlere e\u011filmeye ba\u015flayal\u0131m ve bu yaz\u0131m\u0131z\u0131n temelini olu\u015fturacak olan <strong>&#8220;Painter&#8221;<\/strong> k\u00fct\u00fcphanelerine bakal\u0131m.<\/p>\n<h2><span style=\"color: #0000ff;\"><strong>&#8220;Painter&#8221; Bile\u015feni<\/strong><\/span><\/h2>\n<p><strong>&#8220;Painter&#8221;<\/strong> kabiliyetinin temel \u00e7\u0131k\u0131\u015f noktas\u0131, 2B grafiksel \u00e7izimler i\u00e7in, basit ve h\u0131zl\u0131 bir \u015fekilde kullan\u0131ma uygun bir \u00e7er\u00e7eve sunmakt\u0131. Bunun i\u00e7in de uzun s\u00fcre kulland\u0131\u011f\u0131m Qt&#8217;de bulunan ve bu ama\u00e7la geli\u015ftirilmi\u015f olan QPainter s\u0131n\u0131f\u0131n\u0131 referans ald\u0131m.\u00a0 QPainter temelde, grafiksel kullan\u0131c\u0131 aray\u00fcz\u00fc uygulamalar\u0131n\u0131n ihtiyac\u0131 olan \u00e7izimleri, optimize ve platform ba\u011f\u0131ms\u0131z bir \u015fekilde \u00e7izilmesine olanak sa\u011flayan bir s\u0131n\u0131f. Olduk\u00e7a \u00e7e\u015fitli \u00e7izim kabiliyetleri sunuyor. Detaylar i\u00e7in <span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-6\/qpainter.html#details\">https:\/\/doc.qt.io\/qt-6\/qpainter.html#details<\/a><\/strong><\/span> adresine bir g\u00f6z atabilirsiniz.<\/p>\n<p>Peki uEngine4&#8217;te sunulan (ve sunulmas\u0131 planlanan) kabiliyetler neler:<\/p>\n<ul>\n<li>Temel geometrik nesnelerin \u00e7izilmesi,<\/li>\n<li>Doku\/resim \u00e7izimleri,<\/li>\n<li>Metin \u00e7izimleri,<\/li>\n<li>Temel transformasyonlar,<\/li>\n<li>B\u00fct\u00fcn bunlar\u0131n kullan\u0131lan platform ba\u011f\u0131ml\u0131 k\u0131s\u0131mlar\u0131ndan, kullan\u0131c\u0131 s\u0131n\u0131flar\u0131 soyutlamak.<\/li>\n<\/ul>\n<p>\u0130lk olarak SDL2 kullanarak bu s\u0131n\u0131f\u0131 geli\u015ftirdim (basic_engine\/painter). Bu s\u0131n\u0131f tamamen SDL2 ve ilgili 3. parti k\u00fct\u00fcphaneleri kullan\u0131yor ve temelde yukar\u0131da sayd\u0131\u011f\u0131m kabiliyetlerin tamam\u0131 sa\u011flanm\u0131\u015f durumda. Bu sebeple, \u00e7oklu platform temel uygulamalar i\u00e7in ihtiyac\u0131 b\u00fcy\u00fck miktarda g\u00f6recektir. Bununla birlikte, SDL2&#8217;den gelen bir tak\u0131m ufak tefek k\u0131s\u0131tlar\u0131 da ne yaz\u0131k ki b\u00fcnyesinde bar\u0131nd\u0131r\u0131yor (b\u00fct\u00fcn sahneye ili\u015fkin transformasyonlar\u0131n yap\u0131lamamas\u0131 (\u00d6r. d\u00f6nd\u00fcrme), \u00e7izgi stillerinin direk sunulmamas\u0131 (noktal\u0131, \u00e7izgili vb.).<\/p>\n<p>Bu sebeple, kollar\u0131 s\u0131vazlay\u0131p, bu s\u0131n\u0131f\u0131n bir de OpenGL kullanan halini de k\u00fct\u00fcphaneye ekledim (gl\/gl_painter). \u015eu an i\u00e7in halen 1.x&#8217;ten gelen bir tak\u0131m sabit pipeline (&#8220;fixed pipeline&#8221;) API&#8217;leri olsa da, daha modern OpenGL kullanan bir hale de ihtiya\u00e7 halinde d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir ama mevcut hali de bir \u00e7ok ihtiyac\u0131 g\u00f6rece\u011fini d\u00fc\u015f\u00fcn\u00fcyorum. Doku\/resim \u00e7izimi ve metin g\u00f6sterimlerine ili\u015fkin API&#8217;ler eksik, bunlara y\u00f6nelik \u00f6nceki \u00e7al\u0131\u015fmalar\u0131mda kulland\u0131\u011f\u0131m bitmap font ya da freefont kullan\u0131m\u0131na ili\u015fkin kabiliyetleri de dahil etmek i\u00e7in geli\u015ftirme \u00e7al\u0131\u015fmalar\u0131m devam ediyor. \u0130n\u015fallah, yak\u0131n zamanda, onlar\u0131 da ekliyor olaca\u011f\u0131m. \u015eimdi gelelim Painter&#8217;a ili\u015fkin temel kavramlara de\u011finmeye.<\/p>\n<h3><span style=\"color: #0000ff;\"><strong>Pen\/Brush<\/strong><\/span><\/h3>\n<p>Painter s\u0131n\u0131flar\u0131n\u0131 kullan\u0131rken en \u00e7ok ba\u015fvuraca\u011f\u0131m\u0131z ve \u00f6nemli olan iki kavram: kalem ve f\u0131r\u00e7a (&#8220;Pen,\u00a0 Brush&#8221;) kabiliyetleri. QPainter arac\u0131l\u0131\u011f\u0131 ile \u00e7izilen her bir \u015fekil, bu nesneler arac\u0131l\u0131\u011f\u0131 ile belirlenmekte.<\/p>\n<p>Painter&#8217;da ayn\u0131 anda aktif tek bir kalem ve f\u0131r\u00e7a stili bulunabilir. Ayarlanan son kalem ve f\u0131r\u00e7a, sonraki \u00e7izilen b\u00fct\u00fcn \u00e7izimleri etkiler. Kalem temel olarak \u00e7izilecek olan \u00e7izgisel unsurlar\u0131 etkilerken (\u00e7izgi, poligon&#8217;un d\u0131\u015f hatlar\u0131, metinler), f\u0131r\u00e7a ise daha \u00e7ok dolgusal unsurlar\u0131n \u00e7izimlerini etkiler (poligonun, dikd\u00f6rtgenin i\u00e7 dolgusu, vb.).<\/p>\n<p>Peki, ne tarz \u00e7izim \u00f6zelliklerini de\u011fi\u015ftirebiliyoruz? Hemen bakal\u0131m:<\/p>\n<p><strong><em>Kalem<\/em> <\/strong>i\u00e7in:<\/p>\n<ul>\n<li>Renk, geni\u015flik,<\/li>\n<li>&#8220;Stroke&#8221; rengi ve geni\u015fli\u011fi\n<ul>\n<li>&#8220;Stroke&#8221; \u00e7izginin arka plan\u0131nda bulunan ve s\u0131n\u0131rlar\u0131n\u0131 g\u00f6stermek i\u00e7in kullan\u0131lan bi\u00e7imleri tarifler,<\/li>\n<li>Bunun geni\u015fli\u011fini 2&#8217;den k\u00fc\u00e7\u00fck vermeniz halinde \u00e7izilmez.<\/li>\n<\/ul>\n<\/li>\n<li>\u00c7izgi ve &#8220;Stroke&#8221; stili\n<ul>\n<li>Bu kabiliyet \u015fimdilik sadece GL painter taraf\u0131ndan sunuluyor ve glLineStipple ile ger\u00e7ekleniyor,<\/li>\n<\/ul>\n<\/li>\n<li>Aktif kalemi ayarlamak i\u00e7in <em>AssignPen<\/em> ve mevcut kalemi almak i\u00e7in de <em>ActivePen<\/em> API&#8217;leri kullan\u0131labilir.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin a\u015fa\u011f\u0131da, sar\u0131 renk ve siyah &#8220;stroke&#8221; rengi ile \u00e7izilen bir \u00e7izgi verilmi\u015ftir. Tahmin edebilece\u011finiz \u00fczere, temelde yap\u0131lan asl\u0131nda iki kere \u00e7izim yapmak.<\/p>\n<p id=\"kyCpfIJ\"><img loading=\"lazy\" decoding=\"async\" width=\"276\" height=\"120\" class=\"alignnone size-full wp-image-2791 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cbbd093e6a.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cbbd093e6a.png 276w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cbbd093e6a-150x65.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cbbd093e6a-200x87.png 200w\" sizes=\"auto, (max-width: 276px) 100vw, 276px\" \/><\/p>\n<p><em><strong>F\u0131r\u00e7a<\/strong> <\/em>i\u00e7in:<\/p>\n<ul>\n<li>Renk,<\/li>\n<li>F\u0131r\u00e7a Stili,\n<ul>\n<li>Bu kabiliyet \u015fimdilik sadece GL Painter taraf\u0131ndan sunuluyor ve glPolygonStipple ile ger\u00e7ekleniyor,<\/li>\n<\/ul>\n<\/li>\n<li>Aktif f\u0131r\u00e7ay\u0131 ayarlamak i\u00e7in <em>AssignBrush<\/em> ve mevcut kalemi almak i\u00e7in de <em>ActiveBrush<\/em> API&#8217;leri kullan\u0131labilir.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin a\u015fa\u011f\u0131da, &#8220;stroke&#8221; ve dolgu ayarlar\u0131 ile \u00e7izdirilmi\u015f basit geometrileri g\u00f6rebilirsiniz:<\/p>\n<p id=\"BtQXuSA\"><img loading=\"lazy\" decoding=\"async\" width=\"493\" height=\"210\" class=\"alignnone size-full wp-image-2794 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cc0bef3ef6.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cc0bef3ef6.png 493w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cc0bef3ef6-300x128.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cc0bef3ef6-150x64.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cc0bef3ef6-400x170.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cc0bef3ef6-200x85.png 200w\" sizes=\"auto, (max-width: 493px) 100vw, 493px\" \/><\/p>\n<h3><span style=\"color: #0000ff;\"><strong>\u00c7izim Kabiliyetleri<\/strong><\/span><\/h3>\n<p>Kalem ve f\u0131r\u00e7a kavramlar\u0131na bakt\u0131ktan sonra, bu gen\u00e7leri kullanarak neler \u00e7izebiliriz ona bakal\u0131m. \u015eimdilik a\u011f\u0131rl\u0131\u011f\u0131 SDL Painter&#8217;a verece\u011fim.<\/p>\n<ul>\n<li>Nokta ile ba\u015flayal\u0131m. Bu ama\u00e7la <strong><em>DrawPoint(const Point2d&amp; point)<\/em><\/strong> API&#8217;sini kullanabilirsiniz (stil i\u00e7in kalem kullan\u0131r),<\/li>\n<li>\u00c7izgi \u00e7izimi i\u00e7in, <strong><em>DrawLine(const Point2d&amp; start, const Point2d&amp; end)<\/em> <\/strong>API&#8217;sini kullanabilirsiniz (stil i\u00e7in kalem kullan\u0131r),<\/li>\n<li>Dikd\u00f6rtgen \u00e7izimleri i\u00e7in;\n<ul>\n<li><strong><em>DrawRectangle(const SDL_Rect&amp; rect), <\/em><\/strong>bu API ile normal dikd\u00f6rtgenleri \u00e7izdirebilirsiniz (stil i\u00e7in hem kalem hem de f\u0131r\u00e7a kullan\u0131l\u0131yor),<\/li>\n<li><em><strong>DrawRRectangle(const SDL_Rect&amp; rect, int16_t radius)<\/strong>, <\/em>bu API ile yumu\u015fak k\u00f6\u015feli dikd\u00f6rtgenleri \u00e7izdirebilirsiniz (stil i\u00e7in hem kalem hem de f\u0131r\u00e7a kullan\u0131l\u0131yor). Yuvarlakl\u0131k, radius ile verilmekte,<\/li>\n<\/ul>\n<\/li>\n<li>Poligon \u00e7izimleri i\u00e7in;\n<ul>\n<li><strong><em>DrawPolygon(const Point2d* polygon, uint32_t vertexCount)<\/em><\/strong>, bu API ile poligonlar \u00e7izdirebilirsiniz (stil i\u00e7in hem kalem hem de f\u0131r\u00e7a kullan\u0131l\u0131yor),<\/li>\n<li><em><strong>DrawPolyline(const Point2d* polygon, uint32_t vertexCount)<\/strong>,<\/em> bu API ile i\u00e7leri bo\u015f olan poligon ya da \u00e7oklu \u00e7izgiler \u00e7izdirebilirsiniz (stil i\u00e7in kalem kullan\u0131r),<\/li>\n<\/ul>\n<\/li>\n<li>Elips\/\u00c7ember \u00e7izimleri i\u00e7in:\n<ul>\n<li><strong><em>DrawEllipse(const Point2d&amp; point, int16_t radiusX, int16_t radiusY)<\/em><\/strong>, bu API ile elips \u00e7izebilirsiniz (stil i\u00e7in hem kalem hem de f\u0131r\u00e7a kullan\u0131l\u0131yor),\n<ul>\n<li>\u00c7ember i\u00e7in x\/y eksenine ayn\u0131 de\u011ferleri girmeniz yeterli.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Resim \u00e7izimleri i\u00e7in:\n<ul>\n<li>\u015eu an bu ama\u00e7la olduk\u00e7a fazla API sunuluyor ama temelde iki grup API var: SDL_Texture kullanan ve Sprite nesnesi kullanan.\n<ul>\n<li><strong><em>DrawTexture(SDL_Texture* texture, &#8230;)<\/em><\/strong>, SDL_Texture* alan API&#8217;ler temelde, SDL2 taraf\u0131ndan sunulan, SDL_Texture nesnelerini \u00e7izdirmek i\u00e7in kullan\u0131labilir. API&#8217;ler resimleri d\u00f6nd\u00fcrmek i\u00e7in gerekli a\u00e7\u0131y\u0131, resim geni\u015flik ve y\u00fckseklik bilgilerini alan API&#8217;ler sunulmakta,<\/li>\n<li><strong><em>DrawSprite(const Sprite* sprite)<\/em><\/strong>, Sprite alan API&#8217;ler temelde, oyunlar i\u00e7in resimleri temsil etmek i\u00e7in tan\u0131mlanan &#8220;Sprite&#8221;&#8216;lar\u0131 \u00e7izdirmek i\u00e7in sundu\u011fum Sprite s\u0131n\u0131f\u0131n\u0131 kullanmakta. Burada detaylar\u0131na girmeyece\u011fim ama temelde bir \u00f6nceki t\u00fcre benzer \u00e7\u0131kt\u0131 sa\u011flasa da, bu s\u0131n\u0131f\u0131 kullananlar\u0131n i\u015fini kolayla\u015ft\u0131rmakta,<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Evet dostlar temel olarak elimizdeki \u00e7izim API&#8217;leri bunlar. Kodu inceledi\u011finizde, arka planda \u00f6zellikle geometrik \u00e7izimler i\u00e7in `gfx_primitives` k\u00fct\u00fcphanesinin kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz. Bu k\u00fct\u00fcphane zaman\u0131nda geli\u015ftirilen ve bildi\u011fim kadar\u0131yla art\u0131k idame edilmeyen bir k\u00fct\u00fcphane. \u0130lgili dosyalar\u0131, projeye direk dahil ettim, \u00e7\u00fcnk\u00fc bir tak\u0131m g\u00fcncelleme yapma ihtiyac\u0131 da do\u011fdu a\u00e7\u0131k\u00e7as\u0131.<\/p>\n<h3><strong><span style=\"color: #0000ff;\">Metin Kabiliyetleri<\/span><\/strong><\/h3>\n<p>\u015eimdi gelelim metin \u00e7izim kabiliyetlerine. OpenGL ile \u00e7al\u0131\u015fan takip\u00e7ilerim, metin\/font \u00e7izimleri i\u00e7in \u00e7ok farkl\u0131 y\u00f6ntemlerin oldu\u011funu bilecekler. Bu k\u00fct\u00fcphane i\u00e7in amac\u0131m asl\u0131nda temel metin g\u00f6sterimini kolay bir \u015fekilde sunmak. A\u00e7\u0131k konu\u015fmak gerekirse, SDL bu konuda OpenGL&#8217;e g\u00f6re daha fazla se\u00e7enek sunuyor gibi (tabi \u015fimdilik :). Metin \u00e7izdirmek i\u00e7in de hem &#8220;<strong>gfx_primitives<\/strong>&#8221; hem de <strong>SDL_FontCache<\/strong> k\u00fct\u00fcphanelerini kulland\u0131m. \u0130lgili basit font \u00e7izimleri\u00a0 i\u00e7in ikincisi ise biraz daha kabiliyetli metin \u00e7izimleri i\u00e7in.<\/p>\n<p>GL Painter s\u0131n\u0131f\u0131m\u0131z\u0131n da hen\u00fcz bir GL Font yetene\u011fi bulunmuyor ama bu yak\u0131n amanda de\u011fi\u015fecek in\u015fallah.<\/p>\n<p>Hadi mevcut API&#8217;lere bir g\u00f6z atal\u0131m. Resim \u00e7izimlerinde oldu\u011fu gibi metin \u00e7izimleri i\u00e7in de iki grup metin \u00e7izim API&#8217;si bulunmakta, bunlar\u0131 Basit ve \u0130leri seviye olarak ikiye grupland\u0131rabiliriz. Bunlar\u0131n temel farkl\u0131l\u0131klar\u0131, sundu\u011fu kabiliyetler:<\/p>\n<h4><span style=\"color: #0000ff;\"><strong>Basit Font \u00c7izimi<\/strong><\/span><\/h4>\n<ul>\n<li>Bu API&#8217;ler h\u0131zl\u0131ca metin \u00e7izdirmek i\u00e7in, .fnt uzant\u0131l\u0131 fontlar\u0131 kullan\u0131r. Bu fontlara etiket vererek at\u0131fta bulunuyoruz &#8220;fontLabel&#8221;,<\/li>\n<li>Metin \u00e7izdirmeden \u00f6nce en az bir fontu kaydetmeniz gerekiyor. Bu ama\u00e7la da <em>RegisterBasicFont<\/em> API&#8217;sini kullanabilirsiniz. A\u015fa\u011f\u0131da buna ili\u015fkin \u00f6rnek bir kod par\u00e7as\u0131 bulabilirsiniz. Bunu uygulaman\u0131n ba\u015f\u0131nda bir kere yapman\u0131z yeterli. Son iki parametre, karakter geni\u015flik ve y\u00fcksekli\u011fini ifade eder,<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">mPainter.RegisterBasicFont(\"Font_7_13_Bold\", \".\/7x13B.fnt\", 7, 13);\r\nmPainter.RegisterBasicFont(\"Font_10_20\", \".\/10x20.fnt\", 10, 20);<\/pre>\n<ul>\n<li>Uygulama i\u00e7erisinde, metin \u00e7izdirmeden \u00f6nce de, ilgili fontlar, font etiketleri verilerek <em>SetActiveBasicFont<\/em> ile Painter nesnesine atanmal\u0131d\u0131r,<\/li>\n<li>\u00c7izim i\u00e7in ise <em><strong>void BasicText(const Point2d&amp; upperLeft, std::string_view text)<\/strong>\u00a0<\/em>API&#8217;si kullan\u0131labilir. \u0130lk parametre, metin konumu (metnin sol \u00fcst k\u00f6\u015fesi), ikincisi ise de \u00e7izdirilecek olan metindir.<\/li>\n<li>A\u015fa\u011f\u0131da bu API&#8217;leri nas\u0131l kullanabilece\u011finize ili\u015fkin \u00f6rnek kullan\u0131mlar\u0131 bulabilirsiniz:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">mPainter.AssignPen(Pen{ Color::Black });\r\nmPainter.SetActiveBasicFont(\"Font_7_13_Bold\");\r\nmPainter.BasicText(screenCenter + Point2d{ -300, -240 }, \"[Basit] Merhaba Dunya_Siyah\");\r\n\r\nmPainter.SetActiveBasicFont(\"Font_10_20\");\r\nstd::string text{ \"Merhaba Dunya_Merkez\" };\r\nauto fontSizeInfo = mPainter.ActiveBasicFontSizeInfo(\"Font_10_20\");\r\nmPainter.BasicText(screenCenter - Point2d{ text.size() \/2 * fontSizeInfo.first, fontSizeInfo.second\/2 }, \"[Basit] Merhaba Dunya_Merkez\");\r\n\r\nmPainter.SetActiveBasicFont(\"Font_7_13_Bold\");\r\nmPainter.AssignPen(Pen{ Color::Red });\r\nmPainter.BasicText(screenCenter + Point2d{ +110, +220 }, \"[Basit] Merhaba Dunya_Kirmazi\");\r\n<\/pre>\n<h4><strong><span style=\"color: #0000ff;\">\u0130leri Font \u00c7izimi<\/span><\/strong><\/h4>\n<ul>\n<li>Bu API&#8217;ler daha can canl\u0131 metinler\u00a0 \u00e7izdirmek i\u00e7in, .ttf uzant\u0131l\u0131 fontlar\u0131 kullan\u0131r,<\/li>\n<li>Bir \u00f6nceki grup API&#8217;de oldu\u011fu gibi, fontun kaydedilmesi gerekir.\u00a0 Bunun i\u00e7in RegisterFont API&#8217;si kullan\u0131labilir. Buna ili\u015fkin \u00f6rnekleri a\u015fa\u011f\u0131da g\u00f6rebilirsiniz. Bir \u00f6nceki gruptan farkl\u0131 olarak burada, italik, bold gibi \u00f6zellikleri\/nitelikleri de verebildi\u011fimizi g\u00f6rebilirsiniz<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">\/\/ 10 olcekli, Bold ve Italik font kaydedelim\r\nmPainter.RegisterFont(\"FreeSans_Italic_10\", \"fonts\/FreeSans.ttf\", 10, Painter::FontStyle::Bold | Painter::FontStyle::Italic);\r\n\r\n\/\/ Ayn\u0131 fontun 20 olcekli, normal halini kaydedelim\r\nmPainter.RegisterFont(\"FreeSans_Normal_20\", \"fonts\/FreeSans.ttf\", 20);\r\n\r\n\/\/ Ayn\u0131 fontun 12 olcekli, Bold ve Italik halini kaydedelim\r\nmPainter.RegisterFont(\"FreeSans_ItalicBold_12\", \"fonts\/FreeSans.ttf\", 12, Painter::FontStyle::Bold | Painter::FontStyle::Italic);<\/pre>\n<ul>\n<li>Kullanmadan \u00f6nce\u00a0<em>SetActiveBasicFont<\/em> ile Painter nesnesine atanmal\u0131d\u0131r,<\/li>\n<li>\u00c7izim i\u00e7in ise iki farkl\u0131 API kullan\u0131labilir. Bunlardan ilki, atanan fonta g\u00f6re metni verilecek konumu referans alarak ve se\u00e7ilecek hizalamaya g\u00f6re \u00e7izer. \u0130kinci API&#8217;si bunlar\u0131n yan\u0131nda, metni bir s\u00fctuna s\u0131\u011fd\u0131rarak \u00e7izdirmenize olanak sa\u011flar ki bunun da bir\u00e7ok kullan\u0131m alan\u0131n\u0131 bulabilirsiniz:\n<ul>\n<li>template &lt;class &#8230; Args&gt;<br \/>\nvoid Text(const Point2d&amp; point, Alignment alignment, std::string_view formattedText, Args &#8230; args);<\/li>\n<li>template &lt;class &#8230; Args&gt;<br \/>\nvoid TextInColumn(const Point2d&amp; point, Alignment alignment, int32_t columnWidth, std::string_view formattedText, Args &#8230; args);<\/li>\n<\/ul>\n<\/li>\n<li>A\u015fa\u011f\u0131da bu API&#8217;leri nas\u0131l kullanabilece\u011finize ili\u015fkin \u00f6rnek kullan\u0131mlar\u0131 bulabilirsiniz:<\/li>\n<\/ul>\n<pre class=\"lang:c++ decode:true\">mPainter.SetActiveFont(\"FreeSans_ItalicBold_12\");\r\nmPainter.AssignPen(Pen{ Color::Magenta });\r\nmPainter.Text(screenCenter + Point2d{ 0, -200 }, Painter::Alignment::Center, \"[Ileri] Merhaba Dunya Bold Italic_Magenta Center %d\", 2022);\r\n\r\nmPainter.SetActiveFont(\"FreeSans_Italic_10\");\r\nmPainter.AssignPen(Pen{ Color::Black });\r\nmPainter.TextInColumn(screenCenter + Point2d{ -310, -180 }, Painter::Alignment::Left, 200, \"[Ileri] Uzun bir yaziyi diyelimki gormek istediniz artik bunu da basmaniz oldukca mumkun. Elbette coklu satir destegi de \\n\\n gordugunuz gibi mumkun ;) %d\", 2022);<\/pre>\n<p>Yukar\u0131daki \u00e7izim API&#8217;leri ile elde edece\u011finiz \u00e7\u0131kt\u0131lar a\u015fa\u011f\u0131daki gibi olacakt\u0131r:<\/p>\n<p id=\"BtTFzxC\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"302\" class=\"alignnone size-full wp-image-2801 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6.png 730w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6-300x124.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6-500x207.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6-150x62.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6-400x165.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7d90393e6-200x83.png 200w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/p>\n<h3><span style=\"color: #0000ff;\"><strong>\u00d6rnek Kullan\u0131m<\/strong><\/span><\/h3>\n<p>Evet dostlar, API&#8217;leri bir \u00e7o\u011funa bakt\u0131k. Bunlar\u0131 en iyi \u00f6\u011frenme \u015fekli elbette bunlar ile oynamak. Yukar\u0131daki \u00f6rnek kullan\u0131mlar\u0131 da i\u00e7eren &#8220;sdl_example&#8221; uygulamas\u0131n\u0131 muhakkak inceleyiniz (bu \u00f6rne\u011fe ili\u015fkin bir yaz\u0131 k\u0131sa da olsa yazmay\u0131 planl\u0131yorum). sdl_example i\u00e7erisinde motorun bir \u00e7ok kabiliyeti sunulmakta, bunlar aras\u0131nda ge\u00e7i\u015f i\u00e7in F11 ve F12 tu\u015flar\u0131n\u0131 kullanabilirsiniz. Painter kabiliyetlerini g\u00f6steren uygulaman\u0131n ekran g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn a\u015fa\u011f\u0131daki gibi olmas\u0131n\u0131 bekliyoruz:<\/p>\n<p id=\"tEWgAVB\"><img loading=\"lazy\" decoding=\"async\" width=\"820\" height=\"649\" class=\"alignnone size-full wp-image-2803 \" src=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2.png\" alt=\"\" srcset=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2.png 820w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-300x237.png 300w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-768x608.png 768w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-500x396.png 500w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-150x119.png 150w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-400x317.png 400w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-800x633.png 800w, https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647f7ef1906c2-200x158.png 200w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><\/p>\n<p>Evet sevgili dostlar, uEngine4&#8217;\u00fcn \u00f6nemli bir bile\u015fenini birlikte ke\u015ffettik. Bu k\u00fct\u00fcphaneyi kullanmadan bu tarz \u00e7izimleri yapmaya \u00e7al\u0131\u015farak asl\u0131nda nas\u0131l bir soyutlama sunuldu\u011funu daha net g\u00f6rebilirsiniz. Umar\u0131m sizler i\u00e7in faydal\u0131 olur, bir sonraki yaz\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle bol kodlu g\u00fcnler diliyorum.<\/p>\n<h2><strong><span style=\"color: #0000ff;\">Kaynaklar<\/span><\/strong><\/h2>\n<ul>\n<li><span style=\"color: #008000;\"><strong><a style=\"color: #008000;\" href=\"https:\/\/doc.qt.io\/qt-6\/qpainter.html#details\">https:\/\/doc.qt.io\/qt-6\/qpainter.html#details<\/a><\/strong><\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m, uzun s\u00fcredir devam eden C++ yaz\u0131lar\u0131m\u0131zla C++ 17 ile birlikte gelen bir\u00e7ok \u00f6zelli\u011fe bakarak birlikte ke\u015ffettik, bundan sonra da C++ 20 ile gelen \u00f6zelliklere bak\u0131yor olaca\u011f\u0131z. Bunun yan\u0131nda, bir s\u00fcre \u00f6nce de sizlere duyurusunu yapt\u0131\u011f\u0131m, hatta \u00f6rnek bir uygulamay\u0131 sizlerle payla\u015ft\u0131\u011f\u0131m uEngine4 de art\u0131k yumurtadan \u00e7\u0131kt\u0131. uEngine4 &#8211; Matrix, D\u00fc\u015fen Harf&#8230; <a class=\"more-link\" href=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\">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],"tags":[334,1096,1042,1041],"class_list":["post-2786","post","type-post","status-publish","format-standard","hentry","category-c","category-modern-c","tag-opengl","tag-painter","tag-sdl2","tag-uengine4"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v21.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>uEngine4 Ser\u00fcveni - Giri\u015f (Painter S\u0131n\u0131flar\u0131) - 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\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"uEngine4 Ser\u00fcveni - Giri\u015f (Painter S\u0131n\u0131flar\u0131) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"og:description\" content=\"Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m, uzun s\u00fcredir devam eden C++ yaz\u0131lar\u0131m\u0131zla C++ 17 ile birlikte gelen bir\u00e7ok \u00f6zelli\u011fe bakarak birlikte ke\u015ffettik, bundan sonra da C++ 20 ile gelen \u00f6zelliklere bak\u0131yor olaca\u011f\u0131z. Bunun yan\u0131nda, bir s\u00fcre \u00f6nce de sizlere duyurusunu yapt\u0131\u011f\u0131m, hatta \u00f6rnek bir uygulamay\u0131 sizlerle payla\u015ft\u0131\u011f\u0131m uEngine4 de art\u0131k yumurtadan \u00e7\u0131kt\u0131. uEngine4 &#8211; Matrix, D\u00fc\u015fen Harf... Continue reading &#8594;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\" \/>\n<meta property=\"og:site_name\" content=\"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-07T19:49:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-10T20:28:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cbbd093e6a.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=\"11 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\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\"},\"author\":{\"name\":\"yaz\u0131l\u0131mperver\",\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"headline\":\"uEngine4 Ser\u00fcveni &#8211; Giri\u015f (Painter S\u0131n\u0131flar\u0131)\",\"datePublished\":\"2023-06-07T19:49:28+00:00\",\"dateModified\":\"2023-09-10T20:28:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\"},\"wordCount\":2395,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb\"},\"keywords\":[\"OpenGL\",\"painter\",\"sdl2\",\"uengine4\"],\"articleSection\":[\"C++\",\"Modern C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\",\"url\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\",\"name\":\"uEngine4 Ser\u00fcveni - Giri\u015f (Painter S\u0131n\u0131flar\u0131) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/www.yazilimperver.com\/#website\"},\"datePublished\":\"2023-06-07T19:49:28+00:00\",\"dateModified\":\"2023-09-10T20:28:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Ana sayfa\",\"item\":\"https:\/\/www.yazilimperver.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"uEngine4 Ser\u00fcveni &#8211; Giri\u015f (Painter S\u0131n\u0131flar\u0131)\"}]},{\"@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":"uEngine4 Ser\u00fcveni - Giri\u015f (Painter S\u0131n\u0131flar\u0131) - 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\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/","og_locale":"tr_TR","og_type":"article","og_title":"uEngine4 Ser\u00fcveni - Giri\u015f (Painter S\u0131n\u0131flar\u0131) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","og_description":"Merhaba sevgili yaz\u0131l\u0131mperver dostlar\u0131m, uzun s\u00fcredir devam eden C++ yaz\u0131lar\u0131m\u0131zla C++ 17 ile birlikte gelen bir\u00e7ok \u00f6zelli\u011fe bakarak birlikte ke\u015ffettik, bundan sonra da C++ 20 ile gelen \u00f6zelliklere bak\u0131yor olaca\u011f\u0131z. Bunun yan\u0131nda, bir s\u00fcre \u00f6nce de sizlere duyurusunu yapt\u0131\u011f\u0131m, hatta \u00f6rnek bir uygulamay\u0131 sizlerle payla\u015ft\u0131\u011f\u0131m uEngine4 de art\u0131k yumurtadan \u00e7\u0131kt\u0131. uEngine4 &#8211; Matrix, D\u00fc\u015fen Harf... Continue reading &#8594;","og_url":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/","og_site_name":"Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","article_published_time":"2023-06-07T19:49:28+00:00","article_modified_time":"2023-09-10T20:28:56+00:00","og_image":[{"url":"https:\/\/www.yazilimperver.com\/wp-content\/uploads\/2023\/06\/img_647cbbd093e6a.png"}],"author":"yaz\u0131l\u0131mperver","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"yaz\u0131l\u0131mperver","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#article","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/"},"author":{"name":"yaz\u0131l\u0131mperver","@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"headline":"uEngine4 Ser\u00fcveni &#8211; Giri\u015f (Painter S\u0131n\u0131flar\u0131)","datePublished":"2023-06-07T19:49:28+00:00","dateModified":"2023-09-10T20:28:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/"},"wordCount":2395,"commentCount":1,"publisher":{"@id":"https:\/\/www.yazilimperver.com\/#\/schema\/person\/6497f6de4df6ba469748b861a2b3fcdb"},"keywords":["OpenGL","painter","sdl2","uengine4"],"articleSection":["C++","Modern C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/","url":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/","name":"uEngine4 Ser\u00fcveni - Giri\u015f (Painter S\u0131n\u0131flar\u0131) - Yaz\u0131l\u0131mperver&#039;in D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/www.yazilimperver.com\/#website"},"datePublished":"2023-06-07T19:49:28+00:00","dateModified":"2023-09-10T20:28:56+00:00","breadcrumb":{"@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yazilimperver.com\/index.php\/2023\/06\/07\/uengine4-seruveni-giris-painter-siniflari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Ana sayfa","item":"https:\/\/www.yazilimperver.com\/"},{"@type":"ListItem","position":2,"name":"uEngine4 Ser\u00fcveni &#8211; Giri\u015f (Painter S\u0131n\u0131flar\u0131)"}]},{"@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\/2786","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=2786"}],"version-history":[{"count":14,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2786\/revisions"}],"predecessor-version":[{"id":2807,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/posts\/2786\/revisions\/2807"}],"wp:attachment":[{"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/media?parent=2786"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/categories?post=2786"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yazilimperver.com\/index.php\/wp-json\/wp\/v2\/tags?post=2786"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}