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

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

قمت  ببرمجة خطوط  للعربية  للغة XNA 
اضفت الأحرف العربية  عن طريق برنامج الرسم  Paint  
وحولتها الى  bmp  و PNG  بشكل  شفاف   لكي تظهر  الكلمات  سوداء  والخلفية شفافة 


وقد ظهرت لي اخطاء   حاولت تجنب المشكلة  ولكني  لم استطع ان احل المشكلة 


هذه هي برمجتي :


using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;


namespace SHADER
{
    /// 
    /// This is the main type for your game
    /// 
    partial class Game1 : Microsoft.Xna.Framework.Game
    {
        private Texture2D _Texture;
        private SpriteBatch _SpriteBatch;
        private Vector2 _Position;

        public Game1()
        {
            InitializeComponent();
            System.Drawing.Font _FONT = new System.Drawing.Font("Arial", 24.0f);
            System.Drawing.Graphics _GRAPHICS = System.Drawing.Graphics.FromHwnd(Window.Handle);
            System.Drawing.SizeF _SIZE = _GRAPHICS.MeasureString("هذه لغتي المفضلة ", _FONT);
            _GRAPHICS.Dispose();
            System.Drawing.Bitmap _BITMAP = new System.Drawing.Bitmap((int)_SIZE.Width, (int)_SIZE.Height);
            _GRAPHICS = System.Drawing.Graphics.FromImage(_BITMAP);
            _GRAPHICS.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            _GRAPHICS.DrawString("هذه لغتي العربية المفضلة", _FONT, System.Drawing.Brushes.White,
                                                             new System.Drawing.PointF(0, 0));
            _GRAPHICS.Dispose();
            System.IO.MemoryStream _STREAM = new System.IO.MemoryStream();
            _BITMAP.Save(_STREAM, System.Drawing.Imaging.ImageFormat.Png);
            _BITMAP.Dispose();
            _STREAM.Position = 0;
            _Texture = (Texture2D)Texture2D.FromFile(graphics.GraphicsDevice, _STREAM);
            _STREAM.Dispose();
            _SpriteBatch = new SpriteBatch(graphics.GraphicsDevice);
            _Position = new Vector2(10, 10);
        }




        public override void Update(GameTime gameTime)
        {
            // TODO: Add your update code here
            float elapsed = (float)ElapsedTime.TotalSeconds;

            // TODO: Add your game logic here

            // Let the GameComponents update

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            if (!graphics.EnsureDevice())
                return;

            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            graphics.GraphicsDevice.BeginScene();

            // TODO: Add your drawing code here
            _SpriteBatch.Begin(SpriteBlendMode.AlphaBlend);
            _SpriteBatch.Draw(_Texture, _Position, Color.Black);
            _SpriteBatch.End();

            // Let the GameComponents draw


            graphics.GraphicsDevice.EndScene();
            graphics.GraphicsDevice.Present();
            // TODO: Add your drawing code here

            base.Draw(gameTime);
        }

    }
}

OSF متخصص محترف

خبير مشرف مؤيد مارديني مشاركة 2

أما في 04 نيسان 2009 02:59 م، فقد تنهد عمر سمير بارتياح وهو يرد:

وقد ظهرت لي اخطاء   حاولت تجنب المشكلة  ولكني  لم استطع ان احل المشكلة 

في البداية ما هي المشاكل التي واجهتك؟
ثم هناك ناحية أخرى، الكود الذي أرفقته *لا* يقوم بما قلته (أخذ الأحرف من صور PNG شفافة) بل هو يستعمل خدمات +GDI للكتابة بشكل مباشر.

Moayad Mardini,
MSDN Forums Moderator

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

طيب  ما الحل  برأيك  ؟؟

مشكلتي  هي  لا يجب ان يأخذ المعامل GDI+

