
Windows Phone 7 bildiğiniz gibi temel olarak iki proje tipini sunmaktadır. Bunlar Silverlight proje tipi ve XNA proje tipi. Silverlight ile günlük, ticari ve eğlenceye yönelik uygulamaları yaparken XNA kullanarak Windows Phone 7 cihazları için eğlenceli oyunlar yapabilmekteyiz. Alt katmanda ortak kullanılan bileşenlerle birlikte yapabilecekleriniz aslında hayal gücünüzle sınırlı.
Nedir bu XNA ve nerelerde kullanılır ? Bunu bir grafikle açıklamak isterim XNA çoklu platform desteği sunmaktadır. Windows 7, Windows Phone 7 ve XBOX 360 desteklemektedir.

Bir XNA projesinin çalışma prensibini bilmek en önemli noktalardan biridir. Başlangıç değerleri ile başlanır, içerikler yüklenir ve durmadan bir Update – Load döngüsü devam eder. Bununla ilgili grafiği aşağıda görebilirsiniz.

Öncelikle bir XNA projesi başlatalım. Bunun için Windows Phone 7 SDK’sı yüklenmiş bir Visual Studio 2010 veya Visual Studio 2010 Express for Windows Phone kullanmanız gerekmektedir.

Bir proje başlatıyoruz. Windows Phone 7 için bir XNA projesi yapacağımız için XNA sekmesine gelmemiz lazım.

Burada Windows Phone Game (4.0) seçeneğini seçiyoruz. Bu arada projemizin lokasyonunu, ismini ve çözüm ismini burada belirtiyoruz.

Projemizi açtığımzıda bir dizayn penceresi göremeyeceksiniz. Bu oyun programlama prensibinin ilk adımıdır. Projeyle gelen ilk kod aşağıdaki gibidir.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace WindowsPhoneGame1
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromTicks(333333);
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
base.Draw(gameTime);
}
}
}
İşe yara birşeyler yapmamız için işe yarar bir kod yazmamız gerekmektedir. Yukarıdaki grafikte incelediğimiz gibi oyun esnasında Update ve Draw döngüsü geçmekte.
Fakat bizim yapmamız gereken bir iş yapabilen XNA projesi yapmak olmalıdır. Bunun için MSDN kaynaklarından faydalanıp biraz geliştirdiğim bir kod parçası üzerinden giderken MSDN üzerinde anlatılmayan hatalardan ve çözümlerinden bahsedeceğim.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace XnaHelloPhone
{
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D logoTexture;
Vector2 logoPosition;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromSeconds(1 / 30.0);
}
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
logoTexture = Content.Load<Texture2D>("volkanatasever");
Viewport viewport = graphics.GraphicsDevice.Viewport;
logoPosition = new Vector2(
(viewport.Width - logoTexture.Width) / 2,
(viewport.Height - logoTexture.Height) / 2);
}
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
TouchCollection touchCollection = TouchPanel.GetState();
if (touchCollection.Count > 0)
{
TouchLocation t1 = touchCollection[0];
double x = t1.Position.X - (logoPosition.X + (logoTexture.Width / 2));
double y = t1.Position.Y - (logoPosition.Y + (logoTexture.Height / 2));
double speed = Math.Sqrt(x * x + y * y) / 20;
double angle = (float)Math.Atan2(y, x);
logoPosition.X += (float)(speed * Math.Cos(angle));
logoPosition.Y += (float)(speed * Math.Sin(angle));
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Red);
// TODO: Add your drawing code here
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);
spriteBatch.Draw(logoTexture, logoPosition, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
}
}
Bu program sayesinde arka planı kırmızı olan bir uygulamada hareket edebilen bir resme sahip olacağız.
Uygulamadan görüntüler:
