الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[شبه مكتمل] : المرحلة الأولى: تطوير وحدة Core

رائج
بدأه فريق الأندلس في 27 سبتمبر 2009 · 177 رد · 11,907 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

- المرحلة الأولى : تطوير وحدة ( حزمة) core .

- الهدف : تطوير أصناف Classes أساسية للمحرك مثل أصناف رياضية Mathematical Classes .

- أصناف ( Classes ) هذه المرحلة ومواصفات ( Specification ) كل صنف :

  • Math
  • Point2D
  • Line2D
  • Rectangle
  • Circle
  • Triangle
  • Polygon
  • Vector2D
  • Matrix3
  • Random

  • كل الأصناف السابقة هي Classes لاتوجد بينها أي علاقة Relationship .
  • لغة الجافا : يمكن تجاهل الكلاس Math لوجوده بشكل افتراضي
  • للمراجعة في وقت لاحق :
    Point2D vs Vector2D !
    Boost and C++ implementation !
    Triangle and Polygon in 0.1 version !

- خطوات التطوير:

(جميع اللغات البرمجية يتم مناقشتها في هذا الموضوع بما في ذلك الخطوة الثالثة و الرابعة)

  1. التحليل الأولي للموضوع :
    - نناقش فائدة هذه الحزمة core , وماهو الهدف منها .
    - هنا تبدأ تتضح معالم Classes و Interfaces و Enumerations التي سنحتاجها .. والعلاقات بين الكلاسات Classes .
  2. كتابة مواصفات Specification للأصناف Classes التي سيستخدمها المستخدم النهائي :
    نختار جزء معيّن من الأصناف والواجهات Classes - Interfaces ، التي ستظهر للمستخدم النهائي , ونكتب مواصفاتها بالتفصيل , بحيث يمكن لأي مطوّر دعم هذه الأصناف والواجهات في أي لغة برمجية يريد ، مثال ( يجب اتباع طريقة كتابة المواصفات قدر الامكان ) :


    // Interface that read an image from specific file into ImageBuffer
    ImageReader <interface>
    {
    /// @Purpose : load an image from specific file and create new object of ImageBuffer
    /// that holds image info .
    /// @Parameters:
    /// - fileName : image file name ( full path ) .
    /// @return :
    /// on success :new ImageBuffer object holds image info
    /// on failure : NULL;
    /// @Exceptions :
    /// FileNotFoundException if the image (fileName) does not exist .
    /// FileFormatNotSupportedException if the image format is not supported.
    [byRef] ImageBuffer read( [iN] string fileName) <pure>
    };


    مثال اخر :


    // Class used to hold an image information such as ( width - height - format - data)
    ImageBuffer<class>
    {
    // array of char that contains image data (colors).
    byte [ ] data
    // image width
    int width
    // image height
    int height
    // bits per pixel
    int bpp
    // @Purpose : check if the image has alpha channel
    // @return :
    // true : if the image has alpha channel
    // false : otherwise
    [byValue] bool isAlpha().
    };


    - لا يتم كتابة مواصفات الدوال Methods و الأعضاء Members الشائعة مثل Setters و Getters .. مثال : setText .

  3. مناقشة الخوارزميات والأفكار وكتابة الكود Implementation .
  4. اختبار الكود .

تم تعديل هذه المشاركة بواسطة الشمري في 28 سبتمبر 2009 في 05:59

#2

الخطوة الاولى : التحليل الأولي للموضوع :

طيب .. سأبدأ النقاش ,

- أول شيء نحتاجه مجموعة من الكلاسات الرياضية والكلاسات الاخرى الأساسية .

أقترح التالي ( جميعها تكون كلاسات Classes ولاتوجد أي علاقات بينها Relationships - يعني لايوجد وراثة أو association مثلا .

1- Matrix3 : كلاس المصفوفة - ماتركس - وسيشمل أيضا Transformation - المصفوفة يجب أن تكون 3*3 .

2- Vector2 : كلاس المتجه - ثنائي البعد ويشمل على عمليات المتجهات الاساسية المعروفة .

4- Math : ويشمل مجموعة من الدوال Functions الرياضية - مثل الدوال المثلثية وغيرها .

5- Rectangle : كلاس بسيط يمثل شكل مستطيل , يمكن أن نستفيد منه في تمثيل هذا الشكل والعمليات التي يمكن أن نجريها باستخدامه .

6- Circle : كلاس بسيط لتمثل دائرة .. وعمليات بسيطة عليها .

7- Ray2 : شعاع ثنائي البعد .. لا أعرف بالظبط كيف سنستفيد منه :) .

