INETA Türkiye Elazığ Üniversitesi Etkinliği

INETA Türkiye Üniversitenizde etkinlikleri kapsamında, Muammer Benzeş ve Barış Kanlıca ile birlikte 04 Mayıs 2012 tarihinde Elazığ Fırat Üniversitesi‘ndeydik.

XNA ile Oyun Programlama ve ASP.NET MVC ile Uygulama Geliştirme konulu iki oturumum oldu.

Etkinliği gerçekleştirmemizi sağlayan MSP arkadaşımız Bünyamin Öget‘e, Fırat Üniversitesi Yazılım Kulübü‘ne ve katılan arkadaşlara çok teşekkür ederiz.

INETA Türkiye İstanbul Üniversitesi Etkinliği

INETA Türkiye Üniversitenizde etkinlikleri kapsamında, Muammer Benzeş ile birlikte 18 Nisan 2012 tarihinde İstanbul Üniversitesi‘ndeydik.

XNA ile Oyun Programlama ve Windows Phone 7 konulu iki oturumum oldu.

Kısa bir aradan sonra, Muammer Benzeş, Windows 8, WebMatrix ve IIS konulu iki oturum yaptı.

Etkinliği gerçekleştirmemizi sağlayan hocamız İrfan Şimşek‘e ve etkinliğe katılan tüm öğrenci arkadaşlara çok teşekkür ederiz.

XNA Oyunu / Meyve Veren Ağaç

Bu yazımı okumadan önce XNA konusundaki diğer makalelerimi okumanızı öneririm.

Önce görseller;

XNA - Meyve Veren Ağaç - Araba XNA - Meyve Veren Ağaç - Adam XNA - Meyve Veren Ağaç - Sepet XNA - Meyve Veren Ağaç - Armut XNA - Meyve Veren Ağaç - Uzum XNA - Meyve Veren Ağaç - Elma XNA - Meyve Veren Ağaç - Portakal XNA - Meyve Veren Ağaç - Seftali XNA - Meyve Veren Ağaç - Cilek XNA - Meyve Veren Ağaç - Kavun XNA - Meyve Veren Ağaç - Tas XNA - Meyve Veren Ağaç - Muz XNA - Meyve Veren Ağaç - Ağaç Arkaplan

Bir tane arkaplan ses dosyamız var;

Arkaplan Müziği

Bir tane de Sprite Font dosyamız var;

SkorFont.spritefont ismini verdiğim dosyanın, “yorum satırları kaldırılmış halini” aşağıdaki gibi düzenledim;

<?xml version=”1.0” encoding=”utf-8”?> <XnaContent xmlns:Graphics=”Microsoft.Xna.Framework.Content.Pipeline.Graphics”> <Asset Type=”Graphics:FontDescription”> <FontName>Arial</FontName> <Size>16</Size> <Spacing>0</Spacing> <UseKerning>true</UseKerning> <Style>Regular</Style> <CharacterRegions> <CharacterRegion> <Start>&#32;</Start> <End>&#126;</End> </CharacterRegion> </CharacterRegions> </Asset> </XnaContent></pre>

Başlayalım oyunumuzu yazmaya; MeyveVerenAgac projemizi oluşturduktan ve Game1.cs‘in ismini GameLoop.cs olarak değiştirdikten sonra, class seviyesindeki değişkenlerimizi tanımlayalım;

public const int PENCERE_GENISLIK = 800;
public const int PENCERE_YUKSEKLIK = 600;
public const bool TAM_EKRAN = false;

Texture2D Arkaplan;

Oyun penceremizin sınırlarını tutacağımız Rectangle tipinde bir değişkeni class seviyesindeki değişkenlerimize ekleyelim;

Rectangle Pencere;

Gelelim bu değişkenleri kullanmaya, GameLoop class‘ımızın constructor methodunda aşağıdaki kodları yazalım;

graphics.PreferredBackBufferWidth = PENCERE_GENISLIK;

graphics.PreferredBackBufferHeight = PENCERE_YUKSEKLIK;

graphics.IsFullScreen = TAM_EKRAN;

Pencere = new Rectangle(0, 0, PENCERE_GENISLIK, PENCERE_YUKSEKLIK);

Ses dosyalarımız için class seviyesinde değişkenlerimiz tanımlayalım;

SoundEffectInstance BackgroundLoop;

LoadContent() method‘unda değişkenlerimize yükleme işlemlerini gerçekleştirelim;

BackgroundLoop = Content.Load<SoundEffect>("BackgroundLoop").CreateInstance();

BackgroundLoop.Volume = 0.2f;
BackgroundLoop.IsLooped = true;
BackgroundLoop.Play();

