سؤال

لدي القليل من اللعبة مكتوب في C#.ويستخدم قاعدة بيانات النهاية الخلفية.انها a لعبة بطاقة تجارية, و أردت لتنفيذ وظيفة البطاقات النصي.

ما أعنيه هو أنني أساسا يكون واجهة ، ICard, التي بطاقة فئة تنفذ (public class Card056: ICard) و الذي يحتوي على الدالة التي يتم استدعاؤها من قبل اللعبة.

الآن لجعل شيء للصيانة/moddable ، أود أن يكون فئة لكل بطاقة التعليمات البرمجية المصدر في قاعدة البيانات أساسا ترجمة ذلك على أول استخدام.حتى عندما لا بد لي من إضافة/تغيير بطاقة, أنا مجرد إضافته إلى قاعدة البيانات و أقول بلدي التطبيق لتحديث, دون الحاجة إلى أي جمعية النشر (خصوصا أننا سوف يكون الحديث عن الجمعية 1 لكل بطاقة مما يعني مئات الجمعيات).

هل هذا ممكن ؟ تسجيل فئة من مصدر الملف ثم مثيل ، إلخ.

ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);

لغة C# ولكن مكافأة اضافية إذا كان من الممكن أن كتابة السيناريو في أي .صافي اللغة.

هل كانت مفيدة؟

المحلول

أوليغ شيلو C# النصي الحل (في رمز المشروع) حقا هو مقدمة كبيرة لتوفير النصي قدراتهم في التطبيق الخاص بك.

نهج مختلف النظر في اللغة التي بنيت خصيصا البرمجة مثل IronRuby, IronPython, أو لوا.

IronPython و IronRuby على حد سواء المتاحة اليوم.

دليل على تضمين IronPython قراءة كيفية تضمين IronPython النصي في القائمة التطبيق في 10 خطوات سهلة.

لوا هي لغة البرمجة المستخدمة عادة في الألعاب.هناك لوا مترجم .صافي المتاحة من CodePlex -- http://www.codeplex.com/Nua

أن تعليمات البرمجة الأساسية هي قراءة كبيرة إذا كنت تريد أن تعلم عن بناء المترجم في .صافي.

زاوية مختلفة تماما هو محاولة PowerShell.هناك العديد من الأمثلة على التضمين PowerShell في تطبيق -- هنا شامل المشروع على هذا الموضوع:Powershell النفق

نصائح أخرى

كنت قد تكون قادرة على استخدام IronRuby على ذلك.

خلاف ذلك أود أن أقترح عليك أن يكون الدليل حيث قمت بوضع precompiled الجمعيات.ثم هل يمكن أن يكون مرجعا في DB إلى الجمعية العامة ، واستخدام التفكير أن الحمل السليم الجمعيات في وقت التشغيل.

إذا كنت تريد حقا أن جمع في وقت التشغيل هل يمكن استخدام CodeDOM, ثم يمكنك استخدام التفكير أن الحمل الديناميكي الجمعية. وثائق Microsoft المادة التي قد تساعد.

إذا كنت لا ترغب في استخدام DLR يمكنك استخدام بو (الذي مترجم) أو يمكنك أن تنظر في على Script.NET (S) المشروع على CodePlex.مع بو الحل يمكنك أن تختار بين النصوص المترجمة أو استخدام مترجم ، و بو يجعل لطيفة لغة البرمجة, يحتوي على جملة مرنة و الموسعة اللغة عن طريق فتح مترجم العمارة.Script.NET تبدو لطيفة جدا ، على الرغم من أنك يمكن أن تمتد بسهولة أن اللغة فضلا عن مشروع مفتوح المصدر و يستخدم ودية للغاية مترجم مولد (Irony.net).

هل يمكن استخدام أي من DLR اللغات التي توفر وسيلة حقا بسهولة المضيف الخاص بك البرمجة منصة.ومع ذلك, لم يكن لديك إلى استخدام لغة البرمجة لهذا.هل يمكن استخدام C# و تجميع مع C# رمز موفر.طالما يمكنك تحميله في مجال التطبيق, يمكنك تحميل وتفريغ إلى ومضمون قلبك.

أقترح استخدام LuaInterface كما نفذت بالكامل لوا حيث يبدو أن Nua ليست كاملة و من المرجح أن لا تنفيذ بعض وظائف مفيدة (coroutines ، إلخ).

