Dx Ball Uygulaması

dx-ball

Merhaba arkadaşlar bugün size ilk XNA Game Studio 4.0 ile yapmış olduğum oyundan bahsedeceğim.

Öncelikle oyunumuzdan bahsedelim. Oyunun genel kuralı topu tahtadan aşağı düşürmeyecek şekilde üst taraftaki bloklara değdirip onları yok etmek. Tabi oyun öyle kolay gitmiyor :) Her top geri döndüğünde daha hızlı bir şekilde geri dönüyor ve bu oyunda tüm blokları kırmanız için üç hakkınız var.

Size birazda oyunu nasıl yazdığımdan bahsetmek istiyorum. En önemli özellik olan ekranın dokunmatik olması ve tuş takımının olmamasından dolayı tahtamızı ekran dokunuşları ile hareket ettirmemiz gerekiyordu. Yani istediğim sınırlarda ve parmağımı nereye sürüklersem tahtanında o yöne doğru gelmesi gerekiyordu. Bunun yanında topumuzum ekran sınırlarından çıkmaması ve tahtamızın altına düştüğü zaman can kaybının olup topun eski yerinden tekrar başlaması gerekliydi.

İlk başta projemizi açıyoruz ve nesnelerimizi oluşturacağımız sınıfları yapıyoruz. Bunlar Ball, Player ve Blok sınıflarıdır.

Tüm sınıflarımızda ortak olan ve bu nesnelerimizi çizmemize yarayan aşağıdaki özellikleri ve metodları tüm sınıflarımıza ekliyoruz.

public Texture2D picture; //oyuncumuzun kullacağı resim atanacak
public int xPosition; //resimin çizdirileceği kordinatın X değeri
public int yPosition; //resimin çizdirileceği kordinaton Y değeri
public int width; //genişlik
public int height; //yükseklik
public void Initialize(Texture2D P, int X, int Y, int W, int H)
{
this.picture = P;
this.xPosition = X;
this.yPosition = Y;
this.width = W;
this.height = H;
}
public void Draw(SpriteBatch batch)
{
batch.Draw(picture, new Rectangle(xPosition, yPosition, width, height), Color.White);
}

Bu kodlar sayesinde Game1 sınıfımızda nesnelerimizi istediğimiz kadar oluşturup çizebileceğiz. Tabi Ball sınıfının bundan artı olarak hareket metodları var. Onlarda aşağıdaki gibi ayarlayabiliriz.

public void Move()
{
if (this.xDirection)
{
xPosition -= speed;
}
else
{
xPosition += speed;
}
if (this.yDirection)
{
yPosition -= speed;
}
else
{
yPosition += speed;
}
}

Tabi bunları böyle tanımlamamız yetmeyecektir. Bunun yanında topumuzun ekranın sınırları dışına çıkmaması da gereklidir ve onuda move() metodunun içine ekleyeceğimiz aşağıdaki kod ile yapabiliriz.

this.yPosition = (int)MathHelper.Clamp((float)this.yPosition, 0, 480 – this.height);
if (yPosition == 0)
{
yDirection = false;
}
if (yPosition == 480 – height)
{
yDirection = true;
}
this.xPosition = (int)MathHelper.Clamp((float)this.xPosition, 25, 770);
if (xPosition == 25)
{
xDirection = false;
}
if (xPosition == 770)
{
xDirection = true;
}

Tabi bunun yanında da Ball sınıfımızda hızı ayarlayabilmemiz için int tipinde speed adında bir değişken tanımlıyoruz.

Şimdi gelelim işin asıl kısmına yani Game1 sınıfımıza. Burada oluşturduğumuz sınıflardan istediğimiz kadar türetip ekrana istediğimiz şekilde yerleştirebiliriz.

İsterseniz gelin ilk önce Game1 sınıfımızın içinde neler var onları görelim. sınıfımızın içinde hazır gelen metodlar aşağıdakilerdir.

public override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
base.LoadContent();
}
public override void Update (GameTime gameTime)
{
base.Update(gameTime);
}
public override void Draw(GameTime gameTime)
{
base.Draw(gameTime);
}

Intialize() metodumuz sınıf diyagramında tanımladığımız Ball, Player, Blok sınıflarından nesneler türetmek için kullanılır.

LoadContent() metodumuz ise oluşturduğumuz nesnelerin resimlerini ve ekranda duracağı alanı belirlemek içi kullanılır. Bununla ilgili bir örnek aşağıda verilmiştir.

Texture2D b1 = Content.Load<Texture2D>(“blok”);
blok1.Initialize(b1, 100, 35, 30, 100);