Ses dosyası ile yaptığımız bu işlemleri XNA ile Pong oyunu yazalım – 2 ve XNA Oyun / Çanakkale Geçilmez - 1 yazılarımdan hatırlayacaksınız.

XNA Oyun / Çanakkale Geçilmez - 1 oyunumdan hatırlayacağınız GameObject sınıfını oluşturalım;

public enum GameObjectList
{
    Background,
    Basket,
    Random,
    Man,
    Car,
    Pear,
    Strawberry,
    Apple,
    Melon,
    Banana,
    Orange,
    Peach,
    Rock,
    Grape
}

public class GameObject : DrawableGameComponent
{
    SpriteBatch spriteBatch;

    public GameObjectList GameObjectType;

    Texture2D ObjectTexture;

    Vector2 ObjectPosition;

    Random r;

    MouseState ms;

    float FallSpeed = 0f;

    public Rectangle ObjectRectangle;

    public GameObject(Game game, GameObjectList GameObjectType) : base(game)
    {
        r = new Random();

        if (GameObjectType == GameObjectList.Random)
        {
            this.GameObjectType = (GameObjectList)r.Next(3, 14);
        }
        else
        {
            this.GameObjectType = GameObjectType;
        }

        FallSpeed = (float)(r.Next(1, 4) + r.NextDouble());
    }

    public override void Initialize()
    {
        base.Initialize();
    }

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

        switch (this.GameObjectType)
        {
            case GameObjectList.Background:
                ObjectTexture = this.Game.Content.Load<Texture2D>("AgacArkaplan");

                ObjectPosition = Vector2.Zero;
                break;
            case GameObjectList.Man:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Adam");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Car:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Araba");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Pear:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Armut");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Strawberry:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Cilek");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Apple:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Elma");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Melon:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Kavun");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Banana:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Muz");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Orange:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Portakal");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Peach:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Seftali");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Basket:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Sepet");

                ObjectPosition = new Vector2(350, 520);
                break;
            case GameObjectList.Rock:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Tas");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
            case GameObjectList.Grape:
                ObjectTexture = this.Game.Content.Load<Texture2D>("Uzum");

                ObjectPosition = new Vector2(r.Next(0, 800), 10);
                break;
        }

        ObjectRectangle = new Rectangle((int)ObjectPosition.X, (int)ObjectPosition.Y, ObjectTexture.Width, ObjectTexture.Height);

        base.LoadContent();
    }

    public override void Update(GameTime gameTime)
    {
        if (GameObjectType == GameObjectList.Basket)
        {
            ms = Mouse.GetState();

            ObjectPosition.X = ms.X;

            ObjectRectangle.X = ms.X;
        }
        else if (GameObjectType != GameObjectList.Background)
        {
            ObjectPosition.Y += FallSpeed;

            ObjectRectangle.Y = (int)ObjectPosition.Y;
        }

        base.Update(gameTime);
    }

    public override void Draw(GameTime gameTime)
    {
        spriteBatch.Begin();

        spriteBatch.Draw(ObjectTexture, ObjectPosition, Color.White);

        spriteBatch.End();

        base.Draw(gameTime);
    }
}

Yeni eklediğimiz GameObjectList enum sayesinde, GameObject sınıfından ürettiğimiz her değişken farklı bir görünüşe ve davranışa sahip olabiliyor. (Örneğin, puan alacağımız üzüm-çilek-kavun gibi meyveler veya puan kaybedeceğimiz taş-araba-insan gibi nesneler)

GameObject sınıfını Microsoft.Xna.Framework namespace‘inde yer alan DrawableGameComponent sınıfından türetiyoruz.

DrawableGameComponent sınıfından türettiğimiz için, GameObject sınıfının kendi LoadContent, Update ve Draw method’ları oluyor.

LoadContent method’unda, ilgili görseli seçip, hafızaya yüklüyoruz. Update method’unda, eğer nesne Sepet veya Arkaplan değilse, rastgele hızda aşağı düşürüyoruz. Eğer nesne Sepet ise, Mouse tarafından kontrol edilmesini sağlıyoruz;

if (GameObjectType == GameObjectList.Basket)
{
    ms = Mouse.GetState();

    ObjectPosition.X = ms.X;

    ObjectRectangle.X = ms.X;
}

Draw method’unda ise, basitçe ilgili nesneyi ekrana çizdiriyoruz.

GameLoop sınıfına aşağıdaki değişkenleri ekleyelim;

GameObject Basket;
SpriteFont ScoreFont;
Vector2 ScorePosition;

GameObject sınıfınının constructor‘ına aşağıdaki satırları ekleyelim;

Basket = new GameObject(this, GameObjectList.Basket);

this.Components.Add(Basket);

this.Components.Add(new GameObject(this, GameObjectList.Background));

