Tüm Ekran Boyutlarına Uyumlu View Nasıl Yapılır ? - Game Maker Turkiye

Tüm Ekran Boyutlarına Uyumlu View Nasıl Yapılır ?

Script tamamen bana ait değildir. Bu konu çok sık yardım istenen bir konu olduğu için hem extension linkini, hem kendi yazdığım scripti, hem de anlatımı burada paylaşayım dedim :)


1. Aşama

Öncelikle bu adresteki Extension'u indirmeniz gerekiyor.

a- Eğer GMS 2 kullanıyorsanız,

direk yukarıdaki menüden Marketplace i açıp Open Marketplace'e tıklamanız gerekiyor. Marketplace web sayfası açılınca arama kutusuna "Display Scaler" yazın ve "Edge Engine - Display Scaler" isimli extension'u bulun. Extension'u indirin ve ardından yine Marketplace e tıklayıp My Library kısmını açmalısınız. Orada daha önceden hesabınıza eklediğiniz extensionlar listelenecektir. Extensiona gelip indirin, indirme işlemi bitince de import edin. Bunların hepsi zaten extension'un yanındaki 3-4 tane küçük butondan yapılıyor, mouse üstüne getirince açıklamaları yazıyor zaten. Sonra size neleri import etmek istediğiniz soracak, tüm Scripts klasörünü seçin, bir de Objects'den obj_scaler isimli objeyi. Gerisini import etmeye gerek yok. Şimdilik yapmanız gereken işlemler OK. İkinci Aşamaya Geçin.

b- Eğer GMS 1 kullanıyorsanız,

Orijinal GameMaker'a sahip iseniz GMS 1 içerisinden de benzer bir şekilde Marketplace açılabilmektedir. "Edge Engine - Display Scaler" isimli extension'u indirip projeye import etmelisiniz.

Eğer Crack kullanıyorsanız, extension'u bu şekilde projenize import edemezsiniz. Yukarıdaki adresten Extension dosyasını indirmelisiniz. Daha sonra dosyayı direk GameMaker penceresi içerisine projeniz açık iken sürükleyin. İşe yaramazsa extensions kısmından "import extension" diyerek açılan gözat penceresinden extension dosyasını açabilirsiniz. Yalnızca obj_scaler objesini ve Scriptlerin tamamını import edin, gerisine gerek yok.


2. Aşama

Eğer extension'u sorunsuz bir şekilde kurduysanız, benim yazdığım işi pratikleştiren şu scriptleri projenize ekleyin.

vie_x

/// @descripton vie_x()
var xx = __view_get( e__VW.XView, global.display_view );
return xx;

vie_y

/// @descripton vie_y()
var yy = __view_get( e__VW.YView, global.display_view );
return yy;

vie_w

/// @descripton vie_w()
var width = __view_get( e__VW.WView, global.display_view );
return width;

vie_h

 /// @descripton vie_h()
var height = __view_get( e__VW.HView, global.display_view );
return height;

!!! Eğer GMS 1 kullanıyorsanız ve scriptler hata veriyorsa, scriptler içerisindeki __view_get gibi başında çift alt tire bulunduranların alt tirelerini silerek deneyin.


3. Aşama

Şimdi ise Room'a gidin. Room Settings kısmından önce Enable Viewports işaretleyip sonra View0 / Viewport0 'ı aktifleştirmelisiniz. Aslında View ayarlarında girmeniz gereken değerler çok da önemli değil. Yine de Width ve Height kısımlarını oyununuzun desteklemesini istediğiniz maksimum çözünürlük şeklinde doldurun. Şimdi dersiniz ki "E o zaman ben 3840 x 2160 yapayım da 4K ya kadar desteklesin" Gerekmediği sürece Full HD de kalmak her zaman mantıklı, özellikle de mobil oyunlar için. Çünkü maks çözünürlüğü artırırsanız hem performans düşüşüne sebep olabilir, hem de oyunda kullanacağınız bütün görüntüleri büyütmeniz gerekir. Mesela "bu yazı" 1920 x 1080 de aynen böyle görünebilirken, 3840 x 2160 da ise "bu yazı" şeklinde görünebilir. Dolayısıyla oyununuzdaki her görüntüyü büyütmeniz gerekir, ekran 4K olmasa bile. Büyütürseniz de bu hem texture page'in daha hızlı dolacağı, hem de oyun boyutunun lüzumsuz yere artacağı anlamına gelir.

