بسم الله الرحمن الرحيم
مشروع تطوير محرك الألعاب الذري
Atomic Game Engine
بسم الله الرحمن الرحيم
مشروع تطوير محرك الألعاب الذري
Atomic Game Engine
تم تعديل هذه المشاركة بواسطة الشمري في 28 يونيو 2007 في 14:50
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم ورحمة الله وبركاته
فائدة الموضوع :
تطوير محرك ألعاب لتطوير ألعاب ثنائية البعد .
اللغة : C++ .
المكتبات : OpenGL – SDL – DevIL – OpenAL – FTGL بالاضافة الى Win32 API .
المترجم الذي سأعمل عليه : Visual Cpp 2005 .
سبب التسمية :
فكرة تسمية المشروع بالمحرك الذري " Atomic Game Engine " كانت من أحد زملاء الدراسة .. في الثانوية .
كنت أتحدث معه عن طموحاتي وأني أنوي تطوير محرك ألعاب ولكني محتار في تسميته .. قال ساخرا " سمه المحرك الذري Atomic Engine "
وذلك لاننا في ذلك اليوم أخذنا في مادة الانجليزي معنى كلمة Atomic .. ومن ذلك الوقت وأنا أحاول تحويل هذا الحلم الى واقع .
الطموح والواقع :
الطموح هو انشاء محرك يحمل ثلاثة صفات أساسية :
- قابل للتطوير لانتاج العاب ثنائية وثلاثية الابعاد بجودة عالية وباستخدام OpenGL و Directx .
- قابل للعمل على أكثر من مترجم وعلى أكثر من نظام تشغيل وقابل للتكامل مع أي مكتبة تتعلق ببرمجة الالعاب والجرافكس .
- سهل التعلم , سهل التطوير , بعيدة عن الاكواد الفلسفية .
الواقع :
هو الان سيكون ان شاء الله عبارة عن
Hardware accelerated 2D graphics
لماذا ورشة عمل :
يوجد ثلاثة أسباب لوضعي هذا المشروع كورشة عمل :
1- حثا للذات .
2- تحريكا للقسم .
3- الحصول على المساعدة منكم اذا وقعت في مشكلة .<< أهم شيء :)
العدة والعتاد :
- مكتبة جرافكس وحاليا سنستعين بالOpenGL .. ولاحقا سيتم دعم DX اذا استطعت ذلك .
- مكتبة تربطنا بالنظام ( أي نظام تشغيل ) . . وسنستعين الان بالWin32 API و SDL .
- مكتبة لتحميل الصور وسنستعين الان بال DevIL .
- مكتبة لتشغيل الاصوات والظاهر أني سأستخدم الOpenAL .
- مكتبة لتصيير النصوص على النافذة ( وهي مكتبة FTGL ) وسأستغني عنها لاحقا اذا تمكنت من تطوير مكتبتي الخاصة .
تصميم المشروع :
المشروع سيتم تقسيمه إلى مجموعات .. كل مجموعة هي عبارة عن namespace يحمل مجموعة من الinterfaces و classes .
ولا أحفيكم أني متأثر كثيرا بطريقة المحرك irrlich
أولا :
namespace : kernel
هذه الkernal ستضم عدد من الواجهات والكلاسات الأساسية للمحرك مثل :
الواجهة : IDevice الذي سيربطنا بنظام التشغيل .. ويقدم لنا الخيارات الضرورية للانطلاق بالمحرك ,
واجهة أو كلاس Input الذي سيكون الوسيلة للوصول للمدخلات .
كلاسات اخرى مثل CImage و Position2d و Color و Rect الخ .
namespace :render
هذا الrender سيضم عدد من الواجهات والكلاسات التي هي عبارة عن تغليف للمكتبة التي سنستخدمها للتصيير Render .
أيا كانت هذه المكتبة ( Directx Rendering – OpenGL Rendering – Software Rendering ) .
وحاليا سنكتفي بالOpenGL . . وهذه نظرة على الrender :
الواجهة IRender / واجهة لمكتبة الجرافكس .. مهمته تنفيذ الاوامر الاساسية ( مسح – رسم أشكال – الخ ) .
الواجهة IFont وأبنائها / وهي لتصيير الخطوط .
الواجهة ITexture / واجهة لانشاء الاكساء .
namespace : helper
كلاسات مساعدة .. وحتى الان لم أقرر ماهي .. لكن الارجح أنها ستكون Sprite + Animation Sprite + Particles System الخ .
namespace : sound
للاصوات .
namespace : io
للتعامل مع الملفات العادية والمضغوطة .
namespace :network
للشبكات .
namespace : video .
للفيديو .
طبعا ليس الهدف هو التبختر بهذه الكلاسات . . لكن هي مجرد نظرة عامة .. ممكن بعضها أعجز عنها وأتركها .. مافيه إشكال .
هذه صورة لما سيبدو عليه الأمر . (مارأيكم بالتصميم جلست عليه مدة طويلة :) )
وهذا مايجري خلف الكواليس
CSDLDevice implements IDevice
CWinAPIDevice implements IDevice
COpenGLRender implements IRender
COpemGLTexture implement ITexture
وهذا هو شكل المحرك أثناء التنفيذ ( المقترح ) :
age::kernal::IDevice *device = createDevice(age::AGE_OPENGL_SDL,400,400,0,false);
age::render::IRender *render = device->createRender();
render->setBackgroundColor(age::kernal::Color(0,0,0,255));
render->activeOrthoProjection(0,400,0,400);
SDL_Event event;
age::render::ITexture *test = render->createTextures();
age::kernal::CImage image;
image.initialize();
image.load("r.bmp");
image.generateColorKey(age::kernal::Color(237,0,140,0));
bool result = test->createTexture(image,age::render::AGE_MIPMAPS,age::render::AGE_REPEAT);
if(!result)
printf("error");
image.free();
while(1)
{
while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
SDL_Quit();
exit(0);
break;
}
}
// draw
render->beginRender();
render->draw2DPoint(222,222,age::kernal::Color(255,255,0,100),4);
render->draw2DLine(0,0,100,100,age::kernal::Color(255,0,0,255),1);
render->drawWireRectangle(0,0,300,300,age::kernal::Color(0,255,0,255),2);
render->setBackgroundColor(age::kernal::Color(122,0,0,231));
render->drawImage(0,0,200,200,age::kernal::Color(255,255,255,255),true,test);
render->drawImage(100,100,300,300,age::kernal::Color(255,0,255,100),false,"Crate.bmp");
render->endRender();
}
return 0;
}طبعا أكيد أنه يجب عمل تغليف حتى للinput .
تم تعديل هذه المشاركة بواسطة الشمري في 28 يونيو 2007 في 15:01
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
مايحتاجه القارئ لكي يقوم بتجريب المحرك أثناء التطوير :
كل ما تحتاجه هو كالتالي :
1- سأضيف لمرة واحدة فقط جميع ملفات lib و h و dll التي تحتاجها .. وماعليك الا تحملها وتنزلها على جهازك .
هذه هي الملفات .
بعد أن حملتها ستجد مجلد اسمه Atomic Game Engine ستجد هناك عدة مجلدات بداخله .
اتبع التالي :
1- افتح المجلد Dlls .. وقم بنسخ جميع الملفات الى المسار :
Windows / system32
الان أنت جاهز لتجريب المحرك .
2- في كل مشاركة سأقوم بتنزيل مجلد اسمه AGE Project .
حمل هذا الملف وألصقه داخل المجلد Atomic Game Engine ,, وسيطلب منك الويندوز استبداله .. اختر نعم .
حيث سيحوي هذا المجلد اخر التحديثات + التجارب . .. بالتالي تستطيع ترجمة الكود وتجريبه والتعليق عليه .
في حال واجهت أي مشاكل أبلغني .
علما أن المحرك سيتم تجريبه على المترجم visual studio 2005 ( مترجم السي بلس ) .. فقط .
أتمنى تتحفونا باقتراحاتكم وخبراتكم ودعمكم ( ) .. حتى يتحقق الحلم .
بسم الله نبدأ .
تم تعديل هذه المشاركة بواسطة الشمري في 28 يونيو 2007 في 14:48
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
هل ممكن ترسل لي كود المصدر :) ؟
انا كنت و مازلت من مؤيدي عمل محرك العاب خاص بنا نطوره و إعتبرني اول عضو في فريقك
و هذا الرابط يذكرك :lol: /index.ph...mp;#entry556895
أخيكم في الله ;
NubiaPrince
أحمد اسامة
تم تعديل هذه المشاركة بواسطة NubiaPrince في 29 يونيو 2007 في 04:16
' و على الله فليتوكل المؤمنون '
* فريق الجرافيك الحاسوبي العربي الإسلامي * the Arabic-Islamic Computer Graphics - A I C G
イスラム教は平和を意味する
이슬람교는 평화를 의미한다
Ислам означает мир
السلام عليكم
إذا كنتم تريدون أن تطورو محرك ألعاب كامل (3D and 2D Graphics , Sound , AI , Scripting , Physics ...) أنصحكم بتقسيم المحرك إلى أكثر من شخص . أعني شخص أو أكثر على الجرافيك و آخرون على الذكاء الإصطناعي و آخرون على الأصوات وهكذا ... أي توزيع المشروع
و أيضا لا تطمحو كثير فمثلا لا تفكرو أن تصنعو الإصدار الأول من المحرك مثل محرك OGRE 3D , أصنعو محرك بسيط ومن ثم طورو عليه إلى الإصدار الثاني ومن ثم الثالث وهكذا .... , و أيضا أنظرو كيف صنعت المحركات مفتوحة المصدر ( أنا أفضل irrlich لأنه سهل التطوير و محبوك بطريقة عبقرية تعتمد على OOP )
و السلام عليكم
NubiaPrince كتب:هل ممكن ترسل لي كود المصدر :) ؟انا كنت و مازلت من مؤيدي عمل محرك العاب خاص بنا نطوره و إعتبرني اول عضو في فريقك
و هذا الرابط يذكرك :lol: /index.ph...mp;#entry556895
أخيكم في الله ;
NubiaPrince
أحمد اسامة
بالنسبة للكود المصدري فلم أبدأ بعد حتى ارسله لك :) ..
أتمنى لو يتم تطوير محرك الصوت والامور الاخرى .. وهذا امر يسعدني ,,
لكن الجرافكس بالذات .. مايصلح يطورها الا شخص واحد .. لان الاذواق تختلف والافكار تختلف .. فمن الصعب التوفيق بين كل الرغبات ,
لازلت اقول ... أكون سعيد جدالو تم تطوير جزئيات اخرى مثل الصوت ..
اقتباسأنا أفضل irrlich لأنه سهل التطوير و محبوك بطريقة عبقرية تعتمد على OOP
نعم .. وأنا استلهم منه كثيرا من الافكار .. هو فعلا محرك عبقري بما تعنيه هذه الكلمة ,
---------------------------------------
هذه الخطوة الأولى .
• قمت بعمل interface اسمها IDevice وعملت لها implementation وسميت الكلاس CSDLDevice .
هذا الكلاس مهمته بناء النافذة وربط OpenGL بالنظام . . وغير ذلك من الأمور الروتينية .
هذا الكلاس لايسمح بإنشاء نافذة الا لتطبيقات OpenGL فقط .
بقي أن نعمل كلاس آخر اسمه CWinAPIDevice يستعمل الWin32 APIs .
• واجهتني مشاكل مع الSDL ..فمثلا حاولت ان احصل على ابعاد الشاشة الحالية .. ولم اجد طريقة لذلك الا بالWIN32 API ..
أحتاج لوقت أكثر لتنظيم هذا الكلاس.
• أيضا هناك بعض الخدمات في الكلاس لم أنتهي منها بعد مثل getListModes .
• عملت كلاس اسمه Rect وهو يستخدم مع الأبعاد ( x,y ,width ,height ) .
• هذه قائمة بالMethods التي تحملها الواجهة IDevice :
virtual void closeDevice()=0; virtual void setWindowCaption(char* title)=0; virtual char* getWindowCaption()=0; //virtual bool isWindowActive()=0; virtual SMonitorInfo& getMonitorInfo()=0; virtual Recti* getListModes()=0;
• سأضيف كلاس للinput ومن بعد ذلك سأعرف كيف يمكنني تطوير الواجهة IDevice .
وهذا test للمحرك حتى الان :
int main( int argc, char* argv[] )
{
age::kernal::IDevice *device=age::createDevice(age::AGE_OPENGL_SDL,400,400,32,false);
device->setWindowCaption("Atomic Game Engine ");
char *text=device->getWindowCaption();
cout<<"tite :" << text <<endl;
age::kernal::SMonitorInfo info=device->getMonitorInfo();
cout<<"bits: "<<info.bits<<endl;
cout<<"screen width: "<<info.screenWidth<<endl;
cout<<"screen height: "<<info.screenHeight<<endl;
glViewport(0,0,400,400);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,400,400,0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
SDL_Event event;
while(1)
{
if(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
SDL_Quit();
exit(0);
break;
}
}
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,0);
glColor3f(1,1,0);
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(100,100);
glEnd();
SDL_GL_SwapBuffers();
}
device->closeDevice();
delete device;
return 0;
}المرفقات .
"" قم بتحميل المجلد وألصقه داخل المجلد Atomic Game Engine ..سيطلب منك الويندوز استبداله .. اختر نعم .. راجع المشاركة رقم 3 لمزيد من التفاصيل""
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
أرى أن ما تم طرحه كمشروع هو مجرد مكتبة رسوميات أو بالأحرى قشرة تتعامل مع OpenGL أو Direct3D لا أكثر، وهذا الأمر قد ينجح إذا أردت بيع برنامج له GUI لمن لا يريدون كتابة أو تعلم برمجة أيا من OpenGL و Direct3D .. ناهيك عن أن الأداء سيكون أضعف لأنه قشرة، ولكي تحصل على أفضل أداء (وأنت تعرف ذلك) عليك إلغاء الوسطاء بينك وبين أيا من OpenGL أو Direct3D ...
أقترح أن نزيل مكان المشروع من هنا إذا كان القصد هو محرك لعبة، ووضعه في القسم العام، وترك أمور الغرافيكس للآخر فهي لا تشكل سوى جزء من محرك اللعبة (مهما كانت أهميتها).
في محرك لعبة حقيقي علينا إيجاد حل لأول مشكلة، من أين سنأتي بالـ Geometry أو 3D objects؟ وكيف سننظمها كملفات خاصة يستخدمها المحرك؟
لاحقا هناك مكتبات الرياضيات والفيزياء والذكاء الاصطناعي وبنية مراحل لعبة..إلخ
لم أر هذا مطروحا في المشروع؟!!
السلام عليكم
و عاد الحلم الذي يراود اذهان الكثير من المهتمين بالجرافيكس
حلم انشاء محرك العاب
في الحقيقة انا كنت من الشغوفين بهذا النوع من البرمجة و قد قمت فعليا بتصميم محركين بسيطين و الثالث هو المحرك البركان الذي يقبع في موضوع هنا في هذا المنتدى
و بصراحة شديدة اصبحت افقد الحماس لمثل هذا النوع من المشاريع لانه و بصراحة ما الفائدة من تصميم محرك لن يستخدمه غيرك من سيستخدم محرك بسيط مقارنة بالمحركات الكبيرة المتوفرة
ارى ان تقوم اخي الشمري بتصميم لعبة افضل من تصميم محرك .
نقطة اخرى تطفو على السطح الا و هو ان المشاريع الجماعية عن طريق المنتديات اثبتت فشلها الذريع
عموما سأكون متابع للموضوع و اتمنى له النجاااااااااااااح من كل قلبي
بالنسبة للاخ عربي عربي
ما ذكرته حول محرك لعبة حقيقي هو ما يطمح له الاخوان فعلا
ولكن البداية هي تنظيم كيفية انشاء البرنامج و التعامل مع المدخلات و الصوت و الاشياء الاساسية
و لاحقا يتم تضمين المحرك (اذا كتب له النجاح ) بالاشياء التي ذكرتها مثل قراءة ملفات 3D و مكتبة فيزيائية و محرر للمراحل و غيرها
دع المشروع يرى النور في البداية :)
تحياتي
إلى الكون... حلوة هذه العبارة (إلى الكون)..
صدقني أنا متحمس لهذا المشروع، ولكن ما أراه مشكلة هو أننا نتجه فورا للتعامل مع مكتبة الرسوميات!!
إذا استطعنا حل المشاكل الأخرى بدون الاقتراب من OpenGL وDirect3D نكون قد نجحنا..
أقترح أن تكون البداية هي إنشاء (كائن، غرض، جسم..أي كلمة) برمجي للمجسمات ثلاثية الأبعاد، والتعامل مع الأشكال الـ 2D على أنها مجسمات ذات ارتفاع مساو للصفر.
هذا الكائن البرمجي عليه التعامل مع أصغر عنصر Vertex إلى أكبر عنصر Polygon وما بينهما.
من هنا تكون نقطة الانطلاق..
1- باتجاه الرسوميات (وهذا طبيعي)
2- باتجاه الفيزياء (لأنه الكائن الهندسي الذي يقع عليه الفعل الفيزيائي)
3- باتجاه الذكاء الاصطناعي (لأن نقطة المركز فيه هي التي ستخبر الدماغ عن مكانه في العالم)
4- باتجاه قاعدة بيانات اللعبة (لأنه المجسم الذي ينعكس عليه تمثيل المتغيرات التي تتفاعل خلف الكواليس)
5- باتجاه التصميم المحترف (مثل الدول المتقدمة، حيث تنشئ المجسم ببرنامج محترف مثل 3dmax وتحوله لصيغة يقرؤها المحرك الخاص بك، أي هذا الكائن البرمجي).
6- باتجاه فراغ ومكان وبيئة اللعبة (لأن الكاميرا سترى هذا المجسم، قبل أن يكون هنا ما يسمى بـ OpenGL أو Direct3D عليك أن تتمكن من التعامل مع فضاء (الموقع) وأدوات (الكاميرا والمجسم) اللعبة)
هذا ما قصدته من الابتعاد عن الرسوميات.
السلام عليكم
أخي عربي عربي أرجوا أنك تغير إسمك إلى مبدع مبدع
في الحقيقة ماذكرته هو ما أعمل عليه حاليا حيث إني بدئت بعمل محرك ألعاب ومحرر خرائط
حيث ملخص ماسئعمله(وعملة بعضه ) أني أحدد موقع الكائن في الفضاء ثم أدرس هذا الموقع منحيث كشف التصادم إرتفاعأي بمعنى آخر (صلاحية الموقع ) ... وغيرها
ثم أنتقل إلى الذكاء الإصطناعي على مستوى الشخصية ثم الذكاء الإصطناعي على مستوى الجماعه وهذا مايسمى (بالشبكة العصبونية (العصبية)) ثم أنتقل إلى حركة الكائن وهو ناتج من الذكاء الإصطناعي
ثم سأعمل المحرك فيزيائي بسيط
قد يقول البعض لمذا تعمل محرك فيزيائي بسيط ؟
لأن اللعبة لاتحتاج عمليات فيزيائية معقدة
وهذا عملته قبل سنه أو سنه ونصف حتى إذا كان يذكر الشمري ولكن سأعدله وأطوره قليلا
ثم سأنتقل إلى opengl وسأعمل الإضائه وضباب... وغيرها .
أي ملخص الكلام إجعلوا شعارك أنك تستطيع عمل كل شيء فقط بالكونسول
إلا الجرافيكس فراح تستخدم opengl أو dx
أيضا عندما نقول كائن الأغلب راح يتخيل مجموعة من النقاط التي تكون مجموعة من المثلثات التي تكون مجسم ما
ولكن هذا التخيل خاطئ بل يجب أن تتخيل أنه مادة ما لها خصئص مثل :
موقع ,ذكاء , وبما أنها ماده إذا تطبق عليها القوانين الرياضية والفيزيائية ,شكل ... وغيرها
الكلام يطول ولكن في الأخير الراي راي أخي عبد الله
وأنا أعتقد بل متأكد أنه لو عمل محرك راح يعمله أفضل من محركي
ولا تنسوا أن برمجت الألعاب فن وإبداع وليس منهج دراسي تذاكر كذا.. وتعمل كذا.. لكي تنجح
أي أن جميع الآراء صحيحه
أخي hunterxhunter قد تظن من كلامي أني شخص عنيد، وهذا صحيح، ولكن هناك نقطة هامة جدا في التخطيط لهذا العمل وهي اختيار نقطة البدء، وكمبرمجين يجب أن نكون قد استوعبنا ما تعنيه كلمة "تجريد" abstraction ولب برمجة ال oop وبالتلي لا يعقل أن أكرس برنامجي لخدمة OpenGL أو DirectX لأننا سنكتب الكود كلها لتحترم هذه المكتبة أو تلك ونقع بعدها في مأزق كبير وهو أن الكود الذي كتبناه لن ولن يتوافق مع مطلبنا كمحرك لعبة أبدا... أي مكتبة رسوميات هي في عداد "تحصيل حاصل" ولا تستحق أن تكون نقطة بدء.. ماذا لو أردنا بعد فترة من تكريس الكود لأحد المكتبات أن نعمل من أجل PS3 مثلا؟ لن نستطيع... ببساطة يجب فصل وبشكل حاسم محرك اللعبة عن الرسوميات..
لقد وضعت هذا الموضوع لأثبت وجهة نظري لا أكثر:
لم أعتمد على أي مكتبة رسوميات في هذا المثال.. ولكن واضح جدا أن ما فعلته يمكنني وبسهولة لاحقا نقله إلى دايركت أو أوبن جي إل لأني لم ألتزم بهما، فقد أسست صيغ 3D خاصة بي وجعلت المعالج الفيزيائي والرياضي(الذي يرسم بشكل 3D) يتعامل مع هذه الصيغ، وبالتالي يمكن لي لاحقا أن أنشئ برنامج يقوم بقراءة هذه الصيغ ويرسلها لل OpenGL أو DirectX أو GDI أو أي شيء آخر.
مرحباً, :)
لقد تعلمت درساً على مر السنين, وهو أن لا أحاول أن أعيد إختراع العجلة, بدل كتابة محرك فيزياء كامل مثلاً تستطيع إستخدام عدد من المحركات التي يعمل عليها بروفيسورات في علم الفيزياء والبرمجة (حرفياً) وهي مجانية وقد إستمر تطويرها عدة سنين ولا تزال غير كاملة رغم ذلك, فكيف سيقوم شخص واحد بصنع محرك فيزياء بالقدرات المطلوبة والسرعة المطلوبة وبزمن قصير؟ ذلك صعب جداً بل إنه قريب من المستحيل.
كذلك الصوت, وكذلك الشبكة وحتى الرسوميات...
مع ذلك فأنا لا أريد أن أكون سلبياً. وسأشارككم هذا المشروع لو أصبح العمل جماعي رغم إني جديد هنا في هذه المنتديات.
المهم في مشروع كهذا هو ما الهدف بالضبط؟ هل تريد صنع محرك كامل مجاني مفتوح المصدر؟ أم محرك تجاري؟ أم محرك خاص ستقوم ببناء لعبة فوقه عند إكتماله؟ أم فقط للتعلم وزيادة الخبرة؟
لدي انا شخصياُ فكرة تطوير محرك ألعاب حقيقي, بإستخدام محركات جاهزة وقوية للرسوميات, الفيزياء, الصوت, الشبكة, والإدخال أجمعها كواجهة واحدة, ثم أقوم بكتابة محركات ثانوية حسب الألعاب, مثلاً واحد للألعاب الثنائية الأبعاد, واحد لألعاب سباق السيارات, واحد لألعاب المغامرات, واحد للألعاب الستراتيجية, وهكذا وكل هذه المحركات تتشارك في الواجهة والأدوات نفسها ولكن تمتلك مميزاتها وأدواتها الخاصة, مثلاُ لسباق السيارات سيكون هنالك ميكانيكية للذكاء الصناعي للمتسابقين, للألعاب الثنائية الأبعاد سيكون هنالك محرك Tiles مثلاً, وهكذا.
والأهم من هذا هو إني لو قمت بتنفيذ مشروع بهذا الحجم, سأجعله مجانياُ مفتوح المصدر ويمكن لأي شخص مؤهل أن يشارك في تطويره.
قد تتعجبون عند معرفة إن محرك كهذا غير موجود تقريباً, هنالك محرك واحد حاول ونجح تقريباً ولكنه الآن أصبح تجارياً ومغلق بعد أن كان مجاني ومفتوح, وإسمه RealmForge ونوعه GDK أي Game Development Kit, وقد تم تغيير إسمه الآن ليكون Visual3D Architect .NET.
-waf
سعدت كثيرا بهذه المداخلات ..
أنا أفهم تماما مايفكر به الاخ عربي والاخ عبدالله ( hunter ) .
أنتم تريدون محرك ليس مجرد تغليف للOpenGL بحيث لو حدثت مصيبة للOpenGL سيذهب معها المحرك .
تريدون محرك مبني على كائنات وتراكيب ليس لها علاقة بمكتبة معينة .. انما هي قابلة للعمل على اي مكتبة واي نظام .
اذا كان هذا هو القصد .. فهذا بالظبط ما أسعى إليه .
وقد ذكرت ذلك في معرض كلامي عن طموحاتي :D ..
مثال :
لنفرض أننا قررنا أن نستخدم مكتبة جرافكس غير مكتبة OpenGL .. مثل dx او اي مكتبة ..
حينها كل ما علي أن اقوم بعمل implementation للواجهة IRender .. ونسميها مثلا CDXRender ..
مثال:
لنفرض اننا قررنا نقل المحرك الى اللينوكس .. حينها كل مانحتاج هو عمل implementation للواجهة IDevice .
مثال:
المحرك سيبنى بحيث يكون متوافق مع مكتبات فيزيائية معروفة مثل ODE - أو نيوتن .
ولعمل ذلك سيتم توفير عدة تراكيب مثل Vertex و BBox و Triangle و Matrix الخ الخ .
لكن في البداية سأعمل على IDevice و IRender ثم أبدأ بتطوير منطق المحرك .. أو لنقل الامور العامة للمحرك .
انا لا اسعى اطلاقا لعمل محرك فيزيائي او ماشابه .. لكن اريد فقط ان يكون للمحرك القدرة على التكامل مع المكتبات الاخرى ..
فمثل ماقال الاخ SandHawk .. يوجد مكتبات فيزيائية وصوتية قوية لايمكن ان نصل لمستواها الا بعد سنين .
لكن قد أوافق من يقول .. أنه يريد تصميم مكتبة فيزيائية لتكون اسهل في التطوير والاستخدام .. هنا معه حق .. وهذا هو أحد أهداف هذا المحرك ..
---------------
من ناحية أخرى ..
اعترف أنني لم اشرح تماما ماهو المطلوب من القارئ ..
لكن انا تعمدت ذلك .. لانه الجزئية الخاصة بالجرافكس .. من الصعب ان تجد اثنان يتقون عليها ..
وراجعوا كلام الاخ " الكون " في الرد السابق .
الجزء الخاص بالجرافكس سأقوم بتطويره بمفردي . . وهذا لايعني اني لا احتاج لمساعدة .
أما الاجزاء الاخرى فسأتركها الان ..
الفكرة من المشروع .. هو تطويره على عدة اجزاء .. وكل شخص يحب يطور نسخة خاصة منه . أو يعدل على النسخة الحالية .. فالامر مفتوح .
أما اذا جعلنا الموضع مجرد مناقشات فسيضيع الوقت ونحن لم نبرمج شيء ..
يمكن السؤال المطروح الان هو كيف أساعد ؟
الجواب هو بالتالي :
1- المحرك الان مفتوح المصدر .. بالتالي تستطيع التعديل عليه .. الاضافة له .. او تعمل ما تريد .
2- تستطيع تحميل المرفقات التي اضيف .. وقم بالنظر الى تصميم الكود .. واطرح رأيك عن طريقة تصميم الكود وتنظيمه .
3- تطوير جزئياتاخرى .. الصوت . الفيزياء.. الشبكات .. الفيديو .. I.O .. الخ .
4- تطرح رأيك في الديمو التي سأضيفها .
الخ الخ الخ .....
تم تعديل هذه المشاركة بواسطة الشمري في 1 يوليو 2007 في 17:45
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم .
هذه الخطوة الثانية .
الInput طلّعت روحي . وفجرت رأسي .
لم أستوعب تماما عمل الSDL مع الinput .
عموما التحديثات هي كالتالي :
• تعديلات على الواجهة IDevice (وعلى أبنائها بالطبع ) . . شملت إضافة عدة دوال جديدة وهي :
virtual bool run()=0; virtual void stop()=0; virtual bool isWindowActive()=0; virtual void minimizeWindow()=0; virtual void sleep(int ms)=0;
• بالنسبة للدالتين run و stop فأخذت فكرتهما من المحرك Irr , والهدف منهما هو معالجة الرسائل .. الدالة run تعيد false اذا حصلت على رسالة الخروج .
وتستطيع أنت ان تخرج من run وذلك باستدعاء الدالة stop .
• أما الدالة isWindowActive فهي تعيد true اذا كانت النافذة ( البرنامج) فعال .. والهدف من ذلك أنك لاتقوم بعمل render اذا كان برنامجنا ليس هو الذي يستخدمه المستخدم,, بالتالي نوفر على المعالج . .
أخذت كود هذه الدالة من مثال في موقع nehe (مثال اسمه nehe_sdl ) .
ملاحظة ! :
SDL تعتبر النافذة غير مفعلة عندما يتم تصغيرها فقط .. بالتالي يجب اعادة النظر في هذه الدالة في وقت لاحق ان شاء الله .
• الدالة minimizeWindow لتصغير النافذة .
• الدالة sleep ماهي الا تغليف للدالة المعروفة . . وهي تجعل البرنامج يتوقف عن الاستجابة لأي رسالة (حدث) لفترة تحددها أنت بالملي ثانية milliseconds أو لنقول جزء من الالف في الثانية .
الهدف من ذلك هو أن تتيح للمعالج فترة للراحة من الloop .. طبعا الافضل تكون الفترة قصيرة لاتؤثر على مسار البرنامج مثلا 1 ms .
• أضفت تركيب جديد هو Input يحتوي على تركيبين كما تلاحظون :
struct SKeyboardInput
{
bool enableKeyRepeat;
EKey key;
};
struct SMouseInput
{
public:
bool isLButtonDown;
bool isRButtonDown;
bool isMButtonDown;
age::kernal::Position2Di mousePos;
};
struct SInput
{
public:
SKeyboardInput Keyboard;
SMouseInput Mouse
};وأضفت التركيب Input الى الواجهة IDevice .
هنا واجهت مشاكل أكثر من عدد حروف هذا الرد ... مثال :
- مشكلة تكرار الحدث KeyDown .. بمعنى أنك لو ضغطت أي مفتاح لمرة واحدة فقط فان الحدث سيحدث أكثر من مرة ..
السبب معروف وهو يتعلق بتركيبة الرسالة WM_KEYDOWN .. راجعوا ال MSDN .
لكن حلها باستخدام sdl متعب .. بالرغم من توفر دالة SDL_EnableKeyRepeat .
عموما حليت هذه المشكلة باسلوب ما ادري وش لون صار .
- مشكلة أخرى ... مثلا لو ضغط المستخدم الزر Control + R .. هنا مافيه طريقة مباشرة لتلقي هذا الحدث ..
عموما ..
سأكمل تطوير الinput ولكن هذه التجربة للمحرك حتى الان .
device->Input.Keyboard.enableKeyRepeat=true;
device->Input.Mouse.enableClickRepeat=false;
while(device->run())
{
if(device->isWindowActive()==true)
{
device->sleep(1);
if(device->Input.Keyboard.key==age::input::AGE_ESCAPE)
device->stop();
if(device->Input.Keyboard.key==age::input::AGE_w )
x-=1;
if(device->Input.Keyboard.key ==age::input::AGE_s )
x+=1;
if(device->Input.Keyboard.key != 0)
cout<<(char)device->Input.Keyboard.key<<endl;
if(device->Input.Mouse.isLButtonDown == true)
{
device->minimizeWindow();
cout<<" LButtonDown "<<endl;
}
if(device->Input.Mouse.isRButtonDown == true)
{
cout<<" RButtonDown "<<endl;
}
if(device->Input.Mouse.isMButtonDown == true)
{
cout<<" MButtonDown "<<endl;
}
y = device->Input.Mouse.mousePos.y;
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(x,y,0);
glColor3f(1,1,0);
glBegin(GL_LINES);
glVertex2f(0,0);
glVertex2f(100,100);
glEnd();
SDL_GL_SwapBuffers();
}
else // not active
{
cout<< " our program is not active "<<endl;
}
}الى هنا نكتفي من الاساسيات .. الخطوة المقبلة هي الجرافكس :D
المرفقات .
قم بتحميل المجلد وألصقه داخل المجلد Atomic Game Engine ..سيطلب منك الويندوز استبداله .. اختر نعم .. راجع المشاركة رقم 3 لمزيد من التفاصيل
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
وعليكم السلام
أهلين أخي عبد الله
بالنسبة إللى المشكلة الأولى فهي موجود حلها في جميع دروس NEHE
اقتباس- مشكلة أخرى ... مثلا لو ضغط المستخدم الزر Control + R .. هنا مافيه طريقة مباشرة لتلقي هذا الحدث ..
تستطيع عمل متغيرات بولينية تدل على ضغط الأزرار ثمة تنفد الحدث إذا تحققة قيم هذه المتغيرات
وهذه الفكرة تنطبق على جميع مكتبات الإدخال
بالنسبة لinput خليها بعدين .. تحتاج وقت فراغ وكوب شاهي .
------------------------------
وهذه بعد خطوة جديدة.,
تم اضافة عنصر الجرافكس للمحرك . :huh: ..
يعني تقدر تشخبط على الشاشة وتسوي اللي براسك .
- تم اضافة واجهة اسمها IRender .
وعملت لها COpenGLRender .
ووفرت لها عدة methods . . وهي نسخة طبق الاصل من المحرك irr ... يعني صرت سارق أكواد :D .
لرسم الاشكال الثنائية الابعاد ( علما أن المحرك الان يدعم الشفافية .. )
virtual void setBackgroundColor(const age::kernal::Color& color)=0;
virtual void beginRender()=0;
virtual void endRender()=0;
virtual void setDrawDirection(age::render::EDrawDirection direction)=0;
//------------------------------
virtual void draw2DPoint(float x,float y,age::kernal::Color color,float pointSize =1 )=0;
virtual void draw2DLine(float x1,float y1,float x2,float y2,age::kernal::Color color,float lineWidth =1)=0;
virtual void drawWireRectangle(float left, float top, float right, float bottom,age::kernal::Color color,int lineWidth)=0;
virtual void drawSolidRectangle(float left, float top, float right, float bottom,age::kernal::Color color)=0;
المرحلة القادمة بإذن الله ستكون منعطف مهم لشكل وطريقة ادارتي للجرافكس ,
سأعتمد طريقة لانشاء مصفوفة الاسقاط Projection Matrix .
بشرط أن تدعم الان الالعاب الثنائية الابعاد .. وهنا فيه الكثير من حكة الرأس .
وسأرى ايضا بمسألة الview port .. هي سهلة .. لكن صعوبتها في تغليفها ضمن كائن ..
أيضا سأضيف methods أخرى لرسم الاشكال ستعطي المحرك مرونة أكبر لرسم أي شكل يريده المستخدم ...
بمشيئة الله .
عموما .. هذه تجربة للمحرك حتى الان .. والتجربة ركزت على IRender و Color
age::kernal::IDevice *device=age::createDevice(age::AGE_OPENGL_SDL,400,400,32,false);
device->setWindowCaption("Atomic Game Engine ");
age::render::IRender *render=device->createRender();
render->setBackgroundColor(age::kernal::Color(0,0,50,0));
while(device->run())
{
device->sleep(1);
if(device->Input.Keyboard.key==age::input::AGE_ESCAPE)
device->stop();
render->beginRender();
render->draw2DPoint(50,50,age::kernal::Color(255,255,0,255),2);
render->draw2DLine(10,10,10,200,age::kernal::Color(255,255,255,255),2);
render->draw2DLine(380,10,380,200,age::kernal::Color(255,255,255,255),5);
render->drawSolidRectangle(20,20,300,300,age::kernal::Color(255,0,0,100));
render->drawSolidRectangle(100,100,320,320,age::kernal::Color(255,255,0,40));
render->drawWireRectangle(200,200,250,250,age::kernal::Color(0,255,0,80),4);
render->endRender();
}
قم بتحميل المجلد وألصقه داخل المجلد Atomic Game Engine ..سيطلب منك الويندوز استبداله .. اختر نعم .. راجع المشاركة رقم 3 لمزيد من التفاصيل
تم تعديل هذه المشاركة بواسطة الشمري في 3 يوليو 2007 في 18:10
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم :
تأخرت كثيرا هذه المرة ولكن تأخري كان على قلة سنع .
أبرز الاضافات :
• قمت بدراسة معمقة للview port و Orthographic project , , :P والنتيجة هي :
OpenGL تعتمد بشكل عام على ان نقطة الاصل ( صفر , صفر ) هي في الجهة اليسرى السفلية . وهذا مطبق في اكثر من موضع مثل ال View Port و إحداثيات الاكساء و مواضع اخرى .
بينما المحرك .. سأبنيه على ان نقطة الاصل هي الجهة اليسرى العلوية .. بالتالي يجب ان يكون هناك توافق ..
عموما كل هذه الملاحظات يجب أن تؤخذ بعين الاعتبار ولكن ليس الان ..
• قمت بإضافة كلاسات عامة مثل Vector و Matrix وقمت باضافة namespace اسمه math واضافات عامة .. واعتمدت على الانترنت في تطوير هذه الكلاسات.
• أضفت عدة methods مثل رسم الدائرة .. و غيرها ..
• الان لا يستطيع المحرك أن يتحكم بشكل كامل في الOrthographic يعني مثل الازاحة والتدوير وغير ذلك .. ولكن اضفت method واحدة مهمتها ازاحة الProjection matrix ,, وهي تحل الازمة الى ان اطور المحرك بشكل افضل .
التحديثات بسيطة ولكن أساسية للتطويرات القادمة .. من الان وصاعدا سيتم تسريع وتيرة العمل .. لانه لو استمريت على نفس النهج .. فني احتاج لشهور لانجاز هذا المحرك ..
وهذا test Code للمحرك حتى الان :
float x=0;
while(device->run())
{
device->sleep(1);
if(device->Input.Keyboard.key==age::input::AGE_ESCAPE)
device->stop();
x+=0.1;
if(x>100)
x=0;
render->beginRender();
render->translateProjectionMatrix(age::math::Vector3f(x,0,0));
render->drawWireCircle(200,200,100,age::kernal::Color(255,255,0,255),1);
render->drawSolidCircle(200,200,50,age::kernal::Color(255,0,0,255));
render->drawSolidCircle(250,250,50,age::kernal::Color(255,0,200,100));
render->endRender();
}قم بتحميل المجلد وألصقه داخل المجلد Atomic Game Engine ..سيطلب منك الويندوز استبداله .. اختر نعم .. راجع المشاركة رقم 3 لمزيد من التفاصيل
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
أعتقد اني غلطت شوي لما تسرع واستخدمت الsdl .. كان يمكن الاكتفاء بالWin32 api .
لأنه هناك العديد من الامور التي لايمكن عملها بالSDL وتأكدت ن ذلك من خلال المحرك Ogre الذي استخدم طرق اخرى ..
أهم مشكلة واجهتني هي انشاء نوافذ فرعية في نفس النافذة .تسمى subWindow .
عموما .. سأستمر في الSDL وسأعمل كلاس اخر يرث من الواجهة IDevice يعتمد على الWin32 API .
من يعرف مكتبة أفضل من الSDL وتعمل على اكثر من نظام وتكون مستقرة يا ليت يخبرني ..
أيضا .. مشكلة نظام الاحداثيات ...
ماهو نظام الاحداثيات المستخدم مع dx .. هنا ايضا أحتاج لوقت اطول ..
اضافة اخرى .. المحرك حتى الان لا يملك الية جيدة لاكتشاف الاخطاء وعمل log او Exceptions ..
بالتالي لا تحاول ان تعبث كثيرا بالمحرك حتى لا ترى نتائج لا تسرك ..
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم ,,
الموضوع لا زال على قيد الحياة .. ان شاء الله ..
الجديد :
هسا التحديثات لو التحسينات اللي عاملها في الكود مو كلش كثيرة .. بس هم زينة .
ولكن الى هالحين ما رفعت التحديثات ,, وذلك لوجود بعض الBugs ولعدم وجود ما يسمى بالOptimization :) .
عموما .. المحرك يرسم الصور .. ونشء الColor Key و يرسم الmask image ,, يعني تقريبا البنية الاساسية للIRender شبه مكتملة ..
بس تدرون عاد انه احسن شيء عملته خلال الفترة السابقة هو ال logo للمحرك :P تراني مستعجل مرة ..
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
يا اخوان يبدو أن مشكلة الbug ليست من المحرك .. الdebugger عندي بدأ يظهر كثيرا .. حتى عند تشغيلي لامثلة وتطبيقات لمبرمجين محترفين !!!
اتمنى أن تتكرموا وتحملوا هذا الملف التطبيقي .. " لتشغيله تحتاج الى ملفات الDlls -راجع المشاركة رقم 3 - " .
عندما تحمل التطبيق حاول تشغله ثم تغلقه وهكذا اكثر من مرة " حوالي عشر مرات " .
اذا ظهرت عندك مشكلة .. وبالتحديد اذا ظهر عندك الDebugger اذا كنت تملك الفيجوال .. فأتمنى اخباري , ,
هل تظهر هذه الصورة عندك .
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم .
أخيرا تحديث جديد :) ,,
طلعت روحي ..
واجهت مشاكل غريبة عجيبة . .. حيث كنت قد أنشأت كلاس اسمه Image لتحميل الصور .. وكلاس Itexture لتحويل الصورة الى اكساء .. بهذا الاسلوب رح أضمن مرونة
المحرك مستقبلا ان شاء الله,, ولكن للاسف واجهت bug لم اعرف حله الى الان ,, وهو لايظهر الا ذا حملت أكثر من صورة . . وفي حالات خاصة .
لا اعرف هل المشكلة في نسخ لبيانات الصورة ( يعني المسألة فيها memory leak ..) أو المشكلة في أني عملت شيء يتعارض مع ما يقوم به OpenGL وهو ما
أظنه),, عموما حليت المشكلة بدمجي للكلاسين .. وهو حل مؤقت الى ان أعثر على حل المشكلة السابقة .
االاضافات هي كالتالي :
- تم عمل واجهة جديدة اسمها ITexture تضم عدد من الMethods .
وتم عمل implementation لهذه الواجهة وذلك من خلال الكلاس COpenGLTexture .
-هذه الواجهة مهمتها الرئيسية تحويل اصورة الى اكساء ... بمعنى اخر .. عرض الصور على الشاشة .
والمحرك الان يعتمد على المكتبة DevIL لاستيراد الصور .. لذلك هو يدعم عدد كبير من الانساق jpg/tga/bmp/pcx/gif/dds .. الخ .
-يقوم الكلاس بتحويل أي صورة الى RGBA ( أي أربع قنوات ) وذلك لان أربع قنوات .. تعطي المحرك قدرة أكبر على انتاج بعض التأثيرات المهمة .
أيضا ,, الكلاس يقوم بتحويل أي صورة تحتوي على تقنية ضغط مثل DDS الى صورة عادية .. بالتالي لايوجد حتى الان أي استفادة من هذه الصور ( سيتم الاعتماد
على تقنيات الضغط والامور الاخرى في ال3d . )
- أيضا الكلاس سقوم بانشاء الColor Key وذلك لازالة الالوان الغير مرغوب بها من الصورة .
-أيضا الكلاس يقوم بتغيير حجم الصورة الى قيمة تساوي 2^n . ( أي يجب أن يكون اي ملف تحمله هو عبارة عن 2 أس n مثل : 2 , 4 , 8 ,16,128,256 الخ ) .. فإذا كنت قد حملت صورة 400* 120 بكسل على سبيل المثال .. فإن الكلاس سيقوم بتحويلها الى 512 * 128 بكسل ) .
- تم إضافة عدة Methods الى الواجهة IRender وتشمل :
* getMaxTextureSize : للحصول على أقصى حجم للاكساء مسموح به من كرت الشاشة لديك .
* drawImage لرسم صورة .
* drawMaskImage : لرسم صورة بالاعتماد على اسلوب القناع( mask ) .
كما تلاحظ في الصورة .
أيضا تم إضافة عدد من الoverloading Functions هنا وهناك .
وهذا اختبار للبرنامج يظهر قدرات المحرك حتى الان :
age::render::IRender *render=device->createRender();
render->setBackgroundColor(age::kernal::Color(140,100,200,255));
//--------------------------------------------------
age::render::ITexture *texture1 = render->createTexture("logo.jpg",false);
age::render::ITexture *texture2 = render->createTexture("image_tga.tga",false);
texture2->generateColorKey(age::kernal::Color(255,0,0,0));
texture2->rebuild(false);
texture2->setFilterMode(age::render::AGE_TEXTURE_FILTER_NONE);
//Mask Image
age::render::ITexture *texture3 = render->createTexture("Original.bmp",false);
age::render::ITexture *texture4 = render->createTexture("mask.bmp",false);
//--------------------------------------------------
std::cout<<"texture 1 dimensions "<<texture1->getWidth() <<"*"<<texture1->getHeight()<<std::endl;
std::cout<<"texture 2 dimensions "<<texture2->getWidth() <<"*"<<texture2->getHeight()<<std::endl;
std::cout<<"texture 3 dimensions "<<texture3->getWidth() <<"*"<<texture3->getHeight()<<std::endl;
std::cout<<"texture 4 dimensions "<<texture4->getWidth() <<"*"<<texture4->getHeight()<<std::endl;
std::cout<<"max texture size available is : " << render->getMaxTextureSize()<<" pixel "<<std::endl;
float x=0;
while(device->run())
{
device->sleep(1);
if(device->Input.Keyboard.key==age::input::AGE_ESCAPE)
device->stop();
render->beginRender();
render->drawImage(0,0,100,100,age::kernal::Color(255,255,255,255),false,texture1);
render->drawImage(120,0,220,100,age::kernal::Color(255,255,255,255),true,texture2);
render->drawMaskImage(0,120,100,220,age::kernal::Color(255,255,255,255),texture3,texture4);
render->endRender();
}
cout<<"end "<<endl;
device->closeDevice();
texture1->release();
texture2->release();
texture3->release();
texture4->release();قم بتحميل المجلد وألصقه داخل المجلد Atomic Game Engine ..سيطلب منك الويندوز استبداله .. اختر نعم .. راجع المشاركة رقم 3 لمزيد من التفاصيل
تم تعديل هذه المشاركة بواسطة الشمري في 19 يوليو 2007 في 05:25
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
إلى هنا سأتوقف تقريبا حوالي الأسبوع أو اكثر وذلك لان عندي اختبارات هذا الاسبوع ,, اختبارات سهلة ان شاء الله .
لكن أحب أنوه عن أبرز الأهداف والاضافات التي أطمح إلى اضافتها للمحرك :
* تغيير الطريقة التي اعتمدها لرسم ال mask image .. لاني الان اعتمد على رسم صورتين فوق بعض .. بالتالي هذا يستنزف الوقت والجهد .. ماافكر به هو اللعب بال image data .. بالتالي أستغني عن أمور كثيرة تؤخر من عمل المحرك .
* إنشاء كلاسات خاصة بإدارة المحرك وحجز ذاكرة للكلاسات والغائها ,, مثل TextureManager .
بالتالي سأستغني عن الطريقة التقليدية في الحجز .. new و delete .
* إضافة method لرسم أشكال بالاعتماد على المثلثات اسمها drawTriangles بالتالي .. سيكون للمحرك شأن آخر مع المكتبات الاخرى .. كالمكتبات الفيزيائية :) .
يتبع ذلك إضافة عدة تراكيب وكلاسات لمعالجة الVertex ..
أيضا سيتم تحسين مستوى الكلاس Matrix وسيتم تطوير الModelView Matrix للمحرك ..
* إضافة الView Port و إضافة امكانية للتحكم بالOrthoGraphic Matrix .
* إضافة method خدمية للواجهة IDevice و IRender للحصول على معلومات عن الجهاز و كرت الشاشة وما الى ذلك ,
وإضافة كلاسات خدمية للتكامل مع المكتبات الاخرى .
* تحسين وتطوير مستوى الكود .. كإضافة Copy Constructor و getter and setter Methods وماالى ذلك .
* إضافة دعم لتصيير الخطوط ( رسمها على الشاشة ) .
* إضافة كلاس String , List ,, أو الاعتماد على الSTL .
* إضافة كلاسات الI.O .
* ال Sprite و Animated Sprite .
* أنظمة الجزيئات ,
طبعا .. كل قبل ذلك .. نتوكل على الله ,, ونقول ان شاء الله ,
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
السلام عليكم
عمل رااااااااااااااائع اخوي الشمري
واصل الابدااع نحن متابعون
تحياتي
السلام عليكم
لقد نبهت منذ فترة إنني إنتقلت من الـGame Development الي الـGame Design :)
و انا الحمد لله أتطور مع الـCG بشكل مبشر و الحمد لله
و لكن بما إن برمجة الألعاب ماتزال تجري في دمي سأضع عينك أخي علي أمر هااااام جداً يجب مراعاته لتجنب النقد المستمر ممن يجرب المحرك بعد الإنتهاء إن شاء الله ,ركز معي في تلك النقاط التصميمية والبرمجية رجاااءً :
1- الواجهة:
عند تصميم الواجهة مثلاُ يجب أن تحذو حذو الشركات الكبار ,فخم يتبعون أسلوب من 2 إما الإعتماد علي ذوقهم في توزيع الأدوات ( خيار سئ )
أو تقليد واجهات برا مج الجرافيك المشهورة ( خيار ممتاز ولا عيب فيه ) لأنك تجعل الواجهة أكثر سهولة في التعامل مثال :
Cinema4D و Maya قريبين الي حد كبير في شكل الواجهة و يعتبروا الأسهل الي الأن يمكنك أن تستوحي من إحداهم و لن تندم إن شاء الله .
2- الإمتداد والدعم التقني:
حاول دمج اكبر عد من الـSDK الخاص ببرامج الجرافيك 3D ولا تستهين بأي منهم و حاول أن تبني الـCarachter Modeler عندك علي FBX فهو مجاني و يدعمه كل برامج الـ3D المهمة و لا بد أن تشمل مكتبتك الـSDK لكل من :
Maya , SoftImage XSI , Cinema4D , Lightwave , POser , 3D Max , FBX
و إن وجد :
FormZ , Blender
لأنك ستكسب كل المزايا التي توفرها تلك البرامج داخل محركك و ستنقل منهم و إليهم في لمح البصر مع المحافظة علي تفاصيل العمل .
و كل الـSDK لتلك البرامج و الـHelp مجاني من مواقعها ....
تم تعديل هذه المشاركة بواسطة NubiaPrince في 28 يوليو 2007 في 03:25
' و على الله فليتوكل المؤمنون '
* فريق الجرافيك الحاسوبي العربي الإسلامي * the Arabic-Islamic Computer Graphics - A I C G
イスラム教は平和を意味する
이슬람교는 평화를 의미한다
Ислам означает мир
السلام عليكم ..
وقت طويل قد مر .. دون أي تحديث .
ولكن ولله الحمد والمنه .. تعديلات كثيرة أجريتها على المحرك .. المحرك بدأ يصنع له شخصية .
قبل أن أبدأ بسرد أهم التطويرات .. أحب أن اشكر الاخوة اللي ساعدوني بشكل مباشر أو غير مباشر في تطوير المحرك .
أشكر الاخ أحمد صالح على الفصول القيمة من كتابه التي أضافها .
استفدت بشكل كبير في فهم طريقة عمل المصفوفات ,, بعد ان كنت ادرسها في مجال ضيق .. داخل الOpenGL فقط .
أشكر الاخ سلوان على درسه القيم جدا جدا عن الSTL .. وخاصة عن string . قمت بتوظيف كل المعلومات التي اضافها في المحرك
واخيرا لا انسى ان اشكر الاخ بندر على دروسه القيمة هو الاخر عن STL .. تعلمت الvector من خلال دروسه
وتعلمت أيضا فكرة بسيطة عن ال map من خلال دروسهما .
جزاكم الله خير ,
.. نبدأ الان بالتحديثات :
# kernal - IDevice:
+ تغييرات ضخمة حدثت في هذه الواجهة .
كنت في السابق عملت لها implementation واحد وهو للSDL .
الان تستطيع بناء التطبيق باستخدام Win32 API و باستخدام SDL .
بالاضافة الى اضافة عدد من الmethod وتعديل البعض الاخر .. مثلا .. الان تستطيع التشغيل في وضع كامل الشاشة .
+ أيضا من التغييرات المهمة هو تغيير نظام الادخال Input .. وذلك لاننا نريد وجود توافقية بين الSDL و Win32 .
على سبيل المثال :
SDLK_ESCAPE قيمتها مثلا : 27 .
VK_ESCAPE في Win32 api قيمتها مثلا 7 .
بالتالي يجب أن أوحد بين تلك القيم .
الطريقة التي استخدمتها وهي مستخدمة في الOgre و Irrlicht وحقيقة خطرت ببالي قبل ان ارى تلك المحركات :D .
هي باستخدام الmap .
// sdl KeysMap.insert(myMap::value_type(SDLK_w,K_W)); //win32 api KeysMap.insert(myMap::value_type(0x57,K_W));
انظر الملفات : NullInput - CWin32Input - CSDLInput - Input - CWin32Device
للتفاصيل .
بقي أن أقول ان الinput لازال يحتاج المزيد من التجارب ... وفي كل مرة سأقوم بتطوير جزئية معينة ان شاء الله .
+ من الاضافات الهامة هو اضافة ملف باسم VideoMode وهو مسؤول عن الحصول على جميع الانظمة المدعومة من Display Device .. يعني ببساطة من كرت الشاشة ..
يعني الابعاد المتاحة ( 800 * 600 ) على سبيل المثال .
وأيضا الBits Per Pixel المتاحة ... وسيختبر المحرك هذه القيم ليكتشف هل هي متاحة أو لا .
VideoMode عملت لها Imp بالWin32 API و SDL . .
لكن واجهت مشاكل مع sdl في بعض الامور .. مثلا لم اعثر على دالة تعطيني ابعاد الشاشة الفعلية ولا جميع الBits المتاحة .!! . اللي يعرف يا ليت يساعدني ( انر الملف VideoMode.h للتفاصيل ) .
+ SDL وضعتها خصيصا للتكامل مع مختلف نظم التشغيل وخاصة اللينوكس ..
أما Win32 API فوضعتها للاستفادة من امكانياتها تحت الويندوز .
بالتالي اذا أردت ترجمة برنامج باستخدام SDL أو Win32 .. فتستطيع التحكم بذلك عن طرق الذهاب الى الملف ageConfig.h حيث ستجد هذه الاسطر :
#define AGE_WIN32 //#define AGE_SDL
اذا عرفنا AGE_WIN32 فالمترجم سيترجم المحرك على WIN32 API . . والعكس صحيح .
أنوي مستقبلا تغيير هذه الطريقة .. بحيث تكون كالتالي
#if defined(WIN32) #define AGE_WIN32 #endif
يعني اذا نحن تحت نظام الويندوز .. فاعتمد الWin32 API .. والعكس صحيح للانظمة الاخرى ..
لكن حاليا لا املك الا الويندوز فبالتالي ليس لدي امكانية التجريب .
# render
+ المحرك قادر على الرسم باستخدام Triangles واستخدم طريقة Indices في الربط بين المثلثات وذلك بهدف تسريع التصيير .
+ اضفت SVertex .
+ المحرك الان يعتمد على Matrix بنظام OpenGL column-major order وترتيب العمليات هو من اليمين لليسار .
+ تم الغاء الطريقة السابقة في انتاج تأثير القناع . mask .
كنت في السابق أعتمد على Blending . وهي مليئة بالعيوب .. اذكر منها :
1- بطيئة . فهي تفرض انك سترسم شكلين في نفس الموقع + تنشئ اكسائين .
2- لا تصلح مع الثري دي .
3- لاتستطيع التحكم بالشفافية .
فكرت في ايجاد طريقة تتجاوز تلك العيوب ..
بحمدالله .. عملت طريقة - قريبة بفكرتها من الColor key - لانتاج القناع .. ويتم انتاج الصورة النهائية للقناع قبل وقت التنفيذ ..
انظر COpenGLTexture لمزيد من التفاصيل .. ولعلنا نتكلم حول القناع في موضوع منفصل .
القناع في المحرك نوعان :
- Soft : وهي تستخدم لانتاج قناع ناعم .
- Sharp : لانتاج قناع حاد ...
كل تأثير له مزاياه واستخداماته ..
لم اعتمد على قناة الفا لانتاج هذا التأثير . . لا اعرف هل ما قمت به هو المناسب أو لا ؟؟
راجع المثالا تطبيقي للمزيد من التفاصيل .
# String
تم اضافة كلاس String وهو يعتمد على std::string ..
ولم يكتمل بعد .. يعني يحتاج المزيد من التغليف .
أضفت له بعض الدوال المساعدة مثل التحويل من رقم الى نص والعكس - والتحويل من unicode الى ascii .
واعتمدت على درس الاخ سلوان في هذا الامر .
* صورة التطبيق :
اللي يحب يترجم الكود رح يواجه مشاكل لاني عدلت على بعض خيارات الترجمة .. عاد اللي يحب يترجم المحرك وواجه اخطاء يقولي ..
قم بتحميل المجلد وألصقه داخل المجلد Atomic Game Engine ..سيطلب منك الويندوز استبداله .. اختر نعم .. راجع المشاركة رقم 3 لمزيد من التفاصي
تم تعديل هذه المشاركة بواسطة الشمري في 1 سبتمبر 2007 في 10:38
تطبيق طمأنينة ، نسخة بيتا على أندرويد
عبدالله الشمّري - Al-Shammari
twitter @abshammeri
abshammeri AT gmail.com
github : abshammeri
هذا الموضوع مغلق.
المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية
جارٍ التحقق من المتواجدين…