8- Random : كلاس بسيط لتوليد عدد عشوائي ، يمكن أن يكون بسيط ويمكن أن يكون معقد بحسب الخوارزميات التي ستستخدم .

هذا ما أعرفه , يفضل أن لانضيف الا شيء سنستخدمه بالفعل ، لاداعي لتضخيم القائمة ، خاصة وأنه أمامنا عمل شاق .

بالنسبة لكلاس Circle و Ray2 .. لا أعرف اذا كنّا سنستخدمهما .. لذلك يمكن حذفهما .

مارأيكم ..هل نضيف شيء .. نحذف شيء .. ( نحن الان في الخطوة الأولى أي أننا نتكلّم على مستوى Classes و Interfaces و Enumeration و Relationships )

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

هذه بعض الفئات التى سنحتاجها فى حزمة الرياضيات

Math: و تحتوى على مجموعه من الدوال الرياضيه الشائعه مثل log، root .... إلخ.

Matrix3x3: و تمثل مصفوفه تحتوى على 3 صفوف و 3 اعمدة بالإضافه لبعض العمليات مثل Determined و Transpose و غيرهم.

Vector2D : و هو متجه ثنائى البعد.

Vector3D: و هو متجه ثلاثى البعد.

Point2D: و هى نقطه ثنائية البعد.

Line2D: و هو خط داخل نظام احداثيات ثنائى البعد.

Rectangle: و يمثل شكل ذو اربعة اضلاع و يحتوى على بعض العمليات عليه مثل IsPointInRect.

Circle: و تمثل دائره داخل نظام احداثيات ثانئى البعد و تحتوى على بعض الدوال التى تساعد فى العمل عليها.

يمكن استخدام الـ Circle كـ Bound Circle داخل اللعبة الـ 2D (مثل ما هو موجود داخل الألعاب الـ 3D الـ Bound Sphere :D )

لا اعرف عن الرياضيات المستخدمه داخل الألعاب الـ 2D و لكنى اعتقد انها لن تختلف كثيرا عن ما هو موجود داخل الـ 3D (فقط بعد اضافى) عموما توجد انواع اخرى لم اكتبها حيث انى مرهق جدا و اريد النوم.

غدا ان شاء الله سأكمل معكم باقى الانواع.

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#4

اقتراح اضافى حيث اننا سنحتاج للمقارنه احيانا بين كائنين لذا قد نقوم بعمل الواجهه ICompare<T> ليتم تضمينها داخل المحرك و الهدف من هذه الخطوه هو ثابت الإسلوب الذى يتم اتباعه للمقارنه بين الكائنات

 