Viewport kısmını halletiysek, şimdi de obj_scaler isimli objeyi odaya yerleştirin. Ancak obj_scaler'ın, odadaki diğer bütün objelerden daha önce oluşturulduğundan emin olun. Yoksa ileride bu hatalara sebep olabilir. Bu nedenle ya bu objeyi diğer bütün objelerden önce odaya yerleştirin, ya da Instance Creation Order kısmından obj_scaler'ı listenin en üstüne taşıyın.


4. Aşama

Şimdi obj_scaler objesinin Step eventine girin. Şunun gibi bir kod görmeniz gerek.

edgeds_set_scale(false, 0, 480, 480, 1);

 Sayılara ve parametrelere takılmayın, sizde farklı olabilir. İlk iki parametre aynı yukarıdaki gibi kalsın, bizi şimdilik ilgilendiren sonraki parametreler.

3 ve 4. parametreler : Minimum çözünürlük için genişlik ve yükseklik. Bu oyununuzun izin verdiği minimum çözünürlüktür. Eğer Game Options tan Allow Window Resize 'ı aktif ederseniz, oyun penceresini kenarlarından tutarak yeniden boyutlandırabilirsiniz. Ve boyutlandırırken asla yukarıda verdiğiniz minimum çözünürlükten daha küçük bir pencere olmayacaktır, en fazla o kadar küçültülebilecektir. 

5. parametre : Zoom miktarı. Eğer "0" ayarlanırsa pencere boyutu değiştirildiğinde ya da farklı boyutlara sahip ekranlara geçildiğinde oyun içeriğindeki görüntüler de otomatik olarak büyür ya da küçülür. Pencereyi küçültürken, küçülme miktarıyla orantılı olarak oyun içeriği de küçülür. Farklı çözünürlüklere sahip ekranlarda ise, en:boy oranı korunduğu sürece oyun içeriğinin tüm ekranlarda aynı görünmesini sağlar. Bu şekilde kullanmak genelde daha çok işe yarıyor. 

Eğer "1" ayarlanırsa, oyun içeriğindeki görüntüler her koşulda aynı boyutta kalır, dolayısıyla pencereyi küçültünce içerik küçülmez, ve pencereyi fazla küçültürseniz, oyun içeriği hala ilk hali kadar büyük kalacağı için bir müddet sonra ekrana sığmamaya başlayacaktır. Farklı ekran boyutlarında ise görüntüler farklı görünür. Küçük çözünürlüğe sahip ekranlarda içerik büyük görünürken, büyük çözünürlüğe sahip ekranlarda ise içerik küçük görünür.

Bu kısımdaki ayarlamaları yaptığım açıklamalara göre kendinizce ayarlayın. Daha sonra Step Eventtaki bu kodu kopyalayın ve Step Event'tan silin. Çünkü bu kodun step eventta durması çok ciddi bir performans düşüşüne sebep oluyor. Create Event'a bir alarm oluşturun, şunu yazın :  alarm[0] = 15   Sayı olarak 15 yerine istediğiniz değeri yazabilirsiniz. Ancak sayıyı ne kadar küçük tutarsanız performans o kadar düşecektir. Sayıyı ne kadar büyük tutarsanız da oyunun içeriği, ekran boyutuna o kadar geç adapte olacaktır. Arada bir denge kuracak şekilde ayarlama yapmaya çalışın. Eğer oyun default FPS değeriniz 60 olarak ayarlı ise, 15 olduğunda ekran her çeyrek saniyede bir güncellenecek demektir.

Daha sonra Alarm 0 Eventi açın ve içerisine daha önce kopyaladığınız kodu yapıştırın. Sonra tekrar 

 alarm[0] = 15  yazın. Bu sayede performans konusunda baya bir kazanç sağlayacağız. Çünkü önceden kod Step Event'taydı ve her karede oyun tekrar tekrar ekran çözünürlüğünü algılayıp içeriğini ona göre adapte etmeye çalışıyordu. Şimdi ise her çeyrek saniyede bir kez bu işlemi yapıyor ve çok daha iyi bir performans demek bu.

Bütün bunları yaptıktan sonra projeyi test edebilirsiniz. Artık tam da istediğiniz gibi, ekran boyutu ya da pencere boyutunu değiştirseniz bile, oyun içeriği otomatik adapte olacaktır.

Ancak henüz her şey bitmedi.


5. Aşama

