الشبكة العربية لمطوري الألعاب

مفصول عمر سمير  مشاركة 1

سؤال للسيد وسام البهنسي
بعد  جدل واسع حول اعلان Microsoft  عن اصدار أخير عن اللغة البرمجة الرائعة XNA  3.0
بدأت من البداية تعلم لغة XNA   من الصفر  حتى وصلت مرحلة متقدمة
بدأت أصنع اشياء بسيطة 2D   ونجحت في عمل برمجة متكاملة
ولكن عندما برمجت 3D  ظهرت لي أخطاء برمجية  بعضها  عالجت حلها وبعضها  لم أقدر  على حلها
يقول لي ان  اصدار الصور  من مصدر ثاني غير معروف 
لكني اعطيت البرمجة حقها  كاملاً كتابة المتغيرات و مكان الصور والشيدر وFX   ومجسمات معمولة ب FBX  
وعلماً بأن معلومات المصدر للبرمجة الرئيسية مأخوذة من تجربة سابقة وناجحة  تسمى PipelineComponent With XNA
جربت المشروع  واعطني النتيجة ناجحة  بدون اي اخطاء برمجية تذكر 
ونقلت المشروع  باسم أخر  وعدلت عليه بعض التغيرات مع أضافة مكونات أخرى من تصميمي  مثل الغيوم والضباب والهياكل وأضافة الفيزك للسيارات والتصادمات للمجسمات  الأخرى  بدون اي أخطاء  والنتيجة النهائية  حصلت عليها  رائعة جداً 
ولكن الشئ الذي لم أفهمه هو لا يقبل من مستورد أخر  وهو  XNB

الملف المرفق حجمه كبير  سوف اعمله على موقع اخر upload  انتظر منى ذلك 
وهذا  جزء من المشروع  الذي صممته 
وهو عبارة عن سيارة  ذكية  تتحرك بشكل فيزيائي  صممتها بنفسي  عن طريق Physic X  

#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
#endregion

namespace Car_Drift_OSF
{
    /// 
    /// This is a game component that implements IUpdateable.
    /// 
    public partial class AudiComponent : Microsoft.Xna.Framework.DrawableGameComponent
    {
        public Model model;
        public Vector3 modelPosition;
        public Vector3 modelVelocity;
        public float modelRotationY;
        public ICamera camera;

        public AudiComponent(Demo game)
            : base(game)
        {
            // TODO: Construct any child components here
        }


        /// 
        /// Allows the game component to perform any initialization it needs to before starting
        /// to run.  This is where it can query for any required services and load content.
        /// 
        public override void Initialize()
        {
            model = Demo.content.Load("Content\\Models\\audi");

            base.Initialize();
        }