[color= #0000ff;]template[color= #000000;]<[color= #0000ff;]typename T[color= #000000;]>

[color= #0000ff;]struct IComparable

[color= #000000;]{

    [color= #0000ff;]virtual [color= #0000ff;]bool Compare[color= #000000;](T[color= #000000;]* obj[color= #000000;]) pure;

[color= #000000;]};

مدونتي: C++ Tips and Tricks

#5

رأيي أنه ممكن نستخدم هذه الواجهة في لغات أخرى مثل الجافا , وليس مع السي بلس, حيث السي بلس تملك operator overloading وهي اسرع وتعطي ميزة ثبات الاسلوب ولاتضيف بايتات اضافية الى كلاسات مهمّة مثل Vector و Matrix , مثال :

Vector v1(10,20);
Vector v2(20,30);
bool b;
b = v1 > v2;
b = v1 < v2;
b = v1 == v2;
b = v1 != v2;
b = v1 >= v2;
b = v1 <= v2;

هذا رأيي في النقطة التي ذكرتها , وبانتظار اراء بقية الاخوة .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

لا أعلم إن كنا نسنستخدم Vector3D

اقتباس
Vector3D: و هو متجه ثلاثى البعد.

في هذه المرحله من المحرك لذلك أعتقد أن نحذفه من القائمه أفضل أو إذا كنتم مصرين على تضمينه من الآن أعتقد أننا سنحتاج إلى

Point3D أيضا

بالنسبه إلى المقارنه لل classes فأنا أفضل ال operator overloading

أعتقد أنها الأسهل والأكثر إستخداما

تم تعديل هذه المشاركة بواسطة hunterxhunter في 27 سبتمبر 2009 في 07:58

#7

بالنسبة للـ Vector3D أوافق الاخ hunter ، لن نحتاجه الان .

أما بالنسبة للـ Point2D فلا اظن اننا نحتاجها لان عندنا Vector2d أشمل منها , ويؤدّي نفس الغرض , أعرف انه يوجد فرق بين المتجه والنقطة , لكن برمجيا كلاهما يمثلان بمتغيرين س (و) ص ، وبالتالي نمنع الالتباس الذي قد يحصل ( هل نستخدم Point أو Vector ) ؟

هذا رأيي وبانتظار بقيّة الاراء .

اقتباس
Line2D: و هو خط داخل نظام احداثيات ثنائى البعد.

هل هو نفسه Ray ( الشعاع ) أم لا ؟

اقتباس
يمكن استخدام الـ Circle كـ Bound Circle داخل اللعبة الـ 2D

جيد

بالنسبة للتسمية , تسمية الاخ محمد علاء أفضل ( باضافة اللاحقة 2D ) .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8
اقتباس
يحتوى على بعض العمليات عليه مثل IsPointInRect.

نسيت أقول أنها فكره جميله . أتمنا تعميمها على باقي الأصناف مثل Line2D و Circle

أيضا ما رأيكم بصنف Triangle

#9

سيتم نقاش محتويات كل كلاس في الخطوة الثانية , نحن الان نناقش على مستوى الكلاسات Classes والعلاقة بينها ولم ندخل في تفاصيل كل كلاس .

اقتباس
أيضا ما رأيكم بصنف Triangle

ماهي فوائده ، اذا كان له فائدة فلم فلا .

تم تعديل هذه المشاركة بواسطة الشمري في 27 سبتمبر 2009 في 08:26

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#10
اقتباس
أما بالنسبة للـ Point2D فلا اظن اننا نحتاجها لان عندنا Vector2d أشمل منها , ويؤدّي نفس الغرض , أعرف انه يوجد فرق بين المتجه والنقطة , لكن برمجيا كلاهما يمثلان بمتغيرين س (و) ص ، وبالتالي نمنع الالتباس الذي قد يحصل ( هل نستخدم Point أو Vector ) ؟

صحيح كلامك ولكن يمكن الأستفاده منها مثلا لرسم نقطه و Vector2d لرسم خط

اقتباس
إقتباس

أيضا ما رأيكم بصنف Triangle

ماهي فوائده ، اذا كان له فائدة فلم فلا .

لا أعلم ولكن مثل ما أن نقطتان تمثل متجه

فأن مثلثين يمثلوا مربع

أي أننا يمكننا أستخدام المثلثات كوحده أبسط . أيضا الكلام ينطبق على النقاط بحيث تكون

نقطتان تمثل متجه

ثلاث نقاط تمثل مثلث

أربع نقاط تمثل مربع (أو مثلثين يمثلوا مربع)

هذا مجرد إقتراح

اقتباس
إقتباس

Line2D: و هو خط داخل نظام احداثيات ثنائى البعد.

هل هو نفسه Ray ( الشعاع ) أم لا ؟

أعتقد ذلك . يمكن أستخدامه لكتشاف التصادم ولكن في مرحله متقدمه من المشروع

#11

السلام عليكم .....

مشروع رائع و أتمنى لكم التوفيق في عملكم بإذن الله. لدي ملاحظة بسيطة, و هي أنه لماذا لا تعتمدون على مكتبات لبناء المحرك بدلاً من بناءه من الصفر, أعتقد أن الـ core يمكن أن يتم بناؤه بشكل احترافي عن طريق بناء wrappers لمكتبات boost على سبيل المثال.

و عندما ترى أن boost غير مناسب يمكن أن تقوم بكتابة الـ implementation الخاص بك, أو استخدام مكتبة أخرى.

فمثلاً,

للتعامل مع الأعداد, فالمكتبة القياسية في ++C, توفر لك معظم العمليات على الأعداد الصحيحة و الحقيقية و المركبة, إذا كنت تريد التعامل مع أنواع أخرى و عمليات أخرى كثيرة جداً جاهزة:

Boost.Math

للمصفوفات و العمليات عليها:

Basic Linear Algebra

للتعامل مع الأعداد العشوائية:

Boost Random Number Library

هذا في الـ Core فقط, هناك مكتبات أخرى يمكن أن تفيدكم. أتمنى أن لا تكونوا تريدون بناء كل شيء من الصفر, و عذراً على الإزعاج :P

يمكنك بالطبع الاستفادة من المكتبات الأخرى, و في النهاية, فأنت تقوم بعمل wrapper احترافي, دون إضاعة الكثير من الوقت و العديد من الأخطاء.

تحياتي...

#12

طبعاً أخي خالد ، و لكن لم نصل إلى تلك المرحلة بعد .

بشان المثلث وغيره ، ما رأيكم بال Polygon ؟ إضافته مفيدة برأيي ...

#13

1 - بالنسبه لموضوع الواجهه IConvertable

كلامكم صحيح حيث ان الـ Operator Overloading اسهل كثيرا من هذه الواجهه خصوصا لو ان الكائن سيتم مقارنته مع اكثر من نوع و بالتالى سنحتاج لوراثتها العديد من المرات لأنواع مختلفه و هو امر غير منطقى لوجود بديل اكفاء.

2 - بالنسبه للـ Vector3D

اتفقنا على استخدامنا لمصفوفه 3x3 و السؤال الأن كيف سنقوم بإضافة متجه 2D على مصفوفه 3x3 هل سنقوم بتجاهل الصف الأخير على اعتبار انه يمكن استخدامه فى شئ اخر (كما فى الـ 3D) و لكن لحظه اذا كان كذلك فالهدف من الـ 3D هو تحويل شكل المجسمات لصوره 2D دون ان نفقد المنظور و حيث اننا سنعمل على 2D لذا ارجو توضيح هذه النقطه.

3 - بالنسبه للنقطه و المتجه

كما ذكرتم المتجه اعم و اشمل من النقطه و لكنهما نوعين مختلفين فالمتجه من الممكن ان يكون طول و زاويه اما النقطه فهى مكان تقاطع محورين و بالتالى داخل النوع Circle او Rect لا نستطيع عمل الداله IsVectorInRect او IsVectorInCircle، ايضا للنقطه مهام اخرى حيث سيتم استخدامها لتعبر عن مكان بدء Line و مكان انتهائه و فى هذا لا يمكن استخدام Vector.

4 - الخط و الشعاع

الخط غير الشعاع حيث ان الشعاع شبيه جدا بالمتجه ان لم يكن يتطابق معه فى خصائصه فكلاهما له نقطه بدء و طول و اتجاه اما الخط فيستخدم مع المساحات.

5 - النوع مثلث Tringle

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

بشكل عام الأنواع البسيطه الهامه التى حتى و ان لم تظهر لها فائده مبدئيه فهى على المدى البعيد-القريب سيتم الحاجه لها عند كتابة الكود للمحرك و هذه الأنواع هى نقطه و خط و مثلث و دائره و شكل رباعى الأضلاع (ايا كان هو متوازى مستطيلات او مربع او مستطيل المهم انه رباعى) كذلك متجه (و هو ايضا شعاع) و مصفوفه.

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

6 - النوع Polygon

اضافه إلى ما سبق حيث اننا لا نريد اضافة اشكال هندسيه لن يتم الحاجه إليها الأن (هذا الشكل من الأشكل المهمه - تقريبا كلهم كده بالنسبه لى) فسأترك لباقى الأعضاء التقييم حيث انكم اذا طلبتم رأيي فأنا سأعمل على محرك الرياضيات و كل ما يتعلق بالرياضيات على استعداد لإضافته داخل المحرك(حتى و إن لم اكن اعرفه ساتعلمه).

7 - بالنسبه لإقتراح الأخ خالد

اقتباس
لماذا لا تعتمدون على مكتبات لبناء المحرك بدلاً من بناءه من الصفر, أعتقد أن الـ core يمكن أن يتم بناؤه بشكل احترافي عن طريق بناء wrappers لمكتبات boost على سبيل المثال.

و عندما ترى أن boost غير مناسب يمكن أن تقوم بكتابة الـ implementation الخاص بك, أو استخدام مكتبة أخرى.

كلام سليم و منطقى اخ خالد و حيث ان بعض منا سيتعلم اجزاء جديده لهذا المحرك (انا اولكم) و بالتالى ما الضرر من تعلم boost و استخدامها حيث انها ستسعاد كثيرا بما تحتويه من اكواد جاهزه، ايضا ستدفع عجلة تطوير المحرك للأمام فهى boost.

توجد بعض أنواع البيانات التى لم نتكلم عنها مثل Complex (موجوده بالـ stl) و Quaternion (إذا احتجنا لها). ايضا هذه الأنواع موجود بـ boost و توجد دوال لهم داخل DirectX و لا اعلم بشأن الـ OpenGL.

سؤال اضافى

هل سنتكلم فقط عن الرياضيات ام سنتطرق للنوافذ و الـ Devices و الملفات و الباقين ....

تحتوى boost على بعض الأعداد الجبريه مثل Octonions :) كده يبقى فاضل لهم Sedenion (ممكن ابقى اشارك بمكتبتى معاهم لما اخلصها ان شاء الله).

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 27 سبتمبر 2009 في 16:54

مدونتي: C++ Tips and Tricks

#14

@ خالد : boost ستحل كثير من المشاكل خاصة في مجال الاعداد العشوائية وتحويل الاعداد .. لكننا في هذه المرحلة سنحاول أن نتحاشى أي اعتمادية على مكتبة خارجية قد تؤدي الى تصعيب المهمة على من سيتابع معنا , سنستخدم المككتبات القياسية فقط ، ونعمل الناقص بأسلوب بسيط ، لايجب أن يكون Random كلاس يستخدم أفضل أنواع خوارزميات توليد الاعداد ، فقط توليد عدد عشوائي بسيط ، حتى لو استخدمنا الدالة التقليدية rand . لاضير .

أما Matrix ، فلا حاجة بنا الى boost ، يمكننا بناءها بأنفسنا وهذا افضل ( الكلاس يجب أن يكون بسيط في البداية ونضيف له كلما احتجنا لذلك ) . لذلك أرى أن نتجاهل boost على الاقل في المرحلة الاولى ، حتى نبسّط عملية التطوير .

@ بالنسبة لاقتراح hunter و حسام و محمد بشأن المثلث والمضلّع : رأيي أننا لانحتاجهما في المرحلة الاولى ، لكن يبدو أن اغلبية الاصوات تؤيد اضافتهما حتى الان ، لذلك لامانع من اضافة Triangle و Polygon .

@ Quaternion و Complex : لا اظن اننا سنحتاجهما أصلا في المحرك الثنائي البعد ، أرى عدم اضافتهما .

@ IsVectorInRect : لن نكتبها هكذا .. انما سنكتب IsPointInRect ، ونمرر لها Vector على أنه نقطة ( نعتبره كذلك ) ، فقط للتسهيل.

ولكن يبدو أغلبية الاصوات نحو انشاء كلاسين Point2D و Vector2D ، لذلك لامانع من انشاءهما .

اقتباس
الخط غير الشعاع حيث ان الشعاع شبيه جدا بالمتجه ان لم يكن يتطابق معه فى خصائصه فكلاهما له نقطه بدء و طول و اتجاه اما الخط فيستخدم مع المساحات.

لا أعرف .. نحتاج الى قول فصل في هذا :) ، لن نضيف شيء لن نستخدمه في المحرك الثنائي البعد ، لذلك يجب أن تكون الصورة واضحة ، كيف ولماذا نضيف هذا الكلاس .. نحتاج لمزيد من التحليل .

اقتباس
اتفقنا على استخدامنا لمصفوفه 3x3 و السؤال الأن كيف سنقوم بإضافة متجه 2D على مصفوفه 3x3 هل سنقوم بتجاهل الصف الأخير على اعتبار انه يمكن استخدامه فى شئ اخر (كما فى الـ 3D) و لكن لحظه اذا كان كذلك فالهدف من الـ 3D هو تحويل شكل المجسمات لصوره 2D دون ان نفقد المنظور و حيث اننا سنعمل على 2D لذا ارجو توضيح هذه النقطه.

هذه مسألة معروفة في برمجة الرسوميات ، عندما تضرب متجه ثنائي البعد بمصفوفة 3*3 ، تضيف بعد ثالث w بقيمة 1 بشكل مؤقت للمتجه ، حتى يمكنك أن تضرب .. هكذا :

[M] * [x y 1]

لذلك لاداعي لوجود Vector3D .

اقتباس
هل سنتكلم فقط عن الرياضيات ام سنتطرق للنوافذ و الـ Devices و الملفات و الباقين ....

الملفات في الخطو الثانية ان شاء الله .

النوافذ في الخطوة الثالثة ..

يعني ليس في هذا الموضوع .

يا اخوان : نريد وصف واضح للكلاسين Triangle و Polygon اذا كنّا بالفعل نريد اضافتهما  يجب أن يكون الوصف واضح . مثلا المضلّع هل سيكون منتظم او غير منتظم .. وما الى ذلك .. وكيف سنستفيد منه .

وذلك حتى يتم اضافتهما لقائمة الكلاسات .

يجب أن ننتهي الليلة من نقاش الخطوة الاولى لننتقل للخطوة الثانية .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#15

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

هنالك وحدة لم يتم ذكرها قد تكون لها اهمية في عمل المحرك نفسه، الا وهي الـ Quad، لأن أي صورة سيتم رسمها على الشاشة ستحتاج Quad، ولكن يمكن لهذا الموضوع ان ينتظر لحين تحديد طرق الرسم.

Boost ستحل مشاكل كبيرة ,يمكن إعتمادها للأشياء العامة، مثلاً الأحداث events، قراءة وكتابة البيانات للملفات، اعتمادها لتقديم دعم الـ multi-threading، إلخ، خاصة وان كل ما فيها متوافق مع جميع المنصات، يمكن تأخير إتخاذ قرار اعتماد Boost حتى تتوضح معالم المحرك اكثر.

#16

السلام عليكــم ورحمـة الله وبركاتــه ،،

انا من رأي الشمري في تبسيط المحرك الى اقصى ما يمكن ثم تطويره لاحقا

بالنسبة لي ارى التالي

الكلاسات Rectangle و Circle هي كلاسات موروثة من الكلاس Shape

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

سنحتاج للتعامل مع الاحداث Event Handler

و لو بشكل مبسط في البداية مثلا لنضع حدثين على الاقل في النسخة التجريبية مثل Quit

بقية الاصناف جيدة حاليا

#17

أنا مع رأي الأخ "الكون" بالنسبة لموضوع Shape ....

(حت لاتخرج الأمور عن التنظيم ، الحديث بدأ يشمل الرياضيات و الرسم و الأحداث... إلخ ، دعونا نحدد موضوعاً واحداً للحديث ) ...

#18

الأحداث Events ستكون في المرحلة الثالثة عندما نتحدث عن النوافذ و المدخلات والاحداث kernel .

الحديث الان عن نواة المحرك ( في الغالب ستكون مكتبة رياضية ) .

اقتباس
Boost ستحل مشاكل كبيرة ,يمكن إعتمادها للأشياء العامة، مثلاً الأحداث events، قراءة وكتابة البيانات للملفات، اعتمادها لتقديم دعم الـ multi-threading، إلخ، خاصة وان كل ما فيها متوافق مع جميع المنصات، يمكن تأخير إتخاذ قرار اعتماد Boost حتى تتوضح معالم المحرك اكثر.

نعم .. أفضل أن نتخذ القرار في وقت لاحق ( أنا مع الاعتماد عليها .. لكن ليس الان ) .

بالنسبة للـ Quad ، تقصد شكل رباعي .. ألا يكفي Rectangle حاليا ( الاشكال المعقدة سيتم رسمها على هيئة مثلثات والبسيطة على هيئة Rectangle ) ، لو أمكن التفصيل أكثر عن Quad ، لتكون الصورة واضحة .

اقتباس
الكلاسات Rectangle و Circle هي كلاسات موروثة من الكلاس Shape

ممكن .. لكن فقط للتوضيح ..

كل كلاسات core مفصولة عن الرسوميات .. ستكون مجرد حاويات ان صح التعبير .. بمعنى لن تكون هناك دالة اسمها draw داخل rectangle على سبيل المثال .

حيث Rectangle سيحوي على أربع نقاط تحدد أبعاده .. وبعض العمليات مثل isPointInside أو isRectangleCollide .

بينما الدائرة ستحوي على احداثيات المركز + نصف القطر .. وبعض العمليات مثل isCircleCollide .

بينما عملية الرسم draw ستكون في كلاس Graphics ، وتستقبل اما Rectangle أو Circle .. يعني overloading .

لذلك أنا شخصيا لا أرى استخدام الوراثة لعدم وجود علاقة بين الدائرة والمستطيل مثلاً .. مالعلاقة بينهما ؟

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

---

خلاص .. نلغي Ray ونبقي على Line2D .

تم تعديل هذه المشاركة بواسطة الشمري في 27 سبتمبر 2009 في 20:53

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#19

بالنسبه إلى فائده ال Triangle فهي تنحصر في عدت أشياء

إذا كان المثلث يعبر عن شيء وهمي أي لا يرسم على الشاشه فيمكن الأستفاده منه في AI

مثلا مجال نظر للحارس في لعبه جاسوسيه( أعلم أن هذه النقطه متقدمه و هذا ليس وقتها الآن )

أما إذا كان المثلث يمثل شيء ضاهر على الشاشه فسنستفيد منه عن طريق رسمه على الشاشه أو رسم أشكال أعقد منه حيث أنه الوحده الأساسيه في الرسم .

تم تعديل هذه المشاركة بواسطة hunterxhunter في 27 سبتمبر 2009 في 21:13

#20

السلام عليكــم ورحمـة الله وبركاتــه ،،

ماشاء الله إنتو كتبتو كل ده متى :)؟؟

سأعطي رأيي في الأمور المطروحه

بالنسبة لل Point و ال Vector أرى أن نستعمل فقط ال Vector لأنها أشمل و تمثلها بالرغم من بعض الإختلافات ولكن أعتقد أن وجود الإثنين يمثل تكرار لا غير

من ناحية ال Triangles و ال Polygons أرى أنه من المفيد إستعمالها، لأنها كما قال الأخوة المثلث هو وحدة البناء الأساسية، أما بالنسبة لل Polygon فمن خلالها يمكن وصف أشكال أكثر تعقيدا. طبعا المضلع عبارة عن مجموعه من النقاط...

طبعا أنا متفق على أن هذه الكلاسات لن تحتوي على وظيفة ال Draw...

أرى وجود كلاس ال Line مفيد حيث يتكون من نقطتين (بداية و نهاية) و هو أفضل من الشعاع لأن الشعاع في النهاية مجرد Vector

بالنسبة للـ Quad لا أدري إن كان يلزم ولكن من وجهة نظري (المحدوده) لا أرى ضرورة له

موضوع الوراثه من ال Shape أعتقد أنه مجرد بيروقراطية لا لزوم له :huh: :)

#21

السلام عليكــم ورحمـة الله وبركاتــه ،،

أخوتي الاعزاء أولا انا أؤيد كلام الشمري

اقتباس
لكننا في هذه المرحلة سنحاول أن نتحاشى أي اعتمادية على مكتبة خارجية قد تؤدي الى تصعيب المهمة على من سيتابع معنا

لا ننسى ان في بعض اللغات لا توجد مكتبات جاهزه أو يوجد مكتبات غير قويه وهنا دعني اتحدث عن J2ME كمثال فلا يوجد اي مكتبه قويه تقوم ببعض الامور المتقدمه لذلك أرجو الاعتماد على انشاء الكود من الصفر وان كان لا بد من الاستعانه بمكتبات فنرجو افراد مواضيع متخصصه تناقش طريقه عمل هذه المكتبات من الداخل حتي نستطيع ( ان كان هناك من سيشاركني في مشروع الJ2ME :D ) كتابه كود هذه المكتبات.

ثانيا: ماذا عن اختلاف قدرات اللغه فبعض الترتيب في بنيه المكتبه ربما يكون مناسب في ال C++ وليس مناسب في Java فهل يمكن ترتيب المكتبات بشكل مختلف ويكون المهم هو الحصول على النتيجه نفسها أم سنلتزم بترتيب المتفق عليه.

تم تعديل هذه المشاركة بواسطة muqawem في 27 سبتمبر 2009 في 22:49

#22

السلام عليكــم ورحمـة الله وبركاتــه ،،

بما اننا اتفقنا (على ما اعتقد ) على وجود Point2D و Vector2D فساريكم تصوري لهاتين الفئتين.

اولا انا رى ان فئه Vector2D هي نفس فئه Point2D ولكن مع اضافه الاتجاه لذلك فانا اعتقد ان

Vector2D extends Point2D

وعليه فتصوري كالتالي:

class Point2D {

}

class Vector2D extends Point2D {

@Purpose : Get the magintude of this vector.
public double getMagintude();

@Purpose : Get square of the magintude of this vector.
public double getSquareMagnitude();

@Purpose : get the normalize vector of this vector.
public Vector2D getUnitVector();

@Purpose : Add vector v to this vector
public void add( Vector2D v );

@Purpose : subtract this vector from vector v
public void subtract( Vector2D v );

@Purpose : multiply this vector by scalar value
public void multiply( int scalar );

@Purpose : add vector v1 to v2 and return the new vector
public static Vector2D add( Vector2D v1, Vector2D v2 );

@Purpose : subtract v1 from v2 and return the new vector
public static Vector2D subtract( Vector2D v1, Vector2D v2 );

@Purpose : multiply vector v by scalar value and return the new vector.
public static Vector2D multiply( Vector2D v, int scalar );

@Purpose : get the dot product of v1 and v2
public static int dotProduct(Vector2D v1, Vector2D v2);

}

لا ادري ان كنت قد ذكرت كل ما نحتاجه في هاتين الفئتين ام لا. نرجو الاضافه او الحذف حسب الحاجه.

#23

السلام عليكــم ورحمـة الله وبركاتــه ،،

أرجو تقبل اعتذاري على فصلي للمواضيع واكن بسبب تشتت افكاري :blush:

بالنسبه لنسخه J2ME من المحرك فانه لن يكون هناك استخدام لل float وال double في نواه المحرك حتى نتمكن من دعم اجهزه ال CLDC 1.0 لذلك سنستخدم fixed point math عوضا عنها وربما نستبدلها في المستقبل.

سأقوم بالبحث عن مكتبه جيده لتضمينها في نواه المحرك ومن يعرف واحده جيده فأرجو أن يطلعنا عليها.

هذه النقطه حاله خاصه لنسخه ال J2ME لذلك أعتذر ان كان من الخطأ طرحها هنا ولكني أظن انها يجب ان تكون جزءا من النواه.

تم تعديل هذه المشاركة بواسطة muqawem في 27 سبتمبر 2009 في 23:29

#24
اقتباس
بالنسبة لل Point و ال Vector أرى أن نستعمل فقط ال Vector لأنها أشمل و تمثلها بالرغم من بعض الإختلافات ولكن أعتقد أن وجود الإثنين يمثل تكرار لا غير

(...)

موضوع الوراثه من ال Shape أعتقد أنه مجرد بيروقراطية لا لزوم له

و انا ايضا من نفس الرأي

اقتباس
انا رى ان فئه Vector2D هي نفس فئه Point2D ولكن مع اضافه الاتجاه

لا اخوي, الـ vector (متجه) هو في حد ذاته الاتجاه (و ليس الاتجاه اضافة عليه).

سؤال: هل هناك كود مكتوب لحد الان ام مجرد نقاش؟

تم تعديل هذه المشاركة بواسطة hasan_aljudy في 28 سبتمبر 2009 في 00:21

#25

أنا طرحت رأي من قبل ولكن أريد فقط أن أوضح شيئ

إستخدام Vector2D لا ينفع لجميع الحالات

فمثلا إستخدامه ينفع عندما نستخدمه ليمثل موقع شخصيه حيث أنه سيمثل الموقع و الإتجاه (إتجاه النظر)

بينما لو أردنا إستخدامه ليمثل مركز دائره ما فلن ينفع ذلك لأننا سنستخدم فقط نقطه واحده أما النقطه الثانيه سنتجاهلها

أنا لا أقصد إستحالة إستخدام Vector2D في تلك الحاله ولكن إستخدامه مثل إستخدام مربع لتمثيل موقع شخص بستخدام إحد رأوس المربع الأربع وتجاهل النقاط الثلاث الأخرى

هذا مجرد رأي لا أكثر

تم تعديل هذه المشاركة بواسطة hunterxhunter في 28 سبتمبر 2009 في 00:48

مواضيع مشابهة