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

حزمة المحرك Aanimation

بدأه علاء الصالحي في 1 نوفمبر 2008 · 36 رد · 4,561 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#26

أكثر ما دوخني في الكود هو مسألة الEvents، خصوصا طريقة النداء على الدوال الخاصة بها. فمثلا داخل الدالة doEvent تستعمل Method.invoke؟؟ :wacko: والله دخت.

ما أصعب قراءة وفهم كود كتبه شخص آخر :blush:

#27

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

اتمنى ان تتابع على هذا المنوال ولا باس بان تطرح الحزمة باللغة الانكليزية ايضا ولكن يجب ان يعرفو ان مصدر الحزمة عربي

بالتوفيق

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#28

لك علي أن أشرح الطريقة يا عصام

لكن أعطني صورة السيارة لكي أعمل مثال بسيط لك

شكراً يا رامي على الدعم المعنوي

وسأحاول أن أطرح مجموعة من الأمثلة على الحزمة

ربما يعنيك الموضوع لو تعلق الأمر بـ JApplet :lol:

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#29

لماذا لا تاخذ صورة السيارة من الصورة التي وضعها؟؟

باسوئ الاحوال اعمل برنت سكرين يا اخي!

تقدر تعملها اي امتداد تريده اعملها png واشتغل

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#30

ياه يا رامي حرام عليك

أنا أصلاً مكسل أعمل المثال

وبقول يا رب ما يجيب الصورة عصام

يا رب ما يجيب الصورة عصام :lol:

ايش أعمل فيك أنا

يلا بما أنك فقستني مضطرين نعمله للمثال :(

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#31

أنا ما جبت الصورة حتى ما تعمل المثال :wink: لأن هدفي كان فهم الكود وليس استعماله

#32

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

في موضوع ما :) ، اثار الاخ علاء هذه النقطة :

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

وهذا المكون يتم تحريكه على الحاوية

يمكنني التفكير في طريقة للتغليف تشبه تماماً الطريقة المستخدمة في java2d

لكي يكون في وسعي الاستفادة من AAnimation في العمل هنا

لك المشكلة أنه وكما فهمت من شرحك فإن OpenGL يقوم بالرسم داخل تكرار

وهذا شيء سيء جداً

لأنه يستهلك المعالج استهلاكاً كبيراً

لاحظ في java2D عملية إعادة الرسم تعتمد على طلب نظام التشغيل وهذا هو النظام المتبع في غالب لغات البرمجة

هل فهمي صحيح في هذه النقطة؟؟ أم أن هناك حلول أخرى تحسن من هذا الأداء؟

أم أن برمجة الألعاب لديها طريقة أخرى في الفهم

فرد عليه الاخ الكون قائلاً :

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

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

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

تعليقي :

كما قال الاخ الكون ، في برمجة الالعاب في الغالب نستخدم Loop لتحديث الاجسام في كل لحظة ( تحديث المواقع - عمليات الذكاء - الفيزياء - الرسوميات .. الخ ) لانك في بيئة تفاعلية .

في برامج الرسم الاخرى .. نحدث الرسوم .. فقط اذا وقع الحدث paint ، أي عند اعادة رسم النافذة لأي سبب .

اترك مسألة التوافق بين توقيتك وتوقيت محرك ألعاب مثلاً .. لانها معقدة قليلا .. وتحتاج الى نقاش موسع .

النقطة التي يجب أن تتغير في الحزمة هي اعتمادك على Component في المحرك وهي حالة خاصة من حالات أعم .

يجب أن تحرك شكل عادي ، يمكنك أن تستقبل كائن من نوع Point له احداثيات x و y .

وبالتالي يمكن استخدام الحزمة في أي مكان .. اعزلها عن GUI الخاص بالجافا .

ثم لامانع أن تدعم Component ولكن كحالة خاصة في المحرك للتسهيل فقط على المستخدم النهائي .

هذا رأيي في الموضوع .

لي عودة ان شاء الله .

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#33

هذا الكلام سيئ جداً يا عبد الله

أحتاج إلى شيء يحتوي أكثر من شيء

بمعنى أحتاج إلى شيء يجمع مجموعة الأشياء

لو لم أقم باستخدام Component ففعلياً سأتشجم إنشاء واحدة خاصة بي

لهذا لم أقم بذلك هنا في java2D

يفترض أن تكون OpenGL تحتوي على شيء كهذا

سأعطيك مثال لعبة ماريو الشخصية المتحركة هي ماريو

هذه الشخصية تتحرك على عدة مستويات

فهي مثلاً تمشي أي الجسم كله يمشي

ستقول لي الشخصية عبارة عن صورة

هذا خطأ بالتأكيد الشخصية عبارة عن مجموعة من الصور تمثل الشخصية ككل

لماذا لا تكون صورة واحدة؟

لأن هناك بعض الأجزاء في الشخصية تتحرك بطريقة بشكل منفرد عن باقي الصورة

كالرجلين مثلاً

الرجلين تتحرك في إطار الجسم والجسم يتحرك في إطار الصورة الكلية

لهذا اقترحت أن يكون العمل على Container و Component هذا من شأنه أن يسهل على المبرمج

عدا عن ذلك فأنا كمستخدم للحزمة مضطر أن أحرك كل عنصر فيها على حدة

يجب أن نجد حلاً في OpenGL وليس أن أغير الحزمة

حتى لو اضطررنا أن نقوم بعمل شيء شبيه بالمكون Component هناك

