17 Haziran 2020 Çarşamba

XNA'de Arkaplan Resmi [06-11-2012]




Merhabalar,bu yazımızda arka plana bir resim koyarak oyunumuzun görsel açıdan daha iyi görünüme sahip olmasını amaçlıyoruz. Bu iÅŸlem çok basit olup daha önceden bahsettiÄŸimiz XNA de resim ekleme konusuyla birebir iliÅŸkilidir. O incelememizde eklediÄŸimiz sprite örneÄŸi için çizdirme metotunu kullanırken kullanılan parametreler texture,position ve color idi. Bu sefer ki iÅŸlemde Draw fonksiyonun deÄŸiÅŸik bir overload edilmiÅŸ örneÄŸini kullanacağız.  

Oyunumuzda kullanacağımız boyut olarak küçük ve orta ölçekli bütün sprite ların çiziminde konum bildirme amaçlı Vector2 sınıfı örneÄŸi kullanabiliriz. Fakat arkaplan olarak düşündüğümüz resmin bütün ekranı kaplamasını istiyoruz. Bu durumu normal olarak resim ekleme yöntemiyle aÅŸabilmemiz için resmimiz oyun penceresi büyüklüğünde olacak ayrıca pencerede ki konumu (x:0,y:0) noktasında olmalıdır. EÄŸer resmimiz oyun penceresinin Ã¶lçülerinden daha küçükse karşımıza çıkabilecek görüntü ÅŸu ÅŸekilde olacaktır.


Bu görünüm için Game1 sınıfı içerisinde Draw metotunda spriteBatch.Draw(arkaplan, new Vector2(0, 0), Color.White) diye fonksiyon kullandık.Resmimiz pencereye sığmadığından bu iÅŸlemi Draw metotunun kullandığımız overload edilmiÅŸ biçimini deÄŸiÅŸtirerek istediÄŸimiz hale getirebiliriz.Bunun için Draw metotunda kullandığımız Vector2 sınıfı parametresi yerine Rectangle isimli dikdörtgen ifade etmemizi saÄŸlayan XNA Framework sınıfını kullanabiliriz.
spriteBatch.Draw(arkaplan, new Rectangle(0,0,this.graphics.PreferredBackBufferWidth,this.graphics.PreferredBackBufferHeight), Color.White);

Burada graphics isimli nesnemizin ekran geniÅŸliÄŸi ve uzunluÄŸu bilgilerini veren alanlarına baÅŸvurduk.graphics isimli nesnemizin Game1 sınıfıyla hazır geldiÄŸini ve GraphicsDeviceManager sınıfından geldiÄŸini hatırlayalım.

Son olarak kısa bir ÅŸeye deÄŸinmek istiyorum ve hemen sonra programımızın son halibe birlikte göz atalım.spriteBatch ile çizim yaparken Begin ve End metotları arasında yazdığımızı hatırlayalım(1).Biz bu örneÄŸimizde ekranda iki adet resim dosyası görüntülemek istiyoruz.Burada söylemem gereken ÅŸey çizilecek olan imajların hangisinin diÄŸerinin üstünde kalacağını bilmeliyiz ona göre en altta görüntülenmesi gerekeni ilk sırada çizdirmeliyiz.Yani eÄŸer ilk olarak diÄŸer sprite ımızı çizdirirsek onun arkasından Ã§izdireceÄŸimiz arkaplan resmi onu kapsayarak görüntülenmesi engeller.
  spriteBatch.Begin();
          spriteBatch.Draw(arkaplan, new Rectangle(0,0,graphics.PreferredBackBufferWidth,graphics.PreferredBackBufferHeight), Color.White);
  spriteBatch.Draw(doku,position,Color.White);
          spriteBatch.End();

EÄŸer dokuyu çizdirdiÄŸimiz satır arkaplanın çizdirildiÄŸi satırdan önce yazılsaydı dokumuzu ekranda göremiyecektik.Åžimdi birlikte kodumuzun son haline 
bir göz atalım.
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 WindowsGame3
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Vector2 position;
//Burada arkaplan için 2D doku nesnesi tanımlıyoruz
        Texture2D arkaplan;
        Texture2D doku;
        
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            base.Initialize();
        }
         protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            doku = Content.Load("denizanasi");
//Burada arkaplan dokumuza Content klasöründen imaj yüklüyoruz
            arkaplan = Content.Load("arkaplan");
            position = new Vector2(0,0);
        }
        protected override void UnloadContent()
        {
           
        }
        protected override void Update(GameTime gameTime)
        {
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();
            KeyboardState klavye = Keyboard.GetState();
            if (klavye.IsKeyDown(Keys.Up)) 
            {
                this.position.Y -= 2;
            }
            if (klavye.IsKeyDown(Keys.Down))
            {
                 this.position.Y += 2;
            }
            if (klavye.IsKeyDown(Keys.Right))
            {
                 this.position.X += 2;
            }
            if (klavye.IsKeyDown(Keys.Left))
            {
                this.position.X -= 2;
            }
            base.Update(gameTime);
        }
       
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            
            spriteBatch.Begin();
//arkaplan ı çizdiriyoruz
            spriteBatch.Draw(arkaplan, new Rectangle(0,0,graphics.PreferredBackBufferWidth,graphics.PreferredBackBufferHeight), Color.White);
            spriteBatch.Draw(doku,position,Color.White);
            spriteBatch.End();
            
            base.Draw(gameTime);
        }
    }
}


Not: Denizanası resmi daha önceden kullandığımız biçimiden farklı bir şekilde ayarlandı.Bu örneğimizde arka planı kesildi ve png olarak kaydedildi.(denizanası)



Hiç yorum yok:

Yorum Gönder