وهذا هو الخطأ : الذي ظهر لي  فقط
Error    1    'SHADER.Game1.Update(Microsoft.Xna.Framework.GameTime)': cannot change access modifiers when overriding 'protected' inherited member 'Microsoft.Xna.Framework.Game.Update(Microsoft.Xna.Framework.GameTime)'    C:\Documents and Settings\OSF\My Documents\Visual Studio 2008\Projects\SHADER\SHADER\Game1.cs    51    30    SHADER

OSF متخصص محترف

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

بتاريخ 04 ابريل 2009 07:24 ص، قطب مؤيد مارديني حاجبيه بشدة وهو يقول:

الكود الذي أرفقته *لا* يقوم بما قلته (أخذ الأحرف من صور PNG شفافة) بل هو يستعمل خدمات +GDI للكتابة بشكل مباشر.

هو يقوم بكلا المهمتين في الواقع. أولاً يكتب النص في صورة في الذاكرة باستخدام +GDI، ثم يحفظ الصورة على ملف مؤقت بصيغة PNG، فقط ليفتحها مرة أخرى باستخدام Xna ليضعها في إكساء.  بعد ذلك، أثناء عمل البرنامج، فإنه يقوم برسم هذا الإكساء فقط.
 
هذه الطريقة مشابهة لتلك التي طبقها الشمري في أوبن جي إل مؤخراً، باستثناء موضوع حفظ الصورة على ملف PNG الوسيط هذا، فهو جهد لا داعي له ويجب تفاديه حفاظاً على الأداء.
 
http://www.agdn-online.com/communities.aspx?view=posts&threadid=544#post_3377
 
 
كنظرة أولية أرى خطأ عند نداء إجراء قياس أبعاد النص. فعند قياس الأبعاد أنت تستخدم النص "هذه لغتي المفضلة "، أما عند كتابة النص فعلاً فأنت تكتب "هذه لغتي العربية المفضلة".  هذا يعني أن توضـّع النص في الصورة سيكون مخالفاً للتوقعات.
 



وفي 04 ابريل 2009 07:29 ص، أعرب عمر سمير عن رأيه بالموقف كالآتي:

مشكلتي  هي  لا يجب ان يأخذ المعامل GDI+

فسّر أكثر 😖  



في 04 ابريل 2009 07:29 ص، قال عمر سمير بهدوء وتؤدة:

وهذا هو الخطأ : الذي ظهر لي  فقط
Error    1    'SHADER.Game1.Update(Microsoft.Xna.Framework.GameTime)': cannot change access modifiers when overriding 'protected' inherited member 'Microsoft.Xna.Framework.Game.Update(Microsoft.Xna.Framework.GameTime)'    C:\Documents and Settings\OSF\My Documents\Visual Studio 2008\Projects\SHADER\SHADER\Game1.cs    51    30    SHADER

ما يقوله هذا الخطأ هو: 
لا يمكنك تغيير هيئة الإجراء Update لتصبح مخالفة لهيئته الأصلية، والتي هي:
 
protected Microsoft.Xna.Framework.Game.Update(Microsoft.Xna.Framework.GameTime)
 
وتحديداً هو يتحدث عن معامل الوصول، والذي في حالتك هو public (للعموم)، بينما الإجراء الأصلي هو protected (محمي). عدل الكلمة كي تحل الخطأ.

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

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

وفي 04 نيسان 2009 03:38 م، أعرب وسام البهنسي عن رأيه بالموقف كالآتي:

هذا يعني أن توضـّع النص في الصورة سيكون مخالفاً للتوقعات

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

لأن  بهكذا طريقة  تمكننا  من كتابة  الكلمات العربية  حتى لو  كانت عشوائية  مثلاً  تختلف عن  الأخرى .

هل هي  الحل  الجذري  للكتابة  العربية  في  XNA  خصوصاً .....


برمجة بسيطة  وغير معقدة   ومفهومة  من قبل المبرمج .

OSF متخصص محترف

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