Burada Texture2D argümentindende bahsetmek istiyorum. Texture2D sayesinde oluşturduğumuz nesnenin resmini ekranımıza koyabilmemizi sağlar.

Update(GameTime gameTime) metodumuz ise bizim hareket metodumuzdur. Burada nesnelerimizin hareket kazanmasını ve bunlar arasındaki etkilişimi kontrolünü sağlar.

Draw(GameTime gameTime) metodumuz ise LoadContent() metodumuzda resim ve yerini ayarladığımız nesnelerimizin ekrana çizilmesini sağlar. Mesela yukarıda örneğini verdiğimiz nesneninde Draw(GameTime gameTime) metodunda çizdirme kodunu verelim.

blok1.Draw(spriteBatch);

Böylelikle istediğimiz kadar nesne oluşturmuş olduk.

Şimdi topumuzu hareket ettirelim. Hatırlarsanız topumuzun hareketi için Ball sınıfında Move() diye bir metod oluşturmuştuk. Şimdi Game1 sınıfımıza gelip önceden bahsettiğim gibi ball adında bir nesne oluşturmuş farz edelim. Uprage() metodumuzun içine gelip ball.Move() yazdığımız zaman topumuzun hareketini tanımlamış oluyoruz.

Şimdide tahtamızın hareketine gelelim. Önceden de dediğim gibi biz bunu ekran dokunmatiğine göre yapmamız gerekiyor. Bunun içinde aşağıdaki işlemleri gerçekleştirmeniz gerekiyor.

float FreeDragX, FreeDragY;              // iki tane değişken tanımlıyoruz. Dokunduğumuz ekran kordinatlarını tutsun diye
&nbsp;
TouchPanel.EnabledGestures = GestureType.FreeDrag;        // Intialize() metodunda tanımlıyoruz. Tahtamızın ekrandaki ilk konumu
FreeDragX = 150;
FreeDragY = 225;
&nbsp;
while (TouchPanel.IsGestureAvailable)                             // Burdada Update() metodu içinde dukunduğumuz yeri  algılamasını sağlıyoruz.
{
GestureSample gesture = TouchPanel.ReadGesture();
switch (gesture.GestureType)
{
case GestureType.FreeDrag:
{
FreeDragX = gesture.Position.X;
FreeDragY = gesture.Position.Y;
break;
}
}
}
&nbsp;
spriteBatch.Draw(BlankTexture, new Rectangle(550, ((int)FreeDragY + 65) / 2, 25, 150), Color.White);    // Draw() metodunda çizim

Evet arkadaşlar topumuzu ve tahtamızı hareket ettirmeyi başarıp bloklarımızı sabitledik. Geriye etkileşim olarak top ile tahta ve blokların temasını ayarlamamız kaldı. Onuda rectangle metodu ıle yapıyoruz. İlk işimiz rectangle tipinde bütün nesnelerden oluşturuyoruz ve bunları tanımladıktan sonra Rectangel diye bir metod açıp tüm nesneleri aşağıdaki gibi tanımlıyoruz.

pBlok1.X = blok1.xPosition;
pBlok1.Y = blok1.yPosition;
pBlok1.Width = blok1.width;
pBlok1.Height = blok1.height;

Bunu da yaptıktan sonra etkileşim diye bir metod kullanarak aşağıdaki gibi top ile diğer nesne temasından verilecek tepkileri belirtmemiz gerkiyor hepsi için.

if (pBlok1.Intersects(pBall))
{
ball.xDirection = !ball.xDirection;         // ters yönde hareket etsin
ball.yDirection = !ball.yDirection;
}

Bunlarıda sağladıktan sonra değişken tanımlama ve ufak tefek if-else tarzı kontrollerle çizimi silme, can kaybı, ölü nokta vb. özellikler katıp oyununuzu bitirebilirsiniz. Gerisi sizin hayal gücünüze kalmış.. :) :)

appscreenshot_1           appscreenshot_2

4 thoughts on “Dx Ball Uygulaması

  1. benzer bir oyunu windows form app olarak yazmaya çalışıyorum ve bazı bilgilere ihtiyacım var yardımcı olabilir misiniz?

    1. Tabi, nasıl bir yardıma ihtiyacınız var ? Detaylı bir şekilde sorunuzu sorarsanız eğer elimden gelen bir yardımsa yardımcı olmaya çalışırım.

      1. kolay gelsin yunus bey visual studyoda bu oyunu yapmak çin kodlara ihtiyaım var ünvertedede bitirme projem de yardım edebilir misinz acaba

        1. Merhabalar, kodların hemen hemen hepsi yazıda verilmiş durumda zaten. Onun dışında herhangi bir sorunuz olursa sorabilirsiniz.

Bir Cevap Yazın