11.05.2010

XNA Oyunu Pause Durumuna Almak

Merhaba arkadaşlar,

Bu yazımızda xna ile geliştireceğimiz oyunlara pause özelliğini nasıl ekleyebileceğimizi göreceğiz. Biz örneğimizde ekrana, oyun normal halinde devam ederken "Oyun Devam Ediyor..." pause konumuna getirildiğinde de "Oyun Beklemede." yazacağız. Siz buradaki mantığı kendi oyunlarınızda istediğiniz gibi ele alabilirsiniz tabiki. Örnek vermek gerekirse, pause durumunda ekrana oyunla ilgili istatiksel bilgileri getirebilirsiniz ya da oyuncunun, oyunun ayarlarına ulaşabileceği çeşitli işlevsel menüleri getirebilirsiniz. Bunların dışında isterseniz sadece ekranı dondurmakla da yetinebilirsiniz. Bunlar tamamen oyununuzun şekline ve sizin nasıl bir pause mekanizması kullanmak istediğinizle alakalı detaylardır. Şimdi gelin bu özelliği nasıl kullanacağımızı görelim;

Öncelikle yeni bir Windows Game projesi oluşturalım. Ardından ekranda oyunun durmumunu gösterebilmek için Content projesine bir SpriteFont ekleyelim (Ekrana nasıl yazı yazabileceğimizi bir önceki makalemden öğrenebilirsiniz). Hemen ardından Game1.cs sınıfında oyunun o anki durumunu tutabilmek için bir enum tanımlayalım. Enum 'ın adı GameState ve sahip olabileceği değerlerin adı da Continue ve Pause olsun.

Bunun için aşagıdaki kodu namespace seviyesinde yazalım;

enum GameState {
Continue,
Pause
}


Ardından da sınıf düzeyinde aşağıdaki tanımlamaları yapalım.

GameState state;
SpriteFont font;


float keyPressCheckDelay = 0.25f;
float totalElapsedTime = 0;


Şimdi pause mekanizmasının çalışmasını sağlayacak aşağıdaki kodu Update methodu içine yazabiliriz.

float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
totalElapsedTime += elapsed;


KeyboardState ks = Keyboard.GetState();

if (state == GameState.Continue)
{
if (totalElapsedTime >= keyPressCheckDelay)
{
if (ks.IsKeyDown(Keys.P) || ks.IsKeyDown(Keys.Pause))
{
state = GameState.Pause;
totalElapsedTime = 0;
}
}
}
else
{
if (totalElapsedTime >= keyPressCheckDelay)
{
if (ks.IsKeyDown(Keys.P) || ks.IsKeyDown(Keys.Pause))
{
state = GameState.Continue;
totalElapsedTime = 0;
}
}
}

Kodu kısaca özetlemek gerekirse eğer, totalElapsedTime ile oyunda geçen toplam zamanı tutuyoruz. Sonraki satırlarda da klavyeden basılan tuşun P ve Pause olup olmadığına bakıyoruz. Bu durumları if blokları ile kontrol edip oyunun durumunu Pause veya Continue ile değiştiriyoruz. Şu anda durumları ekrana yazdırmadığımız için net bir sonuç göremiyoruz. Son olarak durumları ekranda gösterebilmek için LoadContent() ve Draw() methodlarına aşağıdaki kodları yazıyoruz.

protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);


font = Content.Load<SpriteFont>("SpriteFont1");
}


protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);


spriteBatch.Begin();
if (state == GameState.Continue)
{
spriteBatch.DrawString(font, "Oyun Devam Ediyor...", new Vector2(100, 100), Color.Green);
}
else if (state == GameState.Pause)
{
spriteBatch.DrawString(font, "Oyun Beklemede.", new Vector2(100, 100), Color.Red);
}
spriteBatch.End();


base.Draw(gameTime);
}


Kaynak : http://www.krissteele.net/blogdetails.aspx?id=128

Örnek Uygulama

Mehmet Aydın Ünlü

0 yorum:

Yorum Gönder