إذا كنت ترغب في استخدام بعض من خارج المعبأة لوا وحدات, كنت اقترح استخدام شيء على غرار 1.5.x بدلا من 2.سلسلة x يبني تماما التعليمات البرمجية المدارة و لا تعرض اللازمة C API.

أنا باستخدام LuaInterface1.3 + لوا 5.0 ل صافي 1.1 التطبيق.

المشكلة مع بو هو أنه في كل مرة كنت تحليل/ترجمة/eval التعليمات البرمجية الخاصة بك على الطاير ، فإنه يخلق مجموعة من بو الطبقات لذلك سوف تحصل على تسرب الذاكرة.

لوا في ناحية أخرى, لا تفعل ذلك, حتى انها جدا جدا مستقر ويعمل رائعة (يمكن تمرير الكائنات من C# لوا الخلف).

حتى الآن أنا لم أضعها في همز بعد ولكن يبدو واعدا جدا.

وقد فعلت تسرب الذاكرة القضايا في همز باستخدام LuaInterface + لوا 5.0, ولذلك اعتدت لوا 5.2 وربطها مباشرة في C# مع DllImport. تسرب الذاكرة كانوا داخل LuaInterface المكتبة.

لوا 5.2:من http://luabinaries.sourceforge.net و http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

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

التطبيق الرئيسي قسمي تبيع يفعل شيء مشابه جدا لتوفير العميل تخصيصات (مما يعني أنني لا أستطيع نشر أي المصدر).لدينا C# تطبيق الأحمال الديناميكية VB.NET البرامج النصية (على الرغم من أن أي .صافي اللغة يمكن أن يكون بسهولة المدعومة - VB تم اختياره لأن التخصيص جاء فريق من ASP الخلفية).

باستخدام .صافي CodeDom نحن تجميع البرامج النصية من قاعدة البيانات باستخدام VB CodeDomProvider (مزعج الافتراضي .صافي 2 إذا كنت ترغب في دعم 3.5 الميزات تحتاج إلى تمرير القاموس مع "CompilerVersion" = "v3.5" إلى منشئ).استخدام CodeDomProvider.CompileAssemblyFromSource طريقة تجميع (يمكنك تمرير إعدادات قوة لها ترجمة في الذاكرة فقط.

هذا من شأنه أن يؤدي إلى مئات الجمعيات في الذاكرة, ولكن هل يمكن وضع جميع الطبقات الحيوية' رمز معا في مجلس واحد ، ترجمة الكثير عند أي تغيير.هذا له ميزة أنه يمكنك إضافة العلم إلى ترجمة على القرص PDB لأنه عندما كنت الاختبار, مما يسمح لك لتصحيح خلال رمز الحيوي.

نعم, لقد فكرت في ذلك, لكنني سرعان ما اكتشفت أن مجال آخر-محددة-اللغة (DSL) من شأنه أن يكون قليلا أكثر من اللازم.

أساسا, أنهم بحاجة إلى التفاعل مع gamestate في ربما بطرق غير متوقعة.على سبيل المثال, بطاقة يمكن أن يكون قاعدة "عند هذه بطاقات دخول تلعب جميع التوابع أوندد اكتساب +3 هجوم ضد أعداء تحلق إلا عندما يكون العدو هو مبارك".كما تداول بطاقة الألعاب هي بدورها القائم ، GameState مدير النار OnStageX الأحداث والسماح بطاقات تعديل بطاقات أخرى أو GameState بأي طريقة بطاقة الاحتياجات.

إذا حاولت إنشاء DSL لدي لتنفيذ كبيرة بدلا من ذلك مجموعة ميزة وربما تحديث باستمرار الأمر الذي يحول أعمال الصيانة إلى جزء آخر في الواقع دون إزالته.

هذا هو السبب في أنني أرغب في البقاء مع "ريال مدريد" .صافي اللغة أساسا أن يكون قادرا على النار الحدث والسماح بطاقة التلاعب gamestate في أي حال من الأحوال (في حدود أمان الوصول إلى التعليمات البرمجية).

النسخة القادمة من .صافي (5.0?) وقد كان هناك الكثير من الحديث عن فتح "مترجم كخدمة" التي من شأنها أن تجعل الأشياء مثل المباشرة النصي تقييم ممكن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top