Yandex.Metrica
Sınırları Çizmek
Merhaba arkadaşlar,XNA projemizde hareket eden bir spite ımızın olduğunu varsayalım.Şimdi bu sprite ımızın ekran dışına çıkmasını engelleyelim.Kullanıcı klavyeden sprite ı hareket ettirmeye çalışsa bile karakterimiz pencere sınırlarında görüntülenmeye devam etmeli.Bunun için bir önce ki yazımızda oluşturduğumuz Sprite sınıfını geliştirerek dediğimiz durumu hazırlayacağız.Amacımız ekran dışına çıkışı engellemek.

Öncelikle Sprite sınıfına iki adet metot ekliyoruz.KeyboardController ve StayInScreen isimli fonksiyonları tanımlıyoruz.KeyboardController metotu hareket ile ilgili metot olup diğeri ise karakterimizin ekran dışına çıkmasını engelleme amacıyla oluşturulmuştur.StayInScreen metotu içerisinde XNA penceremizin boyutlarını default olarak gelen ayarlara göre (800X600) ölçülerinde girdim.Ama değişik durumlara karşı alternatif bir fonksiyon daha hazırlayacağımızı söylemek istiyorum.

Temel klavye ile hareket işlemleri olup ilgili yazıya buradan ulaşabilirsiniz.
        public void KeyboardController() 
        {
            KeyboardState keyboard = Keyboard.GetState();

            if (keyboard.IsKeyDown(Keys.A)) 
            {
                position.X -= 2;
            }
            if (keyboard.IsKeyDown(Keys.D))
            {
                position.X += 2;
            }
            if (keyboard.IsKeyDown(Keys.W))
            {
                position.Y -= 2;
            }
            if (keyboard.IsKeyDown(Keys.S))
            {
                position.Y += 2;
            }
        }

//Burada üzerinde durmak istediğim mevzu ise aşağıda ki kod parçasında dikkat edeceğiniz üzere sprite ımızın konumu ekranın sınırlarını aşıp
//aşmadığına göre gerektiği şekilde öteleniyor.İki durumda yani X ekseninde sola ve Y ekseninde yukarı doğru öteleme yapılırken texture
// ün genişliği veuzunluğu ölçüsünde bir işlem yapıldığını görüyoruz.Bunu yaptığımızda ideal sonuçları alıyoruz.İstersek pencere sınırlarını aştığımız
//durumlarda uyguladığımız pozisyon değişimlerinin miktarını kendinizce ayarlayabilirsiniz.Ama söylediğim gibi ideali kendi ölçüsü kadar ötelemek diyebiliriz.

        public void StayInScreen() 
        {
            if (this.position.X + this.texture.Width > 800)
            {
                this.position.X = 800 - this.texture.Width;
            }
            if (this.position.X < 0)
            {
                this.position.X = 0;
            }
            if (this.position.Y + this.texture.Height > 600)
            {
                this.position.Y = 600 - this.texture.Height;
            }
            if (this.position.Y < 0)
            {
                this.position.Y = 0;
            }
        
        }


Bu iki metotu tanımladıktan sonra bunları Sprite içerisinde Update metotunda çağırıyoruz.Şimdi kodlarımızı baştan sona görelim.

Sprite.cs:

using System;
using System.Collections.Generic;
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.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace Proje
{
   class Sprite
   {
       Texture2D texture;
       Vector2 position;
       Color color;
       Rectangle rectangle;
       public Sprite(Texture2D texture,Vector2 position,Color color) 
       {
           this.texture = texture;
           this.position = position;
           this.color = color;
       }
       public void KeyboardController() 
       {
           KeyboardState keyboard = Keyboard.GetState();
           if (keyboard.IsKeyDown(Keys.A)) 
           {
               position.X -= 2;
           }
           if (keyboard.IsKeyDown(Keys.D))
           {
               position.X += 2;
           }
           if (keyboard.IsKeyDown(Keys.W))
           {
               position.Y -= 2;
           }
           if (keyboard.IsKeyDown(Keys.S))
           {
               position.Y += 2;
           }
       }
       public void StayInScreen() 
       {
           if (this.position.X + this.texture.Width > 800)
           {
               this.position.X = 800 - this.texture.Width;
           }
           if (this.position.X < 0)
           {
               this.position.X = 0;
           }
           if (this.position.Y + this.texture.Height > 600)
           {
               this.position.Y = 600 - this.texture.Height;
           }
           if (this.position.Y < 0)
           {
               this.position.Y = 0;
           }
       
       }
       public void Update() 
       {
           this.rectangle = new Rectangle((int)position.X,(int)position.Y,texture.Width,texture.Height);
           KeyboardController();
           StayInScreen();
       }
       public void Draw(SpriteBatch spriteBatch) 
       {
           spriteBatch.Draw(this.texture,this.rectangle,this.color);
       }
   }
}

Game1.cs:

using System;
using System.Collections.Generic;
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.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace SpriteFont
{
   
   public class Game1 : Microsoft.Xna.Framework.Game
   {
       GraphicsDeviceManager graphics;
       SpriteBatch spriteBatch;
       Sprite smileman;
       public Game1()
       {
           graphics = new GraphicsDeviceManager(this);
           Content.RootDirectory = "Content";
       }
       protected override void Initialize()
       {
           base.Initialize();
       }
        protected override void LoadContent()
       {
   
           spriteBatch = new SpriteBatch(GraphicsDevice);
           smileman = new Sprite(Content.Load("smileman"),new Vector2(300,300),Color.White);
       }
       protected override void UnloadContent()
       {
   
       }
       protected override void Update(GameTime gameTime)
       {
   
           if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
               this.Exit();
           smileman.Update();
           base.Update(gameTime);
       }
       protected override void Draw(GameTime gameTime)
       {
           GraphicsDevice.Clear(Color.Brown);
           spriteBatch.Begin();
           smileman.Draw(spriteBatch);
        
           spriteBatch.End();
           base.Draw(gameTime);
       }
   }
}

Kodlarımıza ilave olarak belirtmek istediğim bir şey var.Sprite sınıfı içerisinde StayInScreen metotunda oyun penceremiizn boyutlarını 800 e 600 olarak
düşündük.Ama eğer onu daha esnek bir hale getiririz.Önerime gelince StayInScreen e bir parametre ayarlarız(örneğin Vector2 sınıfından) ona göre gerekli yerde yükleriz.Bu
yükleme işlemini gerçekleştirirken ya Game1 sınıfında Update metotunda ayrıca smileman.StayInScreen(Pencere); deriz ve doğal olarak Sprite sınıfında StayInScreen
metotunu Update ten çıkarırız ya da Game1 sınıfında smileman e ait Update metotuna örneğin bir Vector sınıfından olan Pencere isimli değişken yükleriz.Doğal olarak ta 
bu son işlemdede Sprite sınıfının Update fonksiyonunu Vector2 sınıfından bir parametre alabilecek hale getirmeliyiz.Adından söz ettiğimiz Pencere değişkenini
Game1 sınıfında tanımlayıp örneği LoadContent metotunda Pencere.X=graphics.PreferredBackBufferWidth; ve Pencere.Y=graphics.PreferredBackBufferHeight işlemlerini 
yaparak istediğimiz hale getirebiliriz.


Comments(0):
Bu yazı için henüz bir yorum yapılmamış
Yorum yapabilmeniz için üye olmanız gerekmektedir,(Giriş Yap|| Üye Ol)