LoadContent method’una aşağıdaki kodları ekleyelim;

ScoreFont = Content.Load<SpriteFont>("SkorFont");
ScorePosition = new Vector2(30, 560);

Rastgele nesne oluşturup, ağaçtan aşağı düşürmeden önce, Son Nesne Oluşturma Zamanı, Nesne Oluşturma Zaman Aralığı gibi değerleri saklayabileceğimiz değişkenlere ihtiyacımız olacak, hemen GameLoop sınıfının içerisinde tanımlayalım;

TimeSpan PreviousFallTime;
TimeSpan FallBufferTime = TimeSpan.FromMilliseconds(1000);

Böylece, her saniye yeni bir nesne oluşturmak için ihtiyaç duyacağımız tüm değişkenleri tanımlamış olduk.

Update method’una aşağıdaki kodları yazalım;

if (gameTime.TotalGameTime - PreviousFallTime > FallBufferTime)
{
    this.Components.Add(new GameObject(this, GameObjectList.Random));

    PreviousFallTime = gameTime.TotalGameTime;
}

for (int iLoop = 0; iLoop < this.Components.Count; iLoop++)
{
    GameObject CurrentComponent = (GameObject)this.Components[iLoop];

    if (CurrentComponent.GameObjectType != GameObjectList.Background && CurrentComponent.GameObjectType != GameObjectList.Basket)
    {
        if (Basket.ObjectRectangle.Intersects(CurrentComponent.ObjectRectangle))
        {
            if (CurrentComponent.GameObjectType == GameObjectList.Rock)
            {
                Skor -= 1;
            }
            else if (CurrentComponent.GameObjectType == GameObjectList.Man)
            {
                Skor -= 2;
            }
            else if (CurrentComponent.GameObjectType == GameObjectList.Car)
            {
                Skor -= 3;
            }
            else
            {
                Skor += 1;
            }

            this.Components.Remove(CurrentComponent);
        }
    }
}

Geriye sadece Draw method’u kaldı;

</pre><pre class="brush:csharp">spriteBatch.Begin();

spriteBatch.DrawString(ScoreFont, “Skor : “ + Skor, ScorePosition + Vector2.One, Color.Black); spriteBatch.DrawString(ScoreFont, “Skor : “ + Skor, ScorePosition, Color.White);

spriteBatch.End();

Skor bilgisini, bir beyaz, bir siyah renkle, iki defa çizdiriyoruz. İkinci çizimi 1px farklı konuma çizdirdiğimiz için, yazı ekranda sanki gölgesi varmış gibi gözüküyor.

İşte Meyve Veren Ağaç oyunundan bir ekran görüntüsü. Oyunun kaynak kodlarını buradan indirebilirsiniz.

Meyve Veren Ağaç oyunun bitmiş hali

INETA Türkiye'de yeni görevim

Zaten konuşmacısı olduğum INETA Türkiye ekibinde, 01 Nisan 2012 tarihinden itibaren, Teknik Topluluklar Yöneticisi olarak yer almaya devam edeceğim.

INETA Türkiye ekibinde yer alan diğer arkadaşlar için, Yönetim Kurulu sayfasına bakabilirsiniz.

Özellikle INETA Türkiye Başkanı Muammer Benzeş‘e beni bu göreve uygun gördüğü için çok teşekkür ederim.

Windows Phone 7 (WP7) ile programlamaya başlangıç

Bu yazı dizisi ile birlikte Windows Phone 7 (WP7) uygulama geliştirme konusunu inceliyor olacağız.

WP7 uygulamalarını Visual Studio 2010, Expression Blend, Silverlight ve XAML gibi mevcut Microsoft araçları üzerine inşa ediyoruz.

WP7, uygulama geliştirmemiz için temel olarak iki framework sağlar;

  • Silverlight Framework Bu framework ile olay tabanlı (XAML sayesinde) uygulamalar geliştirebiliriz
  • XNA Games Framework Bu framework sayesinde, zengin 2D ve 3D oyunlar geliştirebiliriz

Windows Phone 7 Uygulama Geliştirme Gereksinimleri

Visual Studio 2010 kurulu bilgisayarımıza Windows Phone SDK 7.1 indirip kurmamız gerekiyor.

Windows Phone SDK 7.1 kurulumu sonrasında bilgisayarımıza aşağıdaki araçlar kurulmuş olacak;

  • Microsoft Visual Studio 2010 Express for Windows Phone
  • Windows Phone Emulator
  • Windows Phone SDK 7.1 Assemblies
  • Silverlight 4 SDK and DRT
  • Windows Phone SDK 7.1 Extensions for XNA Game Studio 4.0
  • Microsoft Expression Blend SDK for Windows Phone 7
  • Microsoft Expression Blend SDK for Windows Phone OS 7.1
  • WCF Data Services Client for Window Phone
  • Microsoft Advertising SDK for Windows Phone