Her şey bitmediyse sırada ne var ? Peki diyelim ki ekranın tam ortasında bir obje oluşturmak istiyorsunuz. Pekala yapın bunu. Ama pencere boyutunu değiştirdiğinizde objenin, ekranın güncellenmiş görüntüsündeki yeni tam ortaya gelmediğini göreceksiniz. Objenin her durumda tam ortada kalmasını istiyorsanız, bu aşamada öğrenecekleriniz tam size göre. Yalnızca tam ortası değil, diyelim ki ekranın sağında olmasını istediğiniz bir obje var, mesela windows'taki bir pencereyi kapatmak için sağ üst köşede bulunan çarpı simgesi gibi. Eğer siz pencereyi sola doğru küçültürseniz, bu çarpı simgesinin de aynı oranda sola kayması gerekir ki, hala sağ üst köşede kalabilsin. İşte bunları şimdi öğreneceğiniz aşama sayesinde yapabilirsiniz. Şimdi benim işleri pratikleştirmek için yazdığım scriptleri kullanma zamanı.

vie_x() : ekranın sol kenar başlangıcının x eksenindeki pozisyonu, (room değil, view'in sol kenarı) Yani view bir objeyi takip eder de yer değiştirirse, ekranın sol kenarının x ini elde etmek için bunu kullanın.

vie_y():ekranın / view'in üst kenarının y eksenindeki değeri.

vie_w() : view'in anlık sanal genişlik değeri. Ekranın sol kenarından sağ kenarına kadar olan mesafe. !! BUNU EKRAN BOYUTUNU ELDE ETMEK İÇİN KULLANMAYIN !! dediğim gibi sanal genişlik değeri. Extension'un işlem yaptığı sanal genişlik. Bunu yalnızca bir objeyi ekran üzerinde bir yere yerleştirirken pozisyonu elde etmek için kullanın.

vie_h() : view'in anlık sanal yükseklik değeri. Ekranın üst kenarından alt kenarına kadar olan mesafe. 

 

Örnek Kullanımlar :

Objenin sürekli ekran üzerinde 64,64 pozisyonunda kalması için :

x = vie_x() + 64y = vie_y + 64;

Objenin sürekli ekranın tam ortasında kalması için :

x = vie_x() + vie_w()/2y = vie_y() + vie_h()/2;

Objenin sağdan -128, aşağıdan -256 pozisyonunda kalması için

x = vie_x() + vie_w() - 128y = vie_y() + vie_h() - 256;

 


6. (Opsiyonel) Aşama  - Daha ileri düzey -

 Bu aşama isteğe bağlıdır. Eğer oyununuzda zoom yapabilen bir kameraya sahip iseniz, yani kamera 3 boyutlu dünyada 2 boyutlu oyun düzlemine yakınlaşıp uzaklaşabiliyorsa, ekranın farklı pozisyonlarını elde etmek için yukarıdakiler yerine bu scriptleri kullanmalısınız.

cvie_x

/// @descripton cvie_x(camera, zoom)
/// @param camera
/// @param zoom

var cam = argument[0];
var zm = argument[1];

var ret = cam.x - (vie_w()/2)*zm;

return ret;

cvie_y

/// @descripton cvie_y(camera, zoom)
/// @param camera
/// @param zoom

var cam = argument[0];
var zm = argument[1];

var ret = cam.y - (vie_h()/2)*zm;

return ret;

cvie_w

/// @descripton cvie_w(camera, zoom)
/// @param camera
/// @param zoom

var cam = argument[0];
var zm = argument[1];

var width = __view_get( e__VW.WView, global.display_view );

var ret = cam.x + (width/2)*zm;

return ret;

 cvie_h

/// @descripton cvie_h(camera, zoom)
/// @param camera
/// @param zoom

var cam = argument[0];
var zm = argument[1];

var height = __view_get( e__VW.HView, global.display_view );

var ret = cam.y + (height/2)*zm;

return ret;

 cvie olanlar ile vie olanların kullanımı aynı. 5. Aşamadaki örnek kullanımlar gibi kullanabilirsiniz bunları da. Tek farkı iki adet parametre istemeleri.

1. Parametre : Camera. Kamerayı bir variable'a kaydetmeniz ve buraya o variable'ı girmeniz gerekiyor.

2. Parametre : Zoom. Kameranın 3 boyutlu dünyada oyun düzlemine yakınlığını kontrol ederken z ekseni değerini bir zoom çarpanı ile çarpmanız gerekiyor. Buraya o çarpan değerini girmeniz gerekiyor.


Kullandığınız ya da incelediğiniz için teşekkürler. Herhangi bir problem yaşarsanız ya da sorunuz olduğunda, Buraya Tıklayarak Discord sunucumuza katılabilir, sorunuzu iletebilir, beni etiketleyebilirsiniz.

@Furkan Karabudak


 - F u r k a n    K a r a b u d a k 

Benzer İçerikler :