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

مبتدئ  بلال بوزيــــــــاني مشاركة 1

السلام عليكم
 
وحدة كتابة النصوص باللغة العربية:
   - تحديد الخط (من نوع TTF مسجل في ويندوز)
   - تحديد خواص الخط (لون، حجم)
   - رسم نص على الشاشة بدءاً من إحداثيات معينة (x,y)
 
شكرا لك  الاخ وسام ,   قرأت موضوع  الاخ الشمري بارك الله فيه و فهمت المشاكل المتعلقة بالموضوع   وفهمت بعض الحلول  التي طرحها الاخوة نوعا ما.
 
الان  احوال فهم الكود الذي طرحته انت و الذي اعاد كتابته الاخ الشمري ب ++C   محاولا اعادت كتابته  من ++CLI /C  الى  #C  لفهمه.
 
أخوكم بلال.

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

بتاريخ 18/جمادى الثانية/1431 03:03 م، قطب بلال بوزيــــــــاني حاجبيه بشدة وهو يقول:

الان  احوال فهم الكود الذي طرحته انت و الذي اعاد كتابته الاخ الشمري ب ++C   محاولا اعادت كتابته  من ++CLI /C  الى  #C  لفهمه.

ممكن أيضاً بناء مكتبة أصناف NET. تحتوي الكود بالـ C++/CLI كما هو، ونستخدمها في مشروع الـ XNA مباشرة. إن احتجت مساعدة في ذلك نحن جاهزون.

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

مبتدئ  بلال بوزيــــــــاني مشاركة 3

السلام عليكم
 
بدأت العمل و لله الحمد , طبعا و اجهت مشاكل  و فهمت امور كثيرة كانت غائبت سوف اذكرها  و سوف أترك لكم التعليق.
 
-اولا ما فهمته  حسب ما قرأت من الموضوع الذي طرحه الاخ الشمري و ناقشوه في ذلك اخرون أن هناك حلين  لهذه المشكلة وهي الكتابة بالخط العربي
في XNA ,DirectX و غير ذلك...
 
-1 تصميم وحدة كتابة خط عربي من الصفر بحث هذه الوحدة تقوم برسم الحروف رسما ان صح هذا التعبير و هو ما يقوم به  نضام التشغيل OS  ,طبعا قوة هذا الحل هو صناعة وحدة مستقلة عن  نضام التشغيل , الا ان تصميم  هذه الوحدة ليس بالامر الهين  كما فصل الاخوة .
 
-2 الحل الثاني هو تصميم وحدة تستعمل مكتبة الرسم نضام التشغيل  +GDI مثلا بالنسبة لل Windows  ,اي مسؤلية رسم الخط تترك ل OS  , يعني نستعمل +GDI  لترسم في Bitmap ( كأنه  buffer) ثم تنسخ ما في Bitmap  الي ذاكرة او  سطح يستعملها محرك 3D ليصيرها في الاخير. هذا الحل اسهل من الاول الا ان عيبه حسب فهمي انه غير مستقل عن OS .
 
طبعا ان استعل الان الحل الثاني
 
-


في 31 مايو 2010 09:49 م، عقد وسام البهنسي حاجبيه بتفكير وقال:

ممكن أيضاً بناء مكتبة أصناف NET. تحتوي الكود بالـ C++/CLI كما هو، ونستخدمها في مشروع الـ XNA مباشرة. إن احتجت مساعدة في ذلك نحن جاهزون.

 الان بدأت في كتابة الوحدة ب #C  مبدئيا لعدم علمي ب C++/CLI لكن لا ضير من تعلم هذا الاخير ,  الوحدة حاليا  تعمل و تمكنك من الكتابة بالعربة الا انها تحتاج الى ارائكم و خبرتكم.الوحدة ليست كاملة , فهذا حل مبدئي  يحتاج الكثير من نصائحكم.(الكود في المرفقات) 
 
 - الافكار المستعملة :
 
1-  لم اجد في XNA  ما يوافق Surface فستعملت Texture2D
 
2- طريقة استعمال الوحدة كما يلي : انشاء كائن من الصنف XnaArabicTextRender  ممررا الكائن spriteBatch ثم ما عليك الا منادات  المنهج DrawString من الكائن الذي أنشأته ممررا Text , Font ,FontSize ,Color و Position (طبعا تكون المنادات ما بين Begin و End لل spriteBatch)
 
3- كل الاصناف التي تمرر  هي أصناف XNA و عدم اظهار أصناف مثل أصناف +GDI و غير ذلك
 
4- يكون انشاء Bitmap موافقا لعدد البكسيلات للنص المدخل اي لا افترض قيمة قصوى لاطول و العرض بالنسبة لل Bitmap و يتالي يعاد انشاؤه ان كبر حجم النص والا يبقى استعمال Bitmap الاخير .
 
المشاكل : 😠  هناك عدة مشاكل واجهتني :
 
- بالنسبة لل Texture2D  لا يمكنني منادات المنهج <>SetData بعد الرسمة الاولى مما اضطرني لاعادة انشاء Texture2D كلما تنادي لل DrawString.
 
ملاحظة : استعملت unsafe block لتمكن من استعمال المؤشرات
 
هذا ما كان لي اليوم و الى لقاء أخر  , أخوكم بلال.

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

عمل ممتاز وسريع ما شاء الله! ☺


