Tem.20

ActionScript 3.0 AIR SDK ile Pong Oyunu Kodlama

Bu makalede; klasik oyunlardan biri olan Pong oyununun nasıl yapılacağını göreceğiz.

Buraya kadar olan kısmı bölümün girişinde gösterelim. Resimleri küçülterek iki sıra halinde metnin altına alalım.

Hazırlayacağımız oyun örneğimizde, aşağıda bahsedilen teknikleri öğreneceksiniz.

• Nesneler arası açı hesaplamaları.
• Oyuncuya karşı yapay zekayı oynatmak.

Senaryo oldukça basit. Sağa ve sola hareket ettireceğiniz çubuk ile, sahnede sürekli hareket eden topun sizin tarafınıza kaçmasını engelleyin.

Dinamikler:

• Puan artışını gösteren skor ekranı.
• Sahne içinde hareket eden, çubuklara ve kenarlara çarpınca geri seken top.
• Oyuncunun parmağı ile sağa sola hareket ettirebileceği çubuk.
• Yapay zekanın hareket ettireceği çubuk.

File > New > AIR for Android ile yeni bir oyun sahnesi oluşturun. Oyunumuz yatay ekran modunda 800×480 pixel olarak ayarlayın. AIR for Android Settings’ten Aspect ratio’yu Landspace’e getirin.

Çubuklar, Top ve Skor Metinlerinin Hazırlanması

Oyunumuz oldukça basit grafiklere sahip olacak. Oyunumuzda 10×100 pixel ölçülerinde iki adet dikdörtgen MovieClip, 10×10 pixel ölçülerinde daire şeklinde bir MovieClip ve her iki tarafın skorlarını gösterecek olan skor Dynamic Text’leri.

Layer 1 katmanında aşağıdaki şekilde görüldüğü gibi MovieClip’leri ve DynamicText’leri hazırlayın (Eğer metinler oyun esnasında görünmezse, Anti-alias özelliğini Properties panelinden Use device fonts moduna getirin.). Yalnız metin kutularını hazırlarken, Free Transform Tool ile 90º saat yönünün tersine döndürün. Çünkü oyun yatay olmasına rağmen telefonda dikey modda oynanacak.
Numerals’ı tıklayıp onaylayın.

• Üst Dynamic Text’in durum adı = oyuncuSkoru
• Alt Dynamic Text’in durum adı = telefonSkoru
• Sol Çubuk MovieClip’in durum adı = oyuncuCubuk
• Sağ Çubuk MovieClip’in durum adı = telefonCubuk
• Ortadaki top MovieClip’in durum adı = top

Sahnenin arkaplan rengi siyah yapıldı. Diğer tüm nesnenler de beyaz renkle hazırlandı.

Çubukları hazırlarken, yatay ve dikey olarak merkezleme yapın.

Oyunu çalıştırdığımızda erkanın üst kısmında kalan çubuğu biz parmağımızla kontrol edeceğiz.

Layer 1 katmanında aşağıdaki kodları yazın ve kodların açıklamalarını inceleyin.

var topXHiz:int = -3;
var topYHiz:int = -2;
var telefonCubukHiz:int = 3;
var skorOyuncu:int = 0;
var skorTelefon:int = 0;

// Sahnede bir hareket olacağı için FPS değerini yüksek tutmakta fayda var.
stage.frameRate=60;

// Oyunu başlatacak olan fonksiyon tetikleniyor.
// Dilerseniz bu fonksiyonu da bir butonla tetikleyebilirsiniz.
stage.addEventListener(Event.ENTER_FRAME, oyunDöngüsü);

function oyunDöngüsü(e:Event):void{
// Eğer oyuncunun çubuğu topa değiyorsa…
if(oyuncuCubuk.hitTestObject(top) == true ){
// topun hızı 0’dan küçükse, yani Y ekseninde kayıyorsa.
if(topXHiz < 0){ // Hızını -1 ile çarpıp pozitif yapıyoruz. // Böylece Y ekseninde ilerliyor. topXHiz *= -1; // Açı hesaplama fonksiyonuna göre yeni hız hesaplanıyor. // Parametre olarak çubuğun ve topun y koordinat bilgileri gönderiliyor. topYHiz = aciyiHesapla(oyuncuCubuk.y, top.y); } // Eğer telefonun çubuğuna değiyorsa... // Aynı işlemlerin tersini yapıyoruz. }else if(telefonCubuk.hitTestObject(top) == true ){ if(topXHiz > 0){
topXHiz *= -1;
topYHiz = aciyiHesapla(telefonCubuk.y, top.y);
}
}
// Buraya kadar olan kodlar topu çubuklar arasında götürüp getiriyor.

// Eğer top oyuncu çubuğunun 10 pixel arkasına düşmüşse…
if(telefonCubuk.y < top.y - 10){ telefonCubuk.y += telefonCubukHiz; // Eğer top telefon çubuğunu 10 pixel arkasına düşmüşse... }else if(telefonCubuk.y > top.y + 10){
telefonCubuk.y -= telefonCubukHiz;
}
// Buraya kadar olan kodlar da topu geri sektiriyor.

// Ekrana değen parmağın Y ekseni ile oyuncunun çubuğunun Y ekseni eşlitleniyor.
// Böylece oynayan kişi çubuğu hareket ettirebilecek.
oyuncuCubuk.y = mouseY;

// Oyuncu çubuğunun ekran içerisinde kalması sağlanıyor.
if(oyuncuCubuk.y – oyuncuCubuk.height/2 < 0){ oyuncuCubuk.y = oyuncuCubuk.height/2; //check if bottom of paddle is below bottom of screen } else if(oyuncuCubuk.y + oyuncuCubuk.height/2 > stage.stageHeight){
oyuncuCubuk.y = stage.stageHeight – oyuncuCubuk.height/2;
}

// Topa sürekli olarak yeni hız değeri atanıyor.
top.x += topXHiz;
top.y += topYHiz;

// Skorlar hesaplanıyor.
// Eğer topun X değeri 0’dan küçük hesaplanırsa telefona +1 puan.
if(top.x <= top.width/2){ top.x = top.width/2; topXHiz *= -1; skorTelefon ++; skorlariYazdir(); // Eğer topun X değeri sahne genişliğinden büyük hesaplanırsa oyuncuya +1 puan. } else if(top.x >= stage.stageWidth-top.width/2){
top.x = stage.stageWidth-top.width/2;
topXHiz *= -1;
skorOyuncu++;
skorlariYazdir();
}

// Topun ekran içinde kalması sağlanıyor.
// Top, ara boşlukların sınırlarına çarpınca y hız değerlerinin tersleri atanıyor.
if(top.y <= top.height/2){ top.y = top.height/2; topYHiz *= -1; } else if(top.y >= stage.stageHeight-top.height/2){
top.y = stage.stageHeight-top.height/2;
topYHiz *= -1;
}
}

// Top ile çubuk arasındaki çarpma açısına göre yeni hız belirleniyor.
// return ile fonksiyon geriye int tipinde değer gönderiyor.
function aciyiHesapla(cubukY:int, topY:int):int{
var yHizi:int = (topY-cubukY)/10;
return yHizi;
}

// Skorlar metin kutusuna yazdırılıyor.
function skorlariYazdir():void{
oyuncuSkoru.text = skorOyuncu.toString();
telefonSkoru.text = skorTelefon.toString();
}

Ayarlamaları kendinize göre düzenleyin. Unutmayın Aspect ratio ayarı Landscape olacak. Permissios’a girin ve WAKE_LOCK iznini aktif edip paketleyin.

İçeriği paylaş:
  • facebook
  • twitter