ربما أكون مخطأً لذا رجاءاً قومني

أو وضح لي وجهة نظرك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#34

أنا لم أتعمّق كثيراً في دراسة لماذا تستخدم Container .

لكن حسب ما فهمت ، أنك فقط تغيّر احداثياتتها ( تستخدم setLocation و setDimension وماشابههما ( لا اذكر اسماء الدوال بالظبط ) .

لذلك اذا كان هذا هو الواقع فأظن انه يمكنك أن تعمل التالي : ( كل ما أقوله مجرد رأي .. قد يحتمل الخطأ .. أحتاج الى مراجعة أكثر لقلب المحرك) :

1- تستبدل Container أو Component بكلاس بسيط اسمه مثلا Shape أو حتى Point

2- المحرك يقوم بتحريك هذه النقطة .. يقوم بتغيير احداثياتها .

3- انتهى دور المحرك ..

4- أقوم برسم النقطة بعد تحريكها .

5- نعود الى 2 .

نأتي لصورة سوبرماريو المتحركة .. هو يتحرك الى اليمين :

1- المحرك يقوم بتحريك نقطة Point .

2- انتهى دور المحرك .

3- تجعل احداثيات الصورة ( مركزها مثلا ) مساوي لاحداثيات النقطة Point .

4- ترسم الصورة ..

5- بعد مدة معينة تقوم بزيادة الفريم frame بمقدار واحد لرسم اطار الصورة التالي .

6- نعود الى 1 .

رسم Component عادي .

1- المحرك يحرك نقطة .

2- انتهى دور المحرك .

3- ترسم Component ويكون موقعها مساوي لموقع النقطة .

4- تعود الى 1 .

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

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

المشكلة الحقيقية هي بالتالي :

لو كنا نريد استخدامه مع OpenGL في محرك الاندلس ، فاننا سنقع بين مؤقتين مختلفين .. لذلك يجب أن يملك المحرك مرونة في هذا الجانب بحيث يمكن استخدامه للالعاب التي تعتمد على loop وليس مبدا اعادة الرسم .

أما Container لايمكن استخدامها داخل OpenGL بأي حال من الأحوال ..

عموماً .. مثل ماقلت .. أحتاج للاطلاع على محركك بشكل أكبر .. يبدو أن هناك شيء لم أفهمه بعد .

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

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#35

لماذا أستخدم Component و Container

لأن Container يساعدني على تجميع مجموعة الأشياء المتحركة في مكان واحد

وهذا يسمح لي بإنشاء التحريك على عدة مستويات

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

ولأن Component تمكنني من رسم مجموعة أشكال في مكان واحد وهذا بدوره يساعدني على تحريك هذه الأشكال مع بعض

محركي فعلياً لا يرسم أبداً وليس له علاقة بالرسم

بالنسبة لموضوع النقطة المتحركة لست أفهم المغزى بالضبط

لذا أخبرني إن كان التالي هو ما تقصد

تقصد أن نقطة بداية الرسم للشكل هي من يتغير وبالتالي يتغير موقع الشكل

ويصبح كأنه يتحرك

هذا فعلياً ما أقوم به هنا أنا أغير مكان Component

لكي أكون صريحاً معاك أظن أننا بحاجة إلى إنشاء Component ,Container في OpenGL

لكي نحصل على محرك ألعاب ممتاز

بالمناسبة هل لديك أمثلة على محركات تعمل على جافا مفتوحة المصادر

وتدعم OpenGL

ربما نستفيد من شيفرتها

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#36
اقتباس
تقصد أن نقطة بداية الرسم للشكل هي من يتغير وبالتالي يتغير موقع الشكل

أقصد أن صورة سوبر ماريو .. تحرك فقط نقطة واحدة فيها ( تحرك صورة عادية ) .. أي أنك تحرك مثلا نقطة المنتصف فيها .

ما علاقة أقدام الصورة .. هذا لم أفهمه .

هذه صورة سوبر ماريو :

post-42837-1254209728_thumb.gif

post-42837-1254209739_thumb.gif

post-42837-1254209751_thumb.gif

عندما نحرك الصورة .. نحن نحرك موقع الصورة ( في الغالب النقطة اليسرى العلوية .. وستتحرك الصورة )

كلما تحركت الصورة .. مثلا بعد نصف ثانية من الحركة .. نقوم بالانتقال الى الصورة التالية لايهام المستخدم أنه يتحرك .

محركك فقط يحرك نقطة .. والمستخدم النهائي يحصل على احداثيات هذه النقطة ويسندها للصورة .

عموماً أخ علاء .. أحتاج لدراسة معمقة للمحرك وكيف يعمل .. واحاول اعمل عليه كم مثال .. حتى لا أشتتك .. قد أكون في وادي اخر وأنا لا أعلم :D .

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

أتمنى أتفرغ يوم الجمعة أو الخميس لأعمل مثال وأدرس المحرك .

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

شاهدت بعضها .. ولكن لايعلق بالذاكرة الكثير الان ..

لكن الى أن أعثر على محرك جيد .. شاهد هذا الموقع :

http://www.devmaster.net/engines/list.php?fid=6&sid=1

حيث مستودع المحركات .. تجدها هناك ;)

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#37

في برمجة الألعاب لا يقومون برسم صورة لكل حركة

لأن هذا يستنفذ الذاكرة

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

في انتظار أمثلتك

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…