        /// 
        /// Allows the game component to update itself.
        /// 
        /// Provides a snapshot of timing values.
        public override void Update(GameTime gameTime)
        {
            // TODO: Add your update code here
            UpdateInput();
            modelPosition += modelVelocity;

            modelVelocity *= 0.95f;
            base.Update(gameTime);
        }
        private void UpdateInput()
        {
            GamePadState currentGamePadState = GamePad.GetState(PlayerIndex.One);
            KeyboardState keyb = Keyboard.GetState();
            if (currentGamePadState.IsConnected)
            {
                if (Math.Abs(modelVelocity.X) > 40 || Math.Abs(modelVelocity.Z) > 40)
                    modelRotationY -= currentGamePadState.ThumbSticks.Left.X * 0.02f;

                Vector3 modelVelocityAdd = Vector3.Zero;
                modelVelocityAdd.X = -(float)Math.Sin(modelRotationY);
                modelVelocityAdd.Z = -(float)Math.Cos(modelRotationY);

                modelVelocityAdd *= (currentGamePadState.Triggers.Right * 10);

                modelVelocity += modelVelocityAdd;

                //GamePad.SetVibration(PlayerIndex.One, currentGamePadState.Triggers.Right,
                //        currentGamePadState.Triggers.Right);

                //Reset
                if (currentGamePadState.Buttons.Start == ButtonState.Pressed)
                    modelPosition = new Vector3(0, 800, 10000); 

                // Allows the default game to exit on Xbox 360 and Windows
                if (currentGamePadState.Buttons.Back == ButtonState.Pressed)
                    Game.Exit();
            }
            else
            {
                if (Math.Abs(modelVelocity.X) > 120 || Math.Abs(modelVelocity.Z) > 110)
                {
                    if (keyb.IsKeyDown(Keys.Left))
                        modelRotationY += 0.1f;
                    else
                    {
                        Vector3 modelVelocityAdd = Vector3.Zero;
                        modelVelocityAdd.X = -(float)Math.Sin(modelRotationY);
                        modelVelocityAdd.Z = -(float)Math.Cos(modelRotationY);
                        modelVelocityAdd *= 50f;

                        modelVelocity += modelVelocityAdd;
                    }


                    if (keyb.IsKeyDown(Keys.Right))
                        modelRotationY -= 0.1f;
                    else
                    {
                        Vector3 modelVelocityAdd = Vector3.Zero;
                        modelVelocityAdd.X = +(float)Math.Sin(modelRotationY);
                        modelVelocityAdd.Z = +(float)Math.Cos(modelRotationY);
                        modelVelocityAdd *= 20f;

                        modelVelocity -= modelVelocityAdd;
                    }


                }

                if (keyb.IsKeyDown(Keys.Up))
                {
                    Vector3 modelVelocityAdd = Vector3.Zero;
                    modelVelocityAdd.X = -(float)Math.Sin(modelRotationY);
                    modelVelocityAdd.Z = -(float)Math.Cos(modelRotationY);
                    modelVelocityAdd *= 20f;

                    modelVelocity += modelVelocityAdd;
                }

                if(keyb.IsKeyDown(Keys.R))
                    modelPosition = new Vector3(0, 800, 10000);

                if (keyb.IsKeyDown(Keys.Escape))
                    Game.Exit();
            }
        }

        public override void Draw(GameTime gameTime)
        {
            Matrix[] transforms = new Matrix[model.Bones.Count];
            model.CopyAbsoluteBoneTransformsTo(transforms);

            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
                    effect.World = transforms[mesh.ParentBone.Index]
                            * Matrix.CreateRotationY(modelRotationY + MathHelper.Pi)
                            * Matrix.CreateTranslation(modelPosition);

                    effect.View = camera.View;
                    effect.Projection = camera.Projection;
                }
                mesh.Draw();
            }
        }
    }
}


#region Using Statements
using System;
using System.Collections.Generic;
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;
#endregion

namespace Car_Drift_OSF
{
    /// 
    /// This is the main type for your game
    /// 
    public class Demo : Microsoft.Xna.Framework.Game
    {
        public static GraphicsDeviceManager graphics;
        public static ContentManager content;
        private ReplayCamera camera;
        FloorComponent floor;
        AudiComponent audi;

        public Demo()
        {
            graphics = new GraphicsDeviceManager(this);
            content = new ContentManager(Services);
        }

        /// 
        /// 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.
        /// 
        protected override void Initialize()
        {
            camera = new ReplayCamera(this);
            camera.CameraPosition = new Vector3(0, 5000, 0);

            floor = new FloorComponent(this);
            floor.camera = camera;

            audi = new AudiComponent(this);
            audi.modelPosition = new Vector3(0, 800, 10000);
            audi.camera = camera;

            this.Components.Add(camera);
            this.Components.Add(floor);
            this.Components.Add(audi);

            this.Window.Title = "Car Physic Dynamic Animation With Programming OSF ";
            base.Initialize();
        }


        /// 
        /// Load your graphics content.  If loadAllContent is true, you should
        /// load content from both ResourceManagementMode pools.  Otherwise, just
        /// load ResourceManagementMode.Manual content.
        /// 
        /// Which type of content to load.
        protected override void LoadGraphicsContent(bool loadAllContent)
        {
            if (loadAllContent)
            {

            }

            // TODO: Load any ResourceManagementMode.Manual content
        }


        /// 
        /// Unload your graphics content.  If unloadAllContent is true, you should
        /// unload content from both ResourceManagementMode pools.  Otherwise, just
        /// unload ResourceManagementMode.Manual content.  Manual content will get
        /// Disposed by the GraphicsDevice during a Reset.
        /// 
        /// Which type of content to unload.
        protected override void UnloadGraphicsContent(bool unloadAllContent)
        {
            if (unloadAllContent == true)
            {
                content.Unload();
            }
        }