في 19/جمادى الثانية/1431 11:45 م، غمغم بلال بوزيــــــــاني باستغراب قائلاً:

بالنسبة لل Texture2D  لا يمكنني منادات المنهج <>SetData بعد الرسمة الاولى مما اضطرني لاعادة انشاء Texture2D كلما تنادي لل DrawString.

ما المشكلة بالضبط؟ ما هو الخطأ الذي يظهر لك؟ 
 
إنشاء الموارد أثناء سير اللعبة يبطئ الأداء بشدة، لذلك يجب أن نتفادى ذلك قدر المستطاع. يجب أن نستطيع إعادة استخدام نفس الـ Texture2D عند رسم نص جديد، فهناك بعض النصوص التي ستتغير ولا شك أثناء اللعب، كمجموع النقاط مثلاً.

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

مبتدئ  بلال بوزيــــــــاني مشاركة 5

السلام عليكم
 
شكرا  لك اخ وسام  , المشكل الذي ظهر هو التالي :
 
The operation was aborted. You may not modify a resource that has been set on a device, or after it has been used within a tiling bracket
 
و لما بحثت في MSDN و جدت هذا النص : 
 
 An InvalidOperationException is thrown if an attempt is made to modify (for example, calls to the SetData method) a resource that is currently set on a graphics device
 
و هذه الصفحة  http://msdn.microsoft.com/en-us/library/bb198834.aspx
 
بالطبع سوف أظيف  منهج  overload  لل DrawString  بحيث أعطي للمبرمج امكانية تثبيت حجم الموارد من Bitmap و Texture2D  حتي لو كان النص اكبر  لتحسين النجاعة و الاداء  واترك المنهج DrawString الافتراضي  يعمل بطريقة آلية.
 
اخوكم بلال .

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

في 20/جمادى الثانية/1431 04:06 م، غمغم بلال بوزيــــــــاني باستغراب قائلاً:

و لما بحثت في MSDN و جدت هذا النص : 
 
 An InvalidOperationException is thrown if an attempt is made to modify (for example, calls to the SetData method) a resource that is currently set on a graphics device

ممتاز. معرفة الخطأ هي نصف الحل ☺
 
كما تقرأ من الخطأ، أنت تكتب معلومات جديدة في الإكساء وهو مربوط مع جهاز الرسم، وهذا غير مسموح، إذ أن الإكساء قد يكون قيد الاستخدام.
 
الحل، ببساطة إزالة الربط قبل تحديث بكسلات الإكساء، وهذا يتم عن طريق:

GraphicsDevice.Textures[0] = null;

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

مبتدئ  بلال بوزيــــــــاني مشاركة 7

بارك الله فيك  ☺   , جربت الحل و الحمد  الله .
 
الان احاول تحسين الكود اكثر   و كذلك احاول اظافت ميزات اخرى  تسهل العمل بالوحدة اكثر.

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

كيف الحال معك يا بلال؟ هل كل الأمور على ما يرام؟ ☺

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

مبتدئ  بلال بوزيــــــــاني مشاركة 9

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



namespace AGDN

{	class XnaArabicTextRender:IDisposable
	{
	private Bitmap bitmap;
	private BitmapData bitmapData;
	private Texture2D texture;
	private Graphics graphics;
	private StringFormat textFormat;
	private int stride;
	private int width;
	private int height;
	private bool mfixed = false;
	private SpriteBatch spriteBatch;

	private bool disposed = true;
 
	public XnaArabicTextRender(SpriteBatch spriteBatch);
	public XnaArabicTextRender(SpriteBatch spriteBatch, int width, int height):this(spriteBatch);
	public XnaArabicTextRender(SpriteBatch spriteBatch, int width, int height,bool fixedResources);
 
	public bool Fixed;
	public bool Disposed;
	private void BuildBitmap(int width,int height);
	public void DrawString(string text, string font,float size,
			Microsoft.Xna.Framework.Graphics.Color color,
			Vector2 position);
 
	public StringFormat TextFormat;
	public void DefaultTextFormat();
	}
}
   
 
طبعا سأضيف التعليقات على الكود  لاحقا بأذن الله .
 
هناك مشكل  فقط اني لا لستطيع رفع المشروع لل   CodePlex Server  الخاص بهذا المشروع  , فهو يطلب اذخال user و password
 
طبعا الوحدة في المرفقات , و الان هذا العمل يحتاج الى أرائكم و نقدكم  المميز و الافكاركم  , أرجو ان لا تحرمونا منها  😳
 
و أعتذر مجددا على هذا الغياب  الطويل.
 
أخوكم بلال

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

تعديلات ممتازة بلال! 😄
 
حسناً، بالنسبة لرفع الكود، سأطلب منك أن تحاول رفعه بنفسك إلى كود بليكس. وإن واجهت أية مصاعب فأخبرنا بها فوراً.
 
لقد انتهيتُ للتوّ من كتابة دليل لكافة أفراد الفريق لكيفية مشاركة الملفات في عبر السدم. اقرؤوا التدوينتين الآتيتين:
 
http://blog.agdn-online.com/wbahnassi/post/1431/07/09/العمل-الجماعي-باستخدام-ادوات-التشارك.aspx
 
و
 
http://blog.agdn-online.com/wbahnassi/post/1431/07/14/عبر-السدم-وكود-بليكس.aspx
 
بالتوفيق!

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