Ayrıca Visual Studio 2010 kurulumumuza, New Project dialog penceresinden erişebileceğimiz yeni proje şablonları da eklenmiş oluyor.

Not : App Hub - Developer Resources sayfasından, hem ihtiyacımız olacak araçlara, hem de faydalı dokümanlara ulaşabiliriz.

Windows Phone 7 Mimarisi

MSDN‘de yer alan Application Platform Overview for Windows Phone makalesine göre, mimari şu şekilde;

WP7 mimarisinin 4 temel bileşeni;

  • Runtimes Silverlight ve XNA framework, optimize edilmiş uygulama oluşturmak için geliştiriciler için mükemmel bir ortam sağlar
  • Araçlar Visual Studio 2010 ve Expression Blend araçları kullanıcıya zengin uygulamalar tasarlamak ve geliştirmek için geliştiricilere esnek bir ortam sağlar
  • Cloud Services Windows ve SQL Azure, Notification Services, Location Services ve diğer 3. parti servis desteği ile geliştiricilere esnek bir geliştirme ortamı sağlar
  • Portal Services WP7 Market Place geliştiricilere, uygulamalarını yükleme ve sertifika yönetimi imkanı sağlar

Silverlight ve Windows Phone 7 Silverlight, XAML (Extensible Application Markup Language) dili ile uygulamalar ve basit 2D oyunlar geliştirmek için kullanılır. Geliştiriciler kolaylıkla Visual Studio veya Microsoft Blend gibi araçlar sayesinde XAML kodları üretebilirler.

XNA ve Windows Phone 7 XNA, temelde zengin 2D ve 3D oyunlar geliştirmek için kullanılır.

Market Place Sertifikasyon Süreci

Windows Phone 7 için geliştirdiğimiz uygulamaları, Market Place‘e göndermeden önce kontrol etmemiz gereken, WP7‘ye özgü maddeler vardır.

Bu maddelere MSDN‘de yeralan Application Certification Requirements for Windows Phone sayfasından ulaşabiliriz.

Donanım

Şu anda piyasada bulunan Windows Phone cihazları tek bir ekran çözünürlüğüne sahiptir (480 x 800). Yakın gelecekte çıkacak yeni versiyonların birden fazla ekran çözünürlüğünü desteklemesi bekleniyor.

Windows Phone cihazların ortak yönlerinden biri, ön yüzlerinde aynı butonların bulunmasıdır;

Geri Butonu sayesinde uygulamalar ekranlar arası geri dönüş işlevlerini sağlayabilirler. İnternet tarayıcılarda bulunan Geri butonu ile aynı işleve sahiptir. Uygulamanın açılış ekranında kullanılması durumunda, ilgili uygulamanın kapatılmasına sebep olur

Windows Butonu kullanıcının telefonun başlangıç ekranına dönmesini sağlar

Arama Butonu sayesinde kullanıcılar telefonun arama özelliğini çağırabilirler

Sensörler Windows Phone 7 telefonlarda geliştiriciler için en çok öneme sahip sensörler;

  • WI-FI : telefonların internete bağlanmak için kullandıkları bağlantı noktalarından biridir. WP7 telefonlarda Internet Explorer tarayıcısı gelmektedir
  • Camera : WP7 telefonlar en az 5MP kamera ve flaş desteğine sahiptir. Uygulamalar kamerayı veri giriş aracı olarak kullanabilirler
  • Accelerometer : İvmeölçer sayesinde uygulamalar telefonun 3 koordinat düzlemine göre (X-Y-Z) tutuluş bilgisini öğrenebilir
  • GPS : GPS sayesinde uygulamalar, telefonun dünya üzerindeki konum bilgisini alabilirler

Visual Studio 2010 ile New Project dialog penceresini açalım, Installed Templates kısmında yer alan proje şablon gruplarından Silverlight for Windows Phone‘u seçelim.

Sağ tarafa gelen proje şablonlarından Windows Phone Application‘ı seçip, projeye bir isim verelim ve OK butonuna tıklayarak projenin oluşturulmasını sağlayalım.

Eğer tüm güncellemeleri yaptıysak, proje oluşturulması sırasında Windows Phone 7 ve Windows Phone 7.1 (Mango) arasında seçim yapabileceğimiz bir dialog kutusu görmemiz lazım

Proje oluşturulduktan sonra çalıştıracak olursak eğer, ilk olarak Windows Phone Emulator yüklenecek, ardından ilk uygulamamız ekranda belirecektir.

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 458

Creative Commons Lisansı