|
شروع با XNA ( قسمت اول )
|
|
نويسنده |
پيغام |
مهدي بازيان مدیر انجمن
تاريخ عضويت: 1 شنبه 5 تير 1384 تعداد ارسالها: 430 محل سكونت: اصفهان
4 شنبه 13 بهمن 1389 - 23:05 |
|
|
سلام
می خوام یه سری مقاله با عنوان "شروع با XNA " بنویسم. این اولین مقاله از این سریه.
البته پیشنهاد من اینه که زبان انگلیسیتون در هر سطحی که هست با MSDN جلو برید : http://msdn.microsoft.com/en-us/library/bb200104.aspx
این مقاله بر اساس یکی از مقاله های MSDN به نام Your First Game نوشته شده . ( http://msdn.microsoft.com/en-us/library/bb203893.aspx#Y1399 )
****************************
خوب برای شروع شما نیاز به داشتن XNA 4.0 دارید.
که می تونید از اینجا دانلود کنید : http://go.microsoft.com/fwlink/?LinkID=189554
از منوی Start روی All Programs کلیک کنید . وارد پوشه XNA Game Studio 4.0 بشید و از اونجا XNA رو اجرا کنید.
از منوی File روی New Project کلیک کنید.
از پنجره باز شده در قسمت Visual C# روی XNA Game Studio 4.0 کلیک کنید.
حالا Windows Game رو انتخاب کنید. در قسمت Name هم اسم بازیتون رو بنویسید ، مثلا : MyFirstGame
در قسمت Location هم می تونید آدرسی که قصد دارید پروژتون اونجا ذخیره شه رو تایپ کنید.
بعد از این روی دکمه OK کلیک کنید.
از قسمت Solution Explorer که سمت راست صفحه است ، روی Game1.cs کلیک کنید. ( اگه این قسمت Solution Explorer رو در صفحه نمی بینید ، روی منوی View کلیک کنید و Solution Explorer رو انتخاب کنید. )
همون طور که می بینید قسمت زیادی از کدهای مورد نیاز شما برای شروع و اجرا نوشته شده.
حالا شما می تونید کد خودتون رو اضافه کنید.
كد: |
* The Initialize method is where you can initialize any assets that do not require a GraphicsDevice to be initialized.
* The LoadContent method is where you load any necessary game assets such as models and textures.
* The UnloadContent method is where any game assets can be released. Generally, no extra code is required here, as assets will be released automatically when they are no longer needed.
* The Update loop is the best place to update your game logic: move objects around, take player input, decide the outcome of collisions between objects, and so on.
* The Draw loop is the best place to render all of your objects and backgrounds on the screen.
|
در قسمت Initialize شما می تونید مقدار اولیه متغیر ها رو مشخص کنید . البته متغیرهایی که وابسته به GraphicDevice نباشند .
در LoadContent شما منابع مورد استفاده در بازیتون رو Load می کنید. مثلا مدلها و تکسچر ها.
در UnloadContent هم که منابعی دیگه نیازی ندارید رو Unload میکنید.
حلقه Update بهترین جا برای بروز رسانی متغیرهاست. حرکت دادن اشیاء ، بررسی ورودی ها و یا بررسی برخورد ها.
حلقه Draw هم جایی هست که شما همه اشیاء و بکگراند ها رو رندر می کنید.
از قسمت Solution Explorer در سمت راست روی MyFirstGameContent راست کلیک کنید و از قسمت Add گزینه Existing Item ... رو انتخاب کنید. حالا یک Sprite که قبلا مثلا با Paint طراحی کردید رو انتخاب کنید.
به عنوان مثال من این اسپرایت رو که با Paint طراحی و تو Desktop ذخیره کرده بودم رو انتخاب کردم.
حالا روی Game1.cs کلیک کنید و متد LoadContent رو پیدا کنید و کدهای زیر رو اضافه کنید .
كد: |
// This is a texture we can render.
Texture2D myTexture;
// Set the coordinates to draw the sprite at.
Vector2 spritePosition = new Vector2(200,300);
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
myTexture = Content.Load<Texture2D>("mytexture");
}
|
توضیحات درباره با کدهای اضافه شده :
ما توی خط زیر یه متغیر به به نام myTexture از نوع Texture2D تعریف کردیم.
اینجا هم متغیری به نام spritePosition از نوع Vector2 تعریف کردیم و مقدار اون رو X = 200 و Y = 100 قرار دادیم. ( مختصاتی که می خواهیم اسپرات در اون رسم شه رو در این متغیر قرار میدیم )
كد: |
Vector2 spritePosition = new Vector2(200,100);
|
SpriteBatch هم بعدا برای رسم اسپرایت استفاده میشه :
كد: |
spriteBatch = new SpriteBatch(GraphicsDevice); |
در این خط هم اسپرایتی که در Content قبلا Add کرده بودیم رو در myTexture قرار میدیم. ( اینجا اسم فایل اسپرایت من CH هست )
كد: |
myTexture = Content.Load<Texture2D>("CH");
|
حالا متد Draw رو پیدا کنید.
کدهای زیر رو اضافه کنید :
كد: |
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.White);
// Draw the sprite.
spriteBatch.Begin();
spriteBatch.Draw(myTexture, spritePosition, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
|
در این قسمت کدهای مربوط به پاک کردن صفحه و رندر اسپرایت قرار گرفتند.
این خط صفحه رو با رنگ CornflowerBlue پاک می کنه ( مثلا با با نوشتن White صفحه به رنگ سفید پاک میشه ) :
كد: |
graphics.GraphicsDevice.Clear(Color.CornflowerBlue); |
خط زیر هم myTexture رو در مختصات spritePosition و با رنگ سفید رسم می کنه. ( منظور از رنگ سفید رو خودتون با انتخاب رنگهای دیگه متوجه میشید. )
كد: |
spriteBatch.Draw(myTexture, spritePosition, Color.White); |
تابع Begin و End هم به ترتیب باید قبل و بعد از کدهای مربوط به رندر بنویسید.
یعنی مثلا اگه ما دو تا اسپرایت داشتیم ، این طوری باید می نوشتیم :
كد: |
spriteBatch.Begin();
spriteBatch.Draw(myTexture, spritePosition, Color.White);
spriteBatch.Draw(myTexture2, spritePosition, Color.White);
spriteBatch.End();
|
خوب اگه الان پروژه رو Build کنید و اجرا کنید باید اسپرایت شما در مختصات 200,100 رسم بشه .
چیزی شبیه به این :
حالا موقع نوشتن کدهایی هست که اسپرایت با فشار داده شدن دکمه های جهت نما حرکت کنه.
متد Update رو پیدا کنید.
کدهای زیر رو اضافه کنید.
كد: |
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
KeyboardState k = Keyboard.GetState();
if (k.IsKeyDown(Keys.Left))
spritePosition.X -= 2;
if (k.IsKeyDown(Keys.Right))
spritePosition.X += 2;
if (k.IsKeyDown(Keys.Up))
spritePosition.Y -= 2;
if (k.IsKeyDown(Keys.Down))
spritePosition.Y += 2;
base.Update(gameTime);
}
|
در خط زیر متغیری به نام k تعریف کردیم که اطلاعات مربوط به کیبورد در اون قرار میگیره.
كد: |
KeyboardState k = Keyboard.GetState(); |
تابع isKeyDown هم چک می کنه که دکمه مورد نظر فشرده شده یا نه .
از این تابع 4 بار برای 4 دکمه جهت نما استفاده می کنیم.
حالا F5 رو بزنید و نتیجه رو ببینید .
شما می تونید سورس این بازی رو از اینجا دانلود کنید :http://dl.dropbox.com/u/19812944/myFirstGame.zip |
|
|
بازگشت به بالا |
|
|
|
|
|
|
|
|
صفحه 1 از 2 |
تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد برو به صفحه 1, 2 بعدي
|
|
شما نمي توانيد در اين انجمن نامه ارسال كنيد. شما نمي توانيد به موضوعات اين انجمن پاسخ دهيد شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن ويرايش كنيد شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن حذف كنيد شما نمي توانيد در نظر سنجي هاي اين انجمن شركت كنيد
|
|
|