Portal Efekti Yapımı

Portal efekti yapımı kapsamında animasyonlu dokulardan hazırlanan animasyonlu dokuyu oyun içerisinde işler hale getirmekten bahsedeceğim.


İndir “Portal Effect” Portal_UPBGE.rar – 35 defa indirildi – 21 MB


Animasyonlu doku nedir ?

Oyunlar için efekt yapımında parçacık sistemlerinden faydalanıldığını önceki yazımda açıklamaya çalışmıştım. Hatta UPBGE oyun motoru için hazırladığım parçacık sistemini de meraklısı için paylaşmıştım. Şimdi efekt yapımı konusunda farklı bir yöntemden bahsedeceğim. Animasyonlu dokular…

Animasyonlu dokular, render edilmiş animasyon karelerinin belli bir sıralama ile art arda dizilmesi ile oluşturulan dokulardır. Oyun içerisinde dokunun atandığı objenin kaplama koordinatları bu sıraya göre değiştirilerek hazırlanan efektin oyunda oynatılması sağlanır. Bu yöntem ile birkaç saniyelik efektler -oyunda hiçbir kasmaya mahal vermeden- oyun içerisinde kullanılabilir.

Animasyonlu dokular ile neler yapılabilir ?

Aslında animasyonlu dokuların kullanım alanları çok çeşitlidir. Özellikle rol yapma oyunlarında neredeyse bütün efektler için bu yöntemden yararlanılabilir. Birkaç örnek vermek gerekirse… Rol yapma oyunlarında karakterlerin özel yetenekleri, level up efektleri, oyun içerisinde diğer objeler için efektler (mesela benim videomda paylaştığım efekt bir ışınlanma bölgesinde kullanılabilir.) vs. Diğer tip oyunlar için konuşursak fps tarzı oyunlarda namludan çıkan ateş efektleri, düşman karakterlerin kanama efektlerini örnek verebiliriz. Bunlardan başka denizlerdeki dalga efektleri, yarış oyunlarında egzozdan çıkan duman veya ışıklı uyarı levhaları da animasyonlu doku yöntemiyle yapılabilir.

UPBGE içinde animasyonlu doku kullanımı

Aslında adından da anlaşılacağı gibi animasyonlu dokular animasyon olarak oynatılırlar. Yani her bir kare için ilgili objenin kaplama koordinatını biraz değiştirip bir keyframe atarsınız sonra bu kayframelerden oluşan animasyonu oynatmak için bir komut yazarsınız. Böylelikle ilgili şart gerçekleştiğinde animasyon oynamaya başlar. Aşağıdaki videoyu izleyerek konuyu daha net anlayabilirsiniz.

Ancak benim yapılışını da açıklamaya çalıştığım yazının konusu videoya bakacak olursanız herhangi bir keyframe atamadığımı görürsünüz. Neden farklı bir yöntemle yaptığımı açıklayayım.

Animasyonlu dokuyu çalıştırmak için neden animasyon yapmıyorum ?

Bunun en temel sebebi özellikle diğer sahnelerden oyununuza efekti çağırdığınızda her efektin bağımsız değilde aynı anda animasyonu oynatmaya çalışıyor olmasıdır. Farz edelim 10 saniyelik 3 tane aynı efekti oyun esnasında, oyun sahnesine çağıracaksınız her efekt oyuna eklendiğinde diğer efektlerin animasyonunu sıfırlar, yani bütün efektler aynı animasyonu aynı şekilde oynatırlar ancak genelde istenen her objenin bağımsız olarak animasyonu oynatmasıdır. Söz gelimi efektlerden biri 10. karedeyken başka birisi 20. karede olabilmelidir. İşte bunu sağlamak için animasyon komutu yerine replaceMesh komutunu kullanıyorum.

Always sensör frekans değeri sıfır iken saniyede 60 kere bağlanan işlemi gerçekleştirir. Replace mesh komutu temel alınarak yazılmış aşağıdaki kod objenin mesh şeklini değiştirmeyi ve her defasında kare sayısını bir arttırarak diğer kareye geçilmesini sağlıyor. Always sensörün saniyede 60 kere tetiklemesi ile beraber saniyede 60 kare görebildiğimiz bir animasyon elde etmiş oluyoruz. Sensör frekansını 1 yaptığımızda ise sensör kodu saniyede 30 defa tetikleyecektir.

#by Hami Cihat SERTCAN

import bge

def main():

    cont = bge.logic.getCurrentController()
    own = cont.owner
    
    if 'first_calculations' not in own:
        own['first_calculations'] = True
        own["frame"]=1
   
    #eklenen objelerin kaçıcı karede olduklarının tespiti
    own["frame"] += 1
    
    def change_frame():
        if own["frame"]<=9:
            own.replaceMesh(own["mesh_name"]+ ".00" +str(own["frame"]))
        if own["frame"]>9 and own["frame"]<=99:
            own.replaceMesh(own["mesh_name"]+ ".0" +str(own["frame"]))
        if own["frame"]>99:
            own.replaceMesh(own["mesh_name"]+ "." +str(own["frame"]))
    
    if own["max_frame"]>own["frame"]:
        change_frame()
                
    if own["frame"]==own["max_frame"]:
        change_frame()
        if own["loop"] == True:    
            own["frame"]=0        
                        

main()

Evet sanırım konu hakkında kafanızda bir şeyler canlanmıştır. Bu noktada bir şeyi daha merak etmiş olmalısınız. Nasıl oluyorda 64 karelik bir animasyon tekrar ederken tekrar ettiğini anlamıyorsunuz. Nasıl oluyorda son karenin ardından gelen ilk kare birbirinin devamı şeklinde olabiliyor. Bir sonraki yazımda bu konuyu açıklamaya çalışacağım …

Bu yazıda %d yorum var

Bir cevap yazın