لاحظت وجود مشاكل عند اضافة SpriteBatch spriteBatch; في عدة مجسمات  او عند كتابة احرف عشوائية


الصورة تكون مشوهه عند استخدام المتغير SpriteBatch

هل يجب اضافة تأثير  basiceffect.fx   لأظهار  الصورة بالشكل المطلوب 

او عدم  وجود توافق  بين الأثنين ....

OSF متخصص محترف

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

وفي 04 ابريل 2009 08:52 ص، قال عمر سمير متحمساً:

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

بصراحة هذه الطريقة لا تختبر أي شيء سوى فهم المبرمج للكود الذي كتبه. أولاً هذا الخطأ في استخدام +GDI وليس في XNA. ثانياً XNA ليست لغة وليس لها مترجم خاص لتختبر ذكاءه أساساً. 😠

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

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

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



private SpriteFont GDI_Font; // متغير اسم الخطوط 
private Texture2D fontArabic; // متغير صورة الخطوط او الكلمات 
private Texture2D fontArabicEffect; //متغير  تأثيرات الخطوط  للصورة 

 
protected override void LoadContent()
{
  // Create a new SpriteBatch, which can be used to draw textures.
  spriteBatch = new SpriteBatch(GraphicsDevice);
  // هنا نضع جميع الخطوط العربية
  GDI_Font              = Content.Load("Fonts/GDI_Font");
  //  هنا نضع صور للكلمات العربية  
  fontArabic = Content.Load("fontarabic\شاشة البدء");
  fontArabicEffect = Content.Load("FontArabic2/شاشة التأثيرات");
}

 
protected override void Draw(GameTime gameTime)
{
  graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
  DrawGDI_Font();// هنا نعرف مكان الرسم للخطوط العربية 
  base.Draw(gameTime);
}

 
private void DrawGDI_Font()
{
  Vector2 GDI_FontLocation = new Vector2(String.X, String.Y);// نضع مكان النص على الشاشة
  DrawShadowedString(GDI_Font, timeString, GDI_FontLocation, timeColor); هنا نضع الظل للخطوط
}

 
private void DrawShadowedString(SpriteFont GDI_Font, string value, Vector2 position, Color color)
{
  spriteBatch.DrawString(GDI_Font, value, position + new Vector2(1.0f, 1.0f), Color.Black);// اللون والمكان
  spriteBatch.DrawString(GDI_Font, value, position, color); // نعرف النوع والمكان واللون للرسم 
}



    بذلك الأبتكار   الجديد  لــ XNA  فقط  باللغة العربية .....

OSF متخصص محترف

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

ارجو  المعذرة  للسوء  فهمي  بالموضوع 

وبالمناسبة  لقد  قمت  بحذف هذا الكود نهائياً  

 قمت  بهذه التجربة  فقط   اضطرارياً  ......

OSF متخصص محترف

خبير  أحمد عبد الغني مشاركة 10

في 09/ربيع الثاني/1430 10:48 ص، غمغم عمر سمير باستغراب قائلاً:

انني اقترح  كتابة النصوص العربية  عن طريق  الصور   PNG  بحيث تكون شفافة  للمظهر الخارجي 
 
 

بتاريخ 09/ربيع الثاني/1430 10:48 ص، قطب عمر سمير حاجبيه بشدة وهو يقول:

بذلك الأبتكار   الجديد  لــ XNA  فقط  باللغة العربية .....

سبقك بها عكاشة 😄
 
XNA لا يدعم الكتابة بالعربية من اليمين لليسار، ولا يدعم توصيل الأحرف. لذلك استخدامك لكلاس SpriteFont لن يفي بالغرض. أنظر إلى هذه المحاولة:
 
http://forums.xna.com/forums/p/14680/76824.aspx
 
 
(سؤال جانبي: هل أنت تجرب الكود قبل أن ترسله؟)

اللهم انصر أهلنا في فلسطين وآجرنا أن نكون عوناً لهم