Unconfigured Ad Widget

تقليص

إعـــــــلان

تقليص
لا يوجد إعلان حتى الآن.

كيفية برمجة القائمة الرئيسية في xna

تقليص
X
 
  • تصفية - فلترة
  • الوقت
  • عرض
إلغاء تحديد الكل
مشاركات جديدة

  • كيفية برمجة القائمة الرئيسية في xna

    مرحبا مبرمجي XNA الأكارم :
    اقدم لكم جزء مبسط من تصميم اللعبة من البداية وهي أضافة القائمة الرئيسية للألعاب المصممة بـ XNA

    وسوف أقدم كيفية برمجة القوائم الرئيسية للتصميم اية لعبة كانت

    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Content;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Storage;
    using System;
    using System.Collections.Generic;
    using XnaGraphicEngine.Game;
    using XnaGraphicEngine.Graphics;
    using Texture = XnaGraphicEngine.Graphics.Texture;
    using Model = XnaGraphicEngine.Graphics.Model;
    using XnaGraphicEngine.Helpers;
    using XnaGraphicEngine.GameScreens;
    using XnaGraphicEngine.Sounds;
    using XnaGraphicEngine.Properties;
    //ادخال مكتبات xna للأستدعائها عند البرمجة وهي مهمة جداً للتنفيذ بشكل سلس بدون أية أخطاء


    namespace XnaGraphicEngine
    //تحديد اسم المشروع في بداية البرمجة
    {


    public class YourGame : BaseGame
    // تحديد اسم الكلس الأول للبرمجة مكونات المشروع المراد عمله
    {
    #region Variables
    /// <summary>
    /// من هنا اضافة تعريف المكونات ظهور الشاشة الأولى
    /// وهذا هو منطق اللعبة من البداية
    /// </summary>

    private Stack<IGameScreen> gameScreens = new Stack<IGameScreen>();

    /// <summary>
    ///طريقة تحميل القائمة الرئيسية للعبة
    /// </summary>

    public Texture mainMenuTexture = null,
    mouseCursorTexture = null;

    // انشاء متغير للظهور الماوس على الشاشة
    public Texture hudTopTexture = null,
    // انشاء متغير عند الضغط على الماوس
    hudBottomTexture = null;


    #region Constructor
    /// <summary>
    /// كود انشاء اللعبة
    /// </summary>

    public YourGame()
    {
    // برمجة عدم تفعيل ظهور الماوس عند ظهور القائمة الرئيسية للعبة

    this.IsMouseVisible = false;

    }


    #region Initialize
    /// <summary>
    /// اضافة مكونات اللعبة وتحميل التحكمات الرئيسية للعبة
    /// </summary>

    protected override void Initialize()
    {
    base.Initialize();

    //اظهار مؤشر الماوس في الوسط الشاشة
    Input.Update();
    Input.MousePos = new Point(
    Window.ClientBounds.X + width / 2,
    Window.ClientBounds.Y + height / 2);
    Input.Update();

    // تحميل صورة القائمة مع صورة الماوس
    mainMenuTexture = new Texture("XNA2");
    mouseCursorTexture = new Texture("MouseCursor");
    hudTopTexture = new Texture("HudTop");
    hudBottomTexture = new Texture("HudBottom");

    //هنا اضافة اظهار القائمة الرئيسية
    gameScreens.Push(new MainMenu());
    // اضافة بداية اللعبة
    //gameScreens.Push(new Mission());
    //inGame = true;

    // وهنا اضافة الصوت للعبة وهو الموسيقى
    Sound.StartMusic();
    } // Initialize()
    #endregion



    /// <summary>
    /// تفعيل الموسيقى تشغيل او اغلاق
    /// </summary>

    public void ToggleMusicOnOff()
    {
    if (GameSettings.Default.MusicOn)
    Sound.StopMusic();
    else
    Sound.StartMusic();
    }


    //اضافة شاشة المقدمة للعبة
    static bool inGame = false;

    public static bool InGame
    {
    get
    {
    return inGame;
    }
    }

    /// <summary>
    /// حجز مكان للذاكرة للظهور اول شاشة
    /// </summary>

    /// <param name="newGameScreen">New game screen</param>
    public void AddGameScreen(IGameScreen newGameScreen)
    {
    gameScreens.Push(newGameScreen);

    inGame = newGameScreen.GetType() == typeof(Mission);
    }



    /// <summary>
    /// عملية ازاحة اومسح الشاشة الحالية للأفراغ الذاكرة
    /// </summary>

    public void RemoveCurrentGameScreen()
    {
    gameScreens.Pop();

    inGame = gameScreens.Count > 0 &&
    gameScreens.Peek().GetType() == typeof(Mission);
    }



    /// <summary>
    /// هنا يتم اضافة رسم القائمة الخلفية اللعبة
    /// </summary>

    public void RenderMenuBackground()
    {
    // ادخال ظهور صورة القائمة الرئيسية شفافة امام النص .
    BaseGame.EnableAlphaBlending();
    // تحديد وضع امداد الصورة على كامل الشاشة
    mainMenuTexture.RenderOnScreen(
    BaseGame.ResolutionRect,
    new Rectangle(0, 0, 1024, 768));
    }


    public static void RenderGameBackground()
    {
    //TODO
    }


    // هنا يتم اضافة ازرار او كبسات للقائمة
    public bool RenderMenuButton(
    MenuButton buttonType, Point pos)
    {
    //امكنة ظهور الضغط الزر على الشاشة
    Rectangle rect = new Rectangle(
    pos.X * BaseGame.Width / 1024,
    pos.Y * BaseGame.Height / 768,
    200 * BaseGame.Width / 1024,
    77 * BaseGame.Height / 768);


    Rectangle innerRect = new Rectangle(
    rect.X, rect.Y + rect.Height / 5,
    rect.Width, rect.Height * 3 / 5);
    bool highlight = Input.MouseInBox(

    innerRect);
    // هنا يتم أضافة اصوات النقرات للقائمة
    if (highlight &&
    Input.MouseWasNotInRectLastFrame(innerRect))
    Sound.Play(Sound.Sounds.Highlight);


    int buttonNum = (int)buttonType;


    Rectangle pixelRect = new Rectangle(3 + 204 * buttonNum,
    900 + 80 * (highlight ? 1 : 0), 200, 77);

    //هنا يتم الرسم للقائمة وهي الصورة القائمة

    mainMenuTexture.RenderOnScreen(rect, pixelRect);


    bool ret =
    (Input.MouseLeftButtonJustPressed ||
    Input.GamePadAJustPressed) &&
    this.IsActive &&
    highlight;

    if (buttonType == MenuButton.Back &&
    Input.GamePadBackJustPressed)
    ret = true;
    if (buttonType == MenuButton.Missions &&
    Input.GamePadStartPressed)
    ret = true;

    if (ret == true)
    Sound.Play(Sound.Sounds.Click);


    return ret;
    }



    /// <summary>
    /// هنا يتم رسم الماوس على الشاشة
    /// </summary>

    public void RenderMouseCursor()
    {


    int mouseAnimationStep = (int)(BaseGame.TotalTimeMs / 100) % 4;

    mouseCursorTexture.RenderOnScreen(
    new Rectangle(Input.MousePos.X, Input.MousePos.Y, 60 * 2 / 3, 64 * 2 / 3),
    new Rectangle(64 * mouseAnimationStep, 0, 60, 64));

    SpriteHelper.DrawSprites(width, height);

    }


    // أستدعاء الدالة update لحركة الأطارات frame 60 مرة لكل ثانية تقريباً
    protected override void Update(GameTime gameTime)
    {

    if (gameScreens.Count > 0 &&
    gameScreens.Peek().Quit)
    RemoveCurrentGameScreen();
    // ازالة مكان للذاكرة عند الخروج من القائمة الحالية
    if (gameScreens.Count == 0)
    {

    if (this.GetType() != typeof(TestGame))

    Exit();
    }

    base.Update(gameTime);
    } // للتحديث الرسم



    protected override void Draw(GameTime gameTime)
    {
    ClearBackground();
    // لمسح الشاشة لأضافة رسم المكونات والصور والتأثيرات effect
    // هنا يتم رسم التأثيرات الشيدر على الشاشة الرئيسية
    BaseGame.GlowShader.Start();

    try
    {

    if (gameScreens.Count > 0)
    gameScreens.Peek().Run(this);
    }
    catch (Exception ex)
    {
    Log.Write("Failed to execute " + gameScreens.Peek().Name +
    "\nError: " + ex.ToString());
    }

    base.Draw(gameTime);

    // يتم أظهار الماوس
    if (inGame == false &&
    gameScreens.Count > 0)
    RenderMouseCursor();
    else
    {
    // في بداية اي لعبة يجب اظهار الماوس في الوسط
    Input.CenterMouse();
    }

    // وهنا يتم اظهار التاثير الثنائي والثلاثي البعد للشيدر على الشاشة
    glowShader.Show();
    }



    /// <summary>
    /// وهنا يتم اضافة بداية تحميل اللعبة
    /// </summary>

    public static void StartGame()
    {
    using (YourGame game = new YourGame())
    {
    game.Run();
    }
    GameSettings.Save();
    {
    {
    {















    وهذه نبذة مختصرة للقائمة الرئيسية عند الدخول للعبة من البداية

    وهذا مثال يوضح ذلك :
    http://rapidshare.com/files/28885845...NA.ccgame.html

    قبل تشغيل المثال يجب عليك تنزيل النسخة الأحدث من XNA 3.1 لتشغيلها بالشكل الصحيح ....

    او تحميل البرنامج : XNA Framework Redistributable 3.1

    http://www.microsoft.com/downloads/d...1-98eb3e799ef2

    والبقية الشرح على مراحل في هذا الموضوع هنا

    ملاحظة هامة :
    اذا كان الشرح غير واضح الرجاء وضع ملاحظاته في هذا الموضوع لأعادة صياغة الشرح بطريقة أخرى وبالتفصيل الكامل


    تعلم أساسيات لغة #C أولاً
    اذا لم تكن تعرف عن اوامر #C اساساً اليك السلسلة التعليمية وباللغة العربية لـ #C فقط
    واليكم الكتاب الكامل لتعليم #C باللغة العربية
    http://rapidshare.com/files/28890320..._____.rar.html

    والكتاب الكامل لتعليم XNA 3.0 باللغة الأنجليزية
    http://rapidshare.com/files/28890439...A_3.0.rar.html



    ترقبونا دائماً كل ما هو جديد من دروس
    XNA
    التعديل الأخير تم بواسطة omarzonex; 06 / 10 / 2009, 11:57 AM.

  • #2
    شكراً يا اخي الدرس رائع
    ................................
    إذا أردت أن تعصي الله
    فاختبئ في مكان لا يراك الله فيه ..


    إذا أردت أن تعصي الله ..
    فلا تعصه فوق أرضه ..


    إذا أردت أن تعصي الله ..
    فلا تأكل من رزقه ..

    تعليق


    • #3
      تابع الدرس الثاني : لأضافة كلس الأصوات ((Sound.cs))

      استخدمت الشرح بشكل سريع وبعيد عن الألغاز المستخدمة لدى جميع المبرمجين بشكل مبسط ومدلول العبارات البرمجية
      -----------------------------------------------------------------------
      namespace nameprojecthere.Sounds
      //xna هنا نكتب اسم كلس الصوت لأستخدامه في مكتبة الأستدعاء في
      {
      /// <summary>
      /// الصوت
      /// </summary>
      class Sound
      {

      /// <summary>
      /// XActمتغير فلترة الصوت عن طريق
      /// </summary>

      static AudioEngine audioEngine;
      /// <summary>
      /// استخدام مكتبة تحويل الصوت الى وايف
      /// </summary>

      static WaveBank waveBank;
      /// <summary>
      /// استخدام مكتبة تحويل الصوت
      /// </summary>

      static SoundBank soundBank;

      static AudioCategory musicCategory;

      /// <summary>
      /// اضافة متغيرات انواع الصوت
      /// </summary>
      /// <returns>Enum متغير </returns>

      public enum Sounds
      {
      Defeat,
      EMP,
      EnemyShoot,
      Explosion,
      GattlingShoot,
      Health,
      MgShoot,
      PlasmaShoot,
      Victory,
      GameMusic,
      Click,
      Highlight,
      } // اصوات المتغير



      /// <summary>
      /// من هنا يتم انشاء الصوت
      /// </summary>

      static Sound()
      {

      try
      {
      string dir = Directories.SoundsDirectory;
      audioEngine = new AudioEngine(
      Path.Combine(dir, "XnaShooter.xgs"));
      waveBank = new WaveBank(audioEngine,
      Path.Combine(dir, "Wave Bank.xwb"));

      // يجب اضافة اعلان عن متغير استخدام صوت معين عند الأستدعاء فقط
      // xna ويستعمل هذا المتغير داخل
      if (waveBank != null)
      soundBank = new SoundBank(audioEngine,
      Path.Combine(dir, "Sound Bank.xsb"));

      // أضافة متغير لمكونات الصوت مثل اعلاء حجم الصوت او ايقافه عند استدعاء المتغير
      musicCategory = audioEngine.GetCategory("Music");
      } // يتم اضافة اعلان متغير لمنعه من حدوث خطأ عشوائي
      catch (Exception ex)
      {
      // اضافة تحذير معين لحدوث خطأ في اصدار الصوت
      Log.Write("Failed to create sound class: " + ex.ToString());
      } // استثناء لحدوث أخطاء في أخراج الصوت
      }



      /// <summary>
      /// من هنا يتم تشغيل الصوت
      /// </summary>

      public static void Play(string soundName)
      {
      if (soundBank == null)
      return;
      // هنا وضع متغير التنبؤ بحدوث خطأ معين
      try
      {
      soundBank.PlayCue(soundName);
      } // ويتم تأكيد حدوث خطأ عند التنبؤ به بشكل اوتوماتيكي والأعلان عنه
      catch (Exception ex)
      {
      Log.Write("Playing sound " + soundName + " failed: " + ex.ToString());
      }
      }

      /// <summary>
      /// تعريف المتغير لتشغيل الصوت
      /// </summary>

      public static void Play(Sounds sound)
      {
      Play(sound.ToString());
      } //يتم تجهيز نوع الصوت


      /// <summary>
      /// هنا يتم برمجة بتغير نوعية الصوت
      /// </summary>

      public static void PlayDefeatSound()
      {
      Play(Sounds.Defeat);
      }

      /// <summary>
      /// يتم برمجة سرعة الصوت
      /// </summary>

      public static void PlayVictorySound()
      {
      Play(Sounds.Victory);
      }

      /// <summary>
      /// هنا يتم وضع تأثير انفجار للصوت
      /// </summary>

      public static void PlayExplosionSound()
      {
      Play(Sounds.Explosion);
      }



      /// <summary>
      /// من هنا يتم وضع تشغيل الموسيقى للعبة
      /// </summary>

      public static void StartMusic()
      {
      Play(Sounds.GameMusic);
      }

      /// <summary>
      /// هنا يتم ايقاف صوت الموسيقى
      /// </summary>

      public static void StopMusic()
      {
      musicCategory.Stop(AudioStopOptions.Immediate);
      }



      /// <summary>
      /// عمل ابديت للصوت عند التحديث لكل ثانية
      /// </summary>

      public static void Update()
      {
      if (audioEngine != null)
      audioEngine.Update();
      }

      /// <summary>
      /// gamepad تجربة الصوت الأبتدائي عند الضغط في التحكمات الكيبورد والماوس ان وجد
      /// </summary>

      public static void TestPlaySounds()
      {
      TestGame.Start(
      delegate
      {
      if (Input.MouseLeftButtonJustPressed ||
      Input.GamePadAJustPressed)
      Sound.Play(Sounds.Defeat);
      else if (Input.MouseRightButtonJustPressed ||
      Input.GamePadBJustPressed)
      Sound.Play(Sounds.Victory);
      else if (Input.KeyboardKeyJustPressed(Keys.D1))
      Sound.Play(Sounds.GameMusic);
      else if (Input.KeyboardKeyJustPressed(Keys.D2))
      Sound.Play(Sounds.EnemyShoot);
      else if (Input.KeyboardKeyJustPressed(Keys.D3))
      Sound.Play(Sounds.Explosion);
      else if (Input.KeyboardKeyJustPressed(Keys.D4))
      Sound.Play(Sounds.Health);
      else if (Input.KeyboardKeyJustPressed(Keys.D5))
      Sound.Play(Sounds.PlasmaShoot);
      else if (Input.KeyboardKeyJustPressed(Keys.D6))
      Sound.Play(Sounds.MgShoot);
      else if (Input.KeyboardKeyJustPressed(Keys.D7))
      Sound.Play(Sounds.GattlingShoot);
      else if (Input.KeyboardKeyJustPressed(Keys.D8))
      Sound.Play(Sounds.EMP);
      else if (Input.KeyboardKeyJustPressed(Keys.D9))
      Sound.Play(Sounds.Click);
      else if (Input.KeyboardKeyJustPressed(Keys.D0))
      Sound.Play(Sounds.Highlight);
      //موضع اماكن الضغط في التحكمات
      TextureFont.WriteText(2, 30,
      "Press 1-0 or A/B or left/right mouse buttons to play back " +
      "sounds!");
      });
      }
      }
      }

      -------------------------------------------------------------------------
      ملاحظة هامة :
      لقد وضعت الشرح هكذا لحفاظاً على التنسيق اذا كنت تريد ان تعمل نسخ ولصق الكود لتجربته لكي لا تظهر عندك أخطاء تذكر ....
      حاول ذلك وسوف ترى النتيجة جيدة عند لصقها في البرمجة المحرك xna


      تابعوا معنا الدرس القادم عما قريب ان شاء الله

      تعليق


      • #4
        الدرس رائع و جزاك الله خيرا
        Egypt


        I Love Direct-X

        سبحان الله و بحمده سبحان الله العظيم
        اللهم صلي وسلم و بارك علي سيدنا محمد

        تعليق


        • #5
          شكراً يا اخي على الدرس
          يقال ان العباس رضي الله عنه فقد بصره في اخر حياته
          فقال:
          ان ياخذ الله من عيني نورهما فان قلبي مضئ مابه ضرر
          ارى بقلبي دنياي واخرتي والقلب يبصر مالا يبصرالبصر.


          " عضو في نادي محبي البطاطا "



          ما أجمل المنابر بدون أطراف الحديث كم من الأخوة خسرناهم بسببه
          غائب للابد
          امحو ذنوبك في دقيقتين
          http://www.shbab1.com/2minutes.htm

          تعليق


          • #6
            الدرس الثالث :
            مرحبا أخواني في هذا الدرس نتعلم بالتفصيل أكثر مما سبق لتعميق الفكرة أكثر وأوضح ....
            بسم الله نبدأ /
            عند كتابة الكلاس للعبة يجب ان تحتوي على جملة namespace على اسم اللعبة , يمكن ان نعرف المتغيرات الذي نريد ان تكون مرئية امامك في الكود الحالي في بداية الكلاس توجد مولدات للكلاس بشكل آلي باسم procesdures الذي تكون داخل كلاس اللعبة وهي Game1.cs ويعرف بـــ:

            public class Game1 : Microsoft.Xna.Framework.Game
            {
            GraphicsDeviceManager graphics;
            ContentManager content ;

            private SpriteBatch spriteBatch;
            private Texture2D tiledSprite;
            مثال على ذلك اذا كنت تريد تحميل صورة معينة ستحتاج كائنين معرفين ضمن xna الأول Texture2D
            سنستعمله لكي نحمل الصورة الذي تحوي Sprites الكائن الثاني هو spritebatch الذي يتحكم بعرض الـsprites للصور , ثم نبدء بالتعريف الكلاس في الجزء المخصص للتعريفات الكائن والمتغير
            بعد تعريف الكلاس يتم حجز ذاكرة له او الأعلان عنه في الأمر :
            protected override void Initialize()
            {
            // TODO: Add your initialization logic here
            spriteBatch = new SpriteBatch(graphics.GraphicsDevice);
            والسطر اعلاه سيؤدي الى تنفيذ Constructor للكلاس spritebatch ليجعل المتغير spritebatch مسؤولاً عن عرض السبريتات

            سيتم رسم الصورة في draw المخصص لذلك
            protected override void Draw(GameTime gameTime)
            {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            // TODO: Add your drawing code here
            spriteBatch.Begin();
            spriteBatch.Draw(tiledSprite, new Rectangle(0, 0, 512,512),
            Color.White);
            spriteBatch.End();
            base.Draw(gameTime);
            }
            صيغة الأمر draw لـ spritebatch يأخذ الأمر كوسيط أول , و الأمر rectangle كوسيط ثاني حيث يمثل المكان الذي للصور ان تظهر به وهو الأحداثي 0,0 والطول والعرض الذي نريد للصورة ان تظهر كاملة بالأحداثي 512,512 اعلاه

            وهذا مثال مبسط وان شاء الله نشرح المزيد منه في الدروس القادمة ...........

            بعد ذلك يتم تكوين كلاس للعبة وهي instance
            public Game1()
            {
            graphics = new GraphicsDeviceManager(this);
            content = new ContentManager(Services);
            }

            وهذا procedures سنتفذ كل الجمل به وعند البدء ترى يتم تكوين جملتين متولدتين من قبل #C
            وفي السطر الأول ترى كلمة DEVICE MANAGER تسند الى المتغير من نوع GraphicsDeviceManager وهو أصلاً كلاس مبرمج من قبل #C وهو يقوم بعمل تحديد بأبعاد الشاشة وغيرها .
            اما بالنسبة content manager وهو لغرض الترتيب بين العناصر بمعنى مختصر اذا كنت تحميل صورة معينة داخل اللعبة وهذا الأمر ستقوم بأستدعاء ملف الصورة من خلال هذا الكود ونفس الشئ لكل الصور والمجسمات والأصوات تقوم بتحميلها داخل solution explorer ويقوم XNA بدمجها في المشروع وأعطائها كود معين ......

            والأن الى جملة Initialize وهي ان تقوم بشحن مكونات اللعبة او أعطائها قيمة أولية
            protected override void Initialize()
            {
            // TODO: Add your initialization logic here
            base.Initialize();
            }

            والآن الى الأمر LoadContent وهو يقوم بتحميل الصور والمجسمات والأصوات وغيرها
            protected override void LoadContent()

            {
            // TODO: Load any content

            }

            والأمر الأخر هو unloadContent وهو يقوم بتفريغ الذاكرة من مكونات اللعبة الصور والأصوات والمجسمات
            protected override void UnloadContent()

            {
            // TODO: Unload any content
            content.Unload();
            }

            الأمر update gametime وهو ادخال قيم متغيرات معينة مثل اعطاء المجسم احداثيات س وص x,y وفيه وضع التحكمات للماوس والكيبورد والجويستيك
            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);
            }


            الأمر Draw وهو يتم رسم العناصر المطلوبة من تأثيرات ومجسمات وغيرها
            والأمر graphics.GraphicsDevice.Clear(Color.CornflowerBlue يوجه أمر معين الى كرت الشاشة لمسح الشاشة باللون الأزرق ويعطيك #C اوامر جاهزة للألوان المدموجة معه وهو color وهي خاصية auto Complete ,وهي خاصية رائعة جداً تساعدك على التذكير الألى وهي تفيد المبرمجين بشكل خاص لتنفيذ أوامرهم بسرعة بدون تذكر من المبرمج .....
            protected override void Draw(GameTime gameTime)
            {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            // هنا يتم اضافة الكود
            // TODO: Add your drawing code here
            base.Draw(gameTime);
            }




            تعليق


            • #7
              وأخيرا واحد يساعد جنرال 1 لنشر الـ xna وتعلم مبادئه
              سبحان الله وبحمده * سبحان الله العظيم

              تعليق


              • #8
                بصراحة...

                ما فهمت شيء...

                لو تكتبه لي في الوورد أو pdf أكون شاكر

                لأني صدق ما فهمت شي
                Back to Game Developing

                تعليق


                • #9
                  عذراً أخي Virtools

                  لقد تم اعداد هذه الدروس بطريقة مطورة وسريعة للمحترفين فقط

                  ابقوا معنا في نزول الكتاب الجديد لتعليم xna

                  تعليق


                  • #10
                    مثل ما تبي اخوي



                    موفق وانتظر الدروس
                    Back to Game Developing

                    تعليق


                    • #11
                      بارك الله فيك الدرس من النظرة الأولى السريعة سهل نوعاً ما والكود ............ أقراءه بالتفصيل ثم اوفيك بالنتائج

                      شكراً لك ولكتاب xna ^_^

                      تعليق


                      • #12
                        ممتاز الله يوفق مع اني عملت علي xna علي العاب 2d ولكن هناك برامج تتعامل مع ال 3d اقوي منها مثل اليونتي
                        لعبة المقاومة الفلسطينيه بستخدام Uinty 3d




                        تعليق


                        • #13
                          جزاك الله كل خير يا غالي
                          ولكن ارجح عمل الدروس فى كتاب pdf او جمعها فى ملف doc افضل
                          حتى يكون الموضوع بشكل افضل

                          تعليق


                          • #14
                            شكرا على مجهودك

                            مع تحياتى
                            عميد المبرمجين العرب سابقا

                            تعليق

                            يعمل...
                            X