        /// 
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input and playing audio.
        /// 
        /// Provides a snapshot of timing values.
        protected override void Update(GameTime gameTime)
        {
            camera.CameraLookat = audi.modelPosition;

            base.Update(gameTime);
        }


        /// 
        /// This is called when the game should draw itself.
        /// 
        /// Provides a snapshot of timing values.
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }
    }
}



#region Using Statements
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
#endregion

namespace Car_Drift_OSF
{
    /// 
    /// This is a game component that implements IUpdateable.
    /// 
    public partial class FloorComponent : Microsoft.Xna.Framework.DrawableGameComponent
    {
        public Model model;
        public ICamera camera;

        public FloorComponent(Demo game)
            : base(game)
        {
            // TODO: Construct any child components here
        }

        protected override void LoadGraphicsContent(bool loadAllContent)
        {
            model = Demo.content.Load("Content\\Models\\floor");
        }

        /// 
        /// Allows the game component to perform any initialization it needs to before starting
        /// to run.  This is where it can query for any required services and load content.
        /// 
        public override void Initialize()
        {
            // TODO: Add your initialization code here

            base.Initialize();
        }


        /// 
        /// Allows the game component to update itself.
        /// 
        /// Provides a snapshot of timing values.
        public override void Update(GameTime gameTime)
        {
            // TODO: Add your update code here

            base.Update(gameTime);
        }

        public override void Draw(GameTime gameTime)
        {
            Matrix[] transforms = new Matrix[model.Bones.Count];
            model.CopyAbsoluteBoneTransformsTo(transforms);

            foreach (ModelMesh mesh in model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.EnableDefaultLighting();
                    effect.World = transforms[mesh.ParentBone.Index];

                    effect.View = camera.View;
                    effect.Projection = camera.Projection;
                }
                mesh.Draw();
            }
        }
    }
}

المشروع كامل سوف ارسله لك عما قريب 
ارجو ان يعجبك انجازي للفيزك Physic X

OSF متخصص محترف

خبير مدير وسام البهنسي مشاركة 2

أهلاً وسهلاً بك يا عمر،
 
ما شاء الله سعدت جداً بسماع الإنجازات التي حققتها في برمجة الألعاب مع نظام XNA. لقد قرأت الكود المرفق وهو مثير للاهتمام
(أعجبني استخدام اسم الكلاس AudiComponent 😄 )
 
الكود بسيط وواضح وأدعو الجميع للاطلاع عليه ومحاولة فهمه. وأنتظر منك يا عمر رفع الملف كي نستطيع الاستمتاع بثمرة مجهودك ☺
 
عن سؤالك المطروح في عنوان الموضوع، فإن XNA في النهاية يكتبه بشر، والكمال لله وحده، لذلك لا غرابة في أن تواجه أخطاء في برمجة النظام الداخلية. على كل يمكنك أن ترسل مثالاً تظهر به المشكلة وسأقوم أنا أو أي من أعضاء الشبكة الأعزاء بالتجريب ومحاولة تصحيح الخطأ إن أمكن.
 
هل تقوم بتطوير اللعبة على الـ PC أم على الإكس بوكس 360؟

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مفصول عمر سمير  مشاركة 3

أخي الحبيب :

هذا هو المشروع  ولكن ليس كاملاً 
يوجد فيه أخطاء بسيطة  ان وجدت
ولكن  الملف يعمل 100%

ارجو أعطاء رأيك  في المشروع   ورأي جميع الأعضاء  ورئيس المنتدى
قبل فتح الملف  يجب تنزيل الرئيسيات  وهي :
Microsoft Visual  Studio  2008   Pro.
يتضمن فيه  Visual C# 2008
Microsoft  XNA  3.0 
FRAME WORK  3.5

تم تطويره على PC   AND  XBOX360

OSF متخصص محترف

خبير مدير وسام البهنسي مشاركة 5

وفي 03 مارس 2009 06:17 ص، قال عمر متحمساً:

هذا هو المشروع  ولكن ليس كاملاً 
يوجد فيه أخطاء بسيطة  ان وجدت

ظهرت لي تحذيرات أثناء بناء المشروع، وهي ليست بالخطيرة، ويمكنك معالجتها بسهولة بالغة.
 
التحذير الأول يظهر أثناء بناء موارد اللعبة، ويقول أن ملفات الصور قد تم بناؤها أكثر من مرة لكن بإعدادات مختلفة في كل مرة.
السبب في ظهور هذا التحذير هو أنه عند بناء مجسم السيارة فإنه تلقائياً يقوم بسحب ملفات الإكساءات وبنائها مع المجسم كي يظهر بشكل صحيح. إلا أنك ومع ذلك، فقد أضفت ملفات الصور إلى المشروع ليتم بناؤها بشكل منفصل، وهو أمر لا لزوم له. لذلك للتخلص من هذا التحذير ما عليك سوى انتقاء ملفي الصور في المشروع والضغط بالزر اليمين للفأرة واختيار أمر الاستبعاد من المشروع (Exclude From Project).
 
التحذيرات المتبقية تظهر أثناء بناء الكود، وهي تقول أنك قد قمت بتعريف إجراءات سيتم إزالتها من النسخة القادمة من XNA. هذه الإجراءات هي LoadGraphicsContent و UnloadGraphicsContent.
الحل هو استبدال أسماء هذه الإجراءات بالأسماء الجديدة لها وهي LoadContent و UnloadContent على الترتيب (لاحظ أن المعطى unloadAllContent قد تمت إزالته في هذه الإجراءات الجديدة).
 
بعد حل هذه التحذيرات ستستطيع بناء المشروع بشكل نظيف دون أي خطأ أو تحذير  ☺ .
 
 
الآن إلى الجزء الممتع من اللعبة. لقد جربت اللعبة على جهازي وهي تعمل بشكل جيد. الفيزياء بسيطة حالياً، وتستطيع أن تطورها أكثر كي تصبح اللعبة أكثر إمتاعاً وإقناعاً. 😄
 
إلا أنني أود أن أذكر مشكلة في الفيزياء جعلتني أحس بعد الارتياح 😒 . عندما تريد فتل السيارة، فإنك لا تستطيع ذلك إلا بعد أن تكتسب حد أدنى من السرعة. المشكلة أنه حالما تحقق الحد الأدنى فإن السيارة تبدأ بالفتل بطريقة مفاجئة.
 
لرؤية المشكلة بوضوح، استخدم مقبض Xbox360 وابدأ بزيادة السرعة رويداً رويداً وأنت تحاول التحرك يمنة أو يسرة. أعتقد أن إمكانية الفتل يجب أن ترتبط بشكل سلس مع السرعة وليس بعتبة حادة كما هو الوضع الآن. 😖
 
هذا بالنسبة لي، ولا أعلم ما رأي بقية الأعضاء أيضاً...
 
شكراً على هذا الجهد أخي عمر وبانتظار النسخة الثانية المحسنة باذن الله ☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مفصول عمر سمير  مشاركة 6

أود ان أشكرك أخي وسام  على معروفك معي

لقد تنبهت من التحذير  الذي وقعت فيه كل مرة , سوف أحل مشاكل حسب رأيك

وان شاء الله  سوف أطور عملي أكثر  وأخذ بنصيحتك 
دائماً  كون معنا  في مساعدتنا  للبرمجة XNA 

وأعتبرك المثال الأعلى  لنا جميعاً 

وسوف  أعطيك أكواد  لقد برمجتها  ولكن فيها فجوات غير معلومة 
من كثر التعليمات البرمجية  راودتني  فكرة  وهي :
تجميع  أفكار  وابتكار  الكود  عن طريق pipeline Component
واضافتها للبرمجتنا وتحسينيها  وتطويرها على النحو المطلوب 
واختيار الأنسب حسب الفكرة المبنية عليها
وتأثيرها على باقي المكونات  البرمجية  المتصلة ببعضها (( لها تأثير خاص  وقوي  تجعلك تطورها الى ابعد مدى حسب مخيلتك ))

OSF متخصص محترف