Color Transform - by Furkan Karabudak - Game Maker Turkiye

Color Transform   by Furkan Karabudak  -  GMS1 & GMS2

Daha bu sabah sıcak sıcak yazdığım bu scripti kullanarak sağ taraftaki resimde gördüğünüz yumuşak ren geçişi animasyonunu çok basit bir kod ile yapabilirsiniz. :) Bu script iki renk arasında animasyonlu bir şekilde yumuşak bir geçiş yapabilmenizi sağlar. Animasyonun hızını istediğiniz gibi ayarlayabilirsiniz. Ayrıca renk olarak da sadece gamemaker'ın built-in renkleri olan c_red , c_green vs. gibi renklerle sınırlı değilsiniz. Bu script RGB renk sistemine göre renkleri kullanır ve sizin de parametreleri bu cinsten girmeniz gerekir.

 


Kullanımı

Renk geçişi animasyonundan etkilenmesini istediğiniz objeye aşağıdaki gibi bir kullanım ile kodları yazmanız yeterli.

Create Event :

Bu kodu o objenin Create Eventine eklemeniz gerekiyor çünkü bu kod scriptin kurulumunu yapıyor gibi düşünün :p

color_transform_init(-size-, -init_value-);

parametre 1 -size-  : buraya istediğiniz tam sayıyı girebilirsiniz. Aynı objeye etkiyen kaç defa renk animasyonu geçişi efekti kullanacaksanız ya da kaç tane kullanma ihtimaliniz varsa o sayıyı yazın. Yani yok ben 1 defa kullanacam diyip illa 1 yazmak zorunda değilsiniz 5 de yazabilirsiniz. Bunu o obje için tutulan hafıza gibi düşünün. Kaç yazarsanız, aynı obje içerisinde bu efekti en fazla o kadar kullanabilirsiniz. Ancak sakın "yok yedekte dursun ilerde lazım olur kullanırım ben 100 yapayım" falan gibi bir saçmalığa kalkışmayın. Çünkü buraya yazdığınız değer ne kadar büyürse RAM'den ayırdığınız bellek de o kadar fazla olur dolayısıyla performans düşüşüne neden olur. Benim size tavsiyem 16'nın altında özgürsünüz ama 16'nın üstüne mecbur kalmadıkça çıkmayın :)

parametre 2 -init_value- : buraya yazacağınız değeri çok kurcalamanıza gerek yok. Sizi çok ilgilendiren bir mevzu değil yani. Size tavsiyem burayı her zaman noone olarak yazıp geçin. Yine de açıklama isteyen arkadaşlar için, bu hafıza için oluşturulan array'lerin başlangıç değeri. Script bu değeri kontrol ederek o hafızaya bir animasyon kaydedilmiş mi yoksa kaydedilmemiş mi ona göre biliyor.

Tavsiye Örnek Kullanım :

color_transform_init(8, noone);


Step Event:

Burada aşağıdaki gibi bir kullanım yapmanızı öneririm.

if color_transform_working(-action_id-)
{
    image_blend = color_transform(-r1-, -g1-, -b1-, -r2-, -g2-, -b2-, -time-, -action_id-);
}

 Step event'ta yukarıdaki kalıbı kullanarak bir kullanım yapınız. Bu yalnızca örnek bir kullanımdır. illa image_blend fonksiyonu ile kullanılmak zorunda değildir. Çünkü bu script fonksiyonu renk animasyonundaki anlık renk bilgisini tutar. Dolayısıyla siz onu istediğiniz değere eşitleyebilirsiniz. Bu yalnızca renk bilgisidir. Örneğin aşağıdaki gibi bir örnek ile Draw Event'ta da kullanılabilir.

if color_transform_working(-action_id-)
{
    draw_set_color(color_transform(-r1-, -g1-, -b1-, -r2-, -g2-, -b2-, -time-, -action_id-));

    draw_text(100,100,"Bu yazı renk değiştiriyor. Vuhuuu !");
}

Şimdi biraz daha burada kullandığımız iki script fonksiyonunu açıklamaya başlayalım. Renk değiştirme animasyonu işlemini her zaman yukarıdaki gibi bir if bloğu içerisinde ve yukarıdaki kullanım gibi kullanınız. Eğer bu animasyonu if bloğu içerisinde kullanmadan yaptırırsanız hatalı sonuçlar alabilirsiniz. Çünkü o if şartında kullandığımız fonksiyon animasyonun şu anda devam edip etmediğini kontrol etmek için. Yani birinci renkten ikinci renge doğru bir animasyon oluyor ya, işte ikinci renge tamamen ulaştığımızda animasyonun durması için bu şekilde kullanıyoruz. Yani ikinci renge ulaşıp animasyon tamamlandığında bu if bloğu içerisine yazacağınız kodlar artık çalışmayacaktır.

Bu if şartında kullandığımız fonksiyonun syntax'i ve kullanımı ise şu şekilde:

color_transform_working(-action_id-)

 Bu fonksiyon, belirlediğiniz animasyon işleminin devam etmiş ya da tamamlanmış olup olmadığını kontrol eder. Eğer animasyon şu anda devam ediyorsa true, animasyon tamamlanmış ise false döndürür.

Parametre 1 -action_id- : Buraya daha önceden belirlediğimiz hafıza sınırından istediğimiz bir hafıza numarasını yazıyoruz. Yazdığınız numaranın aynı obje içerisinde daha önce kullanılmamış olmasına dikkat edin. Her numarada yalnızca bir animasyon bilgisi saklanabilir. O obje içerisindeki ilk animasyonunuzu yapıyorsanız ilk değer olarak "0" numaradan başlayın. Buraya hangi hafıza numarasını yazarsanız, o hafızaya karşılık gelen animasyonun devam edip etmediğini kontrol eder.

 

Az önceki kalıpta kullandığımız ikinci fonksiyonun syntax ve kullanımı ise şu şekilde:

color_transform(-r1-, -g1-, -b1-, -r2-, -g2-, -b2-, -time-, -action_id-);

Bunu parametre 1,2 falan diye alt alta yazarsam çok uzar. Zaten çok kolay. r1, g1 ve b1 olan yerlere birinci başlangıç renginin RGB değerlerini yazacaksınız. r2, g2 ve b2 olan yerlere ise ikinci bitiş renginin RGB değerlerini yazacaksınız. -time- kısmına ise animasyonun süresini step / frame cinsinden yazacaksınız. Yani oyununuz varsayılan olarak 60 FPS de çalışıyorsa, animasyonun 1 saniye sürmesi için 60, 2 saniye sürmesi için 120 gibi değerler yazmalısınız.

(Oyununuzun varsayılan FPS limitini öğrenmek ya da değiştirmek için GMS 1'de oda ayarlarındaki Room Speed bölümüne, GMS 2'de ise Options sekmesindeki Main kısmına gelerek "Game frames per second" kısmına bakabilir ya da tercihinize göre değiştirebilirsiniz.)

Son parametremiz olan -action_id- kısmına ise, daha önce de açıkladığım gibi hafızada kullanmak istediğiniz animasyon yerinin numarasını yazmalısınız. Bu fonsiyonda kullandığınız -action_id- parametresi ile, ilgili if şartında kullandığınız -action_id- parametresi aynı olmalıdır.

Tavsiye örnek kullanım:

if color_transform_working(0)
{
    image_blend = color_transform(25500, 255, 0, 255, 180, 0);
}

Yukarıdaki örnekteki kod, 0. hafızada tutulan animasyonun devam edip etmediğini kontrol eder. Eğer devam ediyorsa bloğun içine girer ve objenin rengini color_transform fonskiyonundan gelen anlık renk bilgisine göre boyar. Bu örnekte oluşturulan animasyona göre, animasyon kırmızı renginden başlayıp fuşya rengine doğru 3 saniye içerisinde yumuşak bir renk geçişi yapacaktır.


Opsiyonel:

Bunların dışında opsiyonel olarak isteğe bağlı kullanabileceğiniz bir tane daha ekstra fonksiyon mevcut. Bu fonksiyonu bir defa çağırmanız yeterli, kısacası istediğiniz tüm Event'larda kullanabilirsiniz.

color_transform_reset_all();

Bu fonksiyon geçerli obje için, daha önceden oluşturduğunuz tüm hafızaları ve içerisindeki animasyon kayıtlarını temizler. Yani daha önceden "0" numaralı hafızayı kullandıysanız ve onunla işiniz tamamen bittiyse, ikinci bir animasyon yapmak için "1" numaralı yeni bir hafıza açarak RAM'de daha fazla alan işgal etmek yerine, geçerli obje için tüm animasyon verilerini ve hafızaları sıfırladıktan sonra ikinci animasyonunuzu tekrar "0" numaralı hafıza alanına açabilirsiniz.




Script Kaynak Kodları

Aşağıdaki başlıkların isminde scriptler oluşturarak içlerine belirtilen kodları yapıştırın.

color_transform_init

/// @description color_transform_init(size,init_value)
/// @param size
/// @param init_value

var size = argument[0];
var ival = argument[1];

ct_r1 = array_create(size,ival);
ct_g1 = array_create(size,ival);
ct_b1 = array_create(size,ival);

ct_r2 = array_create(size,ival);
ct_g2 = array_create(size,ival);
ct_b2 = array_create(size,ival);

ct_time = array_create(size,1);

ct_init_value = ival;


color_transform

/// @description color_transform(r1,g1,b1,r2,g2,b2,time,action_id)
/// @param r1
/// @param g1
/// @param b1
/// @param r2
/// @param g2
/// @param b2
/// @param time
/// @param action_id

var aid = argument[7];

if ct_r1[aid] == ct_init_value
{
    ct_r1[aid] = argument[0];  ct_g1[aid] = argument[1];  ct_b1[aid] = argument[2];
    
ct_r2[aid] = argument[3];  ct_g2[aid] = argument[4];  ct_b2[aid] = argument[5];
    
ct_time[aid] = argument[6];
}
    
if ct_time[aid] > 0
{
    ct_r1[aid] += (ct_r2[aid] - ct_r1[aid])/ct_time[aid];
    
ct_g1[aid] += (ct_g2[aid] - ct_g1[aid])/ct_time[aid];
    
ct_b1[aid] += (ct_b2[aid] - ct_b1[aid])/ct_time[aid];
    
    
ct_time[aid] -= 1;
    
    
return make_color_rgb(ct_r1[aid],ct_g1[aid],ct_b1[aid]);

}
 


color_transform_working

///@desciption color_transform_working(action_id)
/// @param action_id

var acid = argument[0];

    
if ct_time[acid] > 0
    return true;


color_transform_reset_all

///@description color_transform_reset_all()
for (var a = array_length_1d(ct_r1) - 1; a > -1; a--)
{
    ct_r1[a] = ct_init_value;
}
for (var b = array_length_1d(ct_g1) - 1; b > -1; b--)
{
    ct_g1[b] = ct_init_value;
}
for (var c = array_length_1d(ct_b1) - 1; c > -1; c--)
{
    ct_b1[c] = ct_init_value;
}


for (var d = array_length_1d(ct_r2) - 1; d > -1; d--)
{
    ct_r2[d] = ct_init_value;
}
for (var e = array_length_1d(ct_g2) - 1; e > -1; e--)
{
    ct_g2[e] = ct_init_value;
}
for (var f = array_length_1d(ct_b2) - 1; f > -1; f--)
{
    ct_b2[f] = ct_init_value;
}


for (var g = array_length_1d(ct_time) - 1; g > -1; g--)
{
    ct_time[g] = 1;
}


Eğer tüm anlatılanları doğru bir şekilde uyguladığınızdan eminseniz, bu scriptin doğru çalışması gerekir. Herhangi bir problem yaşarsanız, soru sormak isterseniz, hata bildirmek, ya da öneride bulunmak isterseniz, buraya tıklayarak discord sunucumuza katıldıktan sonra beni etiketleyebilirsiniz "@Furkan Karabudak"


Script'i Programlayan : Furkan Karabudak

Script Kılavuz : Furkan Karabudak

Benzer İçerikler :