14/06/2003
25/04/2010
OpenAL dizisinin bu aşamasında, bufferlarınızın birden çok source arasında paylaşılması metodunu göstereceğim. Bu, çok makul ve doğal bir adım, ve bu o kadar kolay ki bazılarınız hali hazırda bunu kendisi yapmış olabilir. Eğer bunu yaptıysanız tüm bu dersi şimdi atlayıp sonrakine geçebilir. Ama verdiğim bilginin tümünü okumaya hevesli zekiler için ilginç bulanabilir bu ders. Artı, direkt Alc katmanını uygulayacağız öyle ki ders 4'de kazanılan bilginin bir kısmını kullanacağız. Bunlara ek, hatta kullanabileceğiniz bir program yaratacağız!
Güzel, hadi. Kodun çoğu şimdiye kadar seride tekrarlandığından dolayı sadece önemli olan kod kısmını incelemeye karar verdim. İndirilen kaynak kodundan tamamına bakılabilir. Bir şey de: Bu ders, STL'den vektörleri kullanacak, bundan dolayı onun kurulu olduğundan emin olun ve çalışması hakkında biraz bilginizin vardır umarım. Burada STL'i anlatmayacağım çünkü bu bir OpenAL dersidir.
İlkin, buffer dizisini indekslemede kullandığımız benim yazdığım birkaç makro. Farklı wav dosyalarını kullanıyor olacağız bundan dolayı burada birden çok buffera ihtiyaç duyarız. Sourceleri depolamak için bir diziyi kullanmak yerine bir STL vektörünü kullanacağız. Bunu yapmayı seçtik çünkü sourcelerin sayısını dinamik belirlememize olanak verir. Sourceleri sahnede sadece OpenAL onları tüketinceye kadar ekli tutarız. Bu, aynı şekilde bizim, sourceleri bir resource olarak değindiğimiz ilk derstir. Ve Evet, tükenirler; onlar sonludur.
Bu, bizim, son derste öğrendiğimiz örnek kodun bir kısmıdır. "DirectSound3D" aygıtına bir handle elde ederiz, ve sonra bizim uygulamamız için bir renderleme context'i elde ederiz. Bu context aktif geçerli olarak set edilir ve fonksiyon başarıyla dönmeden evvel her şey düzgün gittiğinin kontrolü yapılır.
Bu, bizim önceki kodda yaptığımızın tersini yapacak. O, Uygulamamızın kullanıp serbest bırakacağı context ve aygıtı elde eder. O hem de, OpenAL'e yollanan herhangi bir verinin işleme tabi tutulmasını askıya alacak aktif geçerli context’e NULL 'u set eder . Onun aktif geçerli context olarak NULL ayarlanması önemlidir yoksa veriyi işleme tabi tutmak için geçersiz bir contexta sahip olacaksınız. Bunu yapmanın sonuçları, tahmin edilemeyebilir.Eğer bir multi-context uygulamasını kullanıyorsanız ilkleme ve sonlamayla uğraşan daha ileri bir yönteme sahip olmaya ihtiyaç duyabilirsin. Bütün aygıtları ve contextleri global yapıp aktif geçerli context'i geri almadan daha önce onları ayrı ayrı kapatmanı tavsiye ederim.
Bu fonksiyondan sourceleri birlikte üretimini çıkardık. Çünkü bundan sonra, ayrı sourceleri ilkleyeceğiz.
Bizim için sourceleri oluşturacak olan fonksiyon budur. Bu fonksiyon, önceki kodla oluşturduğumuz yüklü bufferların her birisi için tek bir source oluşturur. Verilen buffer , indeks “tipindedir”, bu dersin başında yarattığımız makrolardan biridir. Çalabilecek bir source'e sahip olduğumuzdan emin olmak için bir hata kontrolü yaparız (dediğim gibi, onlar sonludur). Eğer bir source tahsis edilemezse, programdan çıkılacak.
Bu fonksiyon, STL listesi kullanımı sebebiyle biraz değiştirildi. Ayrı ayrı listedeki her source'i silip sonra etkili olarak onu yok edecek olan liste temizliği zorunluluktur.
Bu, main'imizdeki programın iç döngüsüdür. O basitçe, bazı klavye girdilerini bekler ve belirli tuşun basılmasıyla, belirli türde yeni source’i yaratıp ses sahnesine ekler. Aslında bizim burada yarattığımız , insanların gevşeme için dinlediği doğa kaydı gibi bir şey. Arka planda istedikleri sesleri özelleştirmek için kullanıcıya izin verdiğinden dolayı bizimki biraz daha iyidir. Oldukça etkili he? Ben, kodlama yaparken kendiminkini dinlemekteyim. O, bir Zen tecrübesidir (şu an onu dinliyorum).
Program, daha çok wav dosyasını kullanmak için genişletilip, sourceleri sahne civarı keyfi pozisyona konumlatma özelliği eklemeye sahip. Döngületmek yerine siz de verilecek bir frekansla sourceleri çaldırtabilirsiniz. Bununla birlikte bu dersin alanının ötesinde olan GUI rutinlerini gerektirir. Tüm özellikleriyle oyun motorunu yapmak için güzel bir program olurdu. ;)
Dev-C++ proje ve kaynak dosyalarını yükle
Visual C++ 6.0 proje ve kaynak dosyalarını yükle - (TheCell tarafından port edilmiştir)
Java kaynak kodlarını yükle - (Athomas Goldberg tarafından port edilmiştir)
Bu dersin Linux’e portunu yükle - (Lee Trager tarafından port edilmiştir)
Visual C++ 6.0 proje ve kaynak dosyalarını yükle - (TheCell tarafından port edilmiştir)
Java kaynak kodlarını yükle - (Athomas Goldberg tarafından port edilmiştir)
Bu dersin Linux’e portunu yükle - (Lee Trager tarafından port edilmiştir)
* Bu dersin java versiyonu için Java Bindings for OpenAL sayfasını ziyaret edin (Athomas Goldberg tarafından adapte edilmiştir)
Dersin Orjinali : http://www.devmaster.net/articles/openal-tutorials/lesson5.php
Dersin Orjinali : http://www.devmaster.net/articles/openal-tutorials/lesson5.php