Android oyun programlama işlemi sürecinde kendi çizimlerimizi oyun motoru aracılığıyla yapmamız mümkündür. Elbette hazır araçları kullanarak da projenize ekleyebilirsiniz. Ancak eğer bu işten para kazanmak istiyorsanız, native bir oyun yapısı oluşturmak istiyorsanız kendi çizimlerinizi yapabilecek seviyeye gelmelisiniz. En azından fonksiyonların nasıl kullanıldığını anladıktan sonra hazır tasarımları kendinize uyarlamanız kolaylaşacaktır. Andengine geometrik şekil oluşturma işlemleri oldukça basit ve sadedir. Zaten fonksiyonlar hazırdır.
Andengine Line Sınıfı
Andengine kütüphanesi içerisinde bulunan Andengine Line Sınıfı yapısı çizgi ve dikdörtgen oluşturmamızı sağlar. Bu sınıfı kullanabilmemiz için aşağıdaki satırı class yapımıza import etmemiz gereklidir.
import org.anddev.andengine.entity.primitive.Line
Bu sınıf içerisinde iki tane yapıcı metot kullanabilirsiniz. Bu metotlardan bir tanesi parametre olarak başlangıç x,y noktası ile bitiş x,y noktasını almaktadır. Bunların yanında çizgi kalınlığını da parametre olarak alır.
Andengine Rectangle Sınıfı
Geometrik şekiller çizmemizde bize yardımcı olan bir diğer sınıf da
Andengine Rectangle Sınıfıdır. Bu sınıf bize direkt olarak dikdörtgen çizmemizi sağlar. Yani Andengine Line sınıfı ile uğraşmaktansa dikdörtgen şekiller çizmek istediğimizde bu sınıfı kullanmamız daha doğru olacaktır.
Bu sınıf da tıpkı Line sınıfı gibi 2 yapıcı metot kullanmaktadır. İçerisine parametre olarak dikdörtgenin başlangıç noktaları ile yükseklik ve genişlik değerlerini almaktadır. Diğer yapıcı metot ise değişkenlerin yanında
RectangleVertexBuffer nesnesini alır.
Andengine Geometrik Şekiller Çizme Uygulaması
Projemize ilk olarak exdends ifadesinden sonraki kelimeyi silelim ve
BaseGameActivity yazalım. Daha sonra aşağıdaki satırları projemizin üst kısmına ekleyelim.
// ********** Algoritma Uzmanı *********** //
// ******www.algoritmauzmani.com**********//
import org.anddev.andengine.engine.Engine;
import org.anddev.andengine.engine.camera.Camera;
import org.anddev.andengine.engine.options.EngineOptions;
import org.anddev.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.anddev.andengine.entity.primitive.Line;
import org.anddev.andengine.entity.primitive.Rectangle;
import org.anddev.andengine.entity.scene.Scene;
import org.anddev.andengine.entity.scene.background.ColorBackground;
import org.anddev.andengine.entity.util.FPSLogger;
import org.anddev.andengine.ui.activity.BaseGameActivity;
Aşağıdaki satırları GeometrikSekil activity içerisine ekleyelim. Ekleyince hata alacaksınız, umursamayın sebebi henüz onLoadComplete metodunu yazmamış olmayız. Onu da birazdan anlatacağım.
public class GeometrikSekil extends BaseGameActivity {
private static final int CAMERA_WIDTH = 800;
private static final int CAMERA_HEIGHT = 480;
private Camera camera;
private Engine engine;
private Scene sahne;
@Override
public Engine onLoadEngine()
{
camera = new Camera(0,0, CAMERA_WIDTH, CAMERA_HEIGHT);
final EngineOptions engineOptions = new EngineOptions(true, EngineOptions.ScreenOrientation.LANDSCAPE, new FillResolutionPolicy(), camera);
engineOptions.getTouchOptions().setRunOnUpdateThread(true);
engine = new Engine(engineOptions);
return engine;
}
@Override
public Scene onLoadScene()
{
this.engine.registerUpdateHandler(new FPSLogger());
this.sahne = new Scene();
sahne.setBackground(new ColorBackground(0.09804f, 0.6274f, 0.8784f));
// Çizgimizi Oluşturuyoruz
Line line = new Line(20, 20, 780, 20);
// Dikdörtgen Oluşturuluyor
Rectangle rectangle = new Rectangle(20, 40, 760, 420);
// Oluşturulan nesneler sahne üzerine çizdiriliyor
this.sahne.attachChild(line);
this.sahne.attachChild(rectangle);
return this.sahne;
}
}
OnLoadEngine Metodu İçerisinde Gerçekleştirilen İşlemler
camera ve engine nesnelerini oluşturduk.
Camera nesnesi oluştururken 4 parametre girişi aldı. Bunlar X başlangıcı, Y başlangıcı ve X,Y değerlerinin bitiş noktalarından ibarettir.
EngineOptions nesnesinin parametrelerine geldiğimizde ise true değeri boolean bir değerdir. Bu bilgi uygulamamızın tam ekran olup olmadığını gösterir.
İkinci değişken ise ScreenOrientation türünden bir nesnedir. Oyunumuz ekranda dikey mi yatay mı duracaktır onu gösterir. LANDSCAPE özelliğinde uzun kenar X ekseni iken PORTRAIT özelliğinde ise kısa kenar Y eksenidir.
Üçüncü değişkenimizde görsel içeriklerin camera nesnesi içerisine nasıl oturtulacağını belirtir. Biz FillResolutionPolicy nesnesini tercih ettik. Bu nesne kamera boyutuna göre değil de ekran çözünürlüğüne göre resimlerin büyüklüğünü değiştirmektedir. Yani hangi telefon olursa olsun resimlerimiz telefona sığacaktır. Bir nevi Responsive içerik mantığı uyguladık yani.
FillResolutionPolicy Nesnesi yerine aşağıdaki nesneleri de kullanabilirdik;
RatioResolutionPolicy: Görüntü içeriklerini belirlenen oranda büyüklüğünü değiştirir. Ancak en boy oranı hep sabit kalır.
RelativeResolutionPolicy: Önceden belirtilmiş X ve Y değerlerine bağlı şekilde görsel boyutu ayarlama işlemi yapar. En boy oranı kullanıcıdan alınır. Görüntülerde bozulma riski taşımaktadır.
FixedResolutionPolicy: Oyunun gerçekleşeceği ekran boyutunu kullanıcı belirler. Kullanıcıdan alınan değerlere göre ekran boyutu belirlenir. Görsellerde bozulma riski mevcuttur.
Bir sonraki satırda yani engineOptions.getTouchOptions satırında ise andengine threading özelliği kazandırıyoruz. Bu özellik oyunu oynayan kişilerin telefona parmaklarıyla dokunduklarında hareketlerin algılanması için oluşturulmuştur.
engine = new engine() satırında ise engine nesnesini oluşturduk. Bu işlem yapılırken engineOptions nesnesini değişken olarak Engine sınıfının yapıcı metoduna gönderdik. Sonra satırda engine nesnesini geri döndürüyoruz.
OnLoadResources Metodunda Yapılan İşlemler
onLoadResources metodu içerisinde texture, textureRegion ve benzeri nesnelerin oluşturulma işlemleri gerçekleştirilmektedir. Yani oyunun altyapısı hazırlanır. Ancak bu metot şu anda boş durumdadır.
OnLoadScene Metodunda Yapılan İşlemler
Esas işler onLoadScene metodu içerisinde gerçekleşir. Burada oyun kodları yapılandırılır.
İlk satırda kullanıcıya gösterilecek çerçeveyi belirttik. Burada işlemi gerçekleştiren temel nesne FPSLogger nesnesidir. Değişken olarak da registerUpdateHandler() metoduna gönderiyoruz.
Oyun içerisindeki bilgilerin güncellenmesi amacıyla Update Panel denilen bir sistem kullanılır.
this.sahne = new Scene() satırında sahnemizi oluşturduk. Oyunumuz bu sahnede gerçekleşecek.
Bir sonraki satırda sahne nesnesinin bir metodunu kullandık. setBackground metodu ile sahne arkaplanı rengini belirledik.
attachChild fonksiyonu ile cisimlerimiz ekrana çizdirilmektedir. attachChild Sahne nesnesinin bir fonksiyonudur. Kullanıldığı sahne üzerinde değişken olarak aldığı nesneyi çizdirmektedir.
return this.sahne işleminde uygulamada gösterilecek ilk sahne döndürülür.
Line line = new Line() komutunda ise çizgi oluşturduk. Line(x1,y1,x2,y2) parametrelerini alır, x1,y1 demek başlangıç x,y noktası, x2,y2 demek ise bitiş noktası demektir. Yani biz x1,y1'den x2',y2 noktasına bir çizgi çizmiş olduk.
Rectangle satırında ise dikdörtgen çizdik, bunun formatı ise (x1,x2,y1,y2) şeklindedir. Bu noktalar arasında bir dikdörtgen çizmektedir.
this.sahne.attachChild(Line) dediğimiz zaman çizgimizi ekrana bastırmış oluruz. Yani bu komut oluşturulan sınıfı ekrana bastırmaktadır.
Gelecek yazımızda Andengine Texture ve Sprite Nesnesi konusuna değineceğiz.
Etiketler: Andengine geometrik şekil, Andengine Line Sınıfı, Andengine Rectangle, andengine threading özelliği, android oyun programlama, onloadscene metodu