السلام عليكم ورحمة الله تعالى وبركاته
كيفكم شباب وكيف مر اول يوم من صيامكم
حبيت اليوم اعمل ورشة لتصميم لعبة طائرات حربية ويمكن نعملها ملتيبلاير على حسب راي الاعضاء
لو في احد يريد يشارك معي فليتفضل وانا بانتضاره.
المحرك المستعمل هو الجيم ستوديو .
وستكون نتيجة انشاء الله مشابهة للعبة اس كومبات وهدا فديو لها :
في هده الورشة نحتاج الى ما يلي :
*مودل جاهز لطائرة حربية ( ساضعه في المرفقات)
*صورة لسماء كخلفية ( ساضعه ايضا في المرفقات)
*مودل مكعب صغير ( سنحتاجه للكمرا)
* سكربت ايديتور
* خبرة بسيطة في لغة سي
لتحميل الموديلات الضرورية
http://www.mediafire.com/?f69he60k5svdp2l
ولنبدأ على بركة الله
اول شيء نخلق مجلد جديد لكي نضع فيه مودل طائرة وصورة الخلفية بالاضافة نضع ملف فارغ دات امتداد c ولنسمه متلا game

نفتح ملف game.c الي خلقناه من قبل داخل سكربت ايديتور

والخطوة الهامة لكي نعمل بلغة سي لازم نضع سطر هيدر في الاعلى
بعد دالك نضع فانكشن main والتي تعتبر اول فانكشن يقراها المحرك بعد دالك نفتح مرحلة جديدة
بعد ما انشانا ملف الرئيسي ناتي الان لتصميم ملف خاص بفانكشنات الطائرة
ننشأ ملف جديد نسميه airplane ويكون دات امتداد c بعد دالك نفتحه داخل سكربت ايديتور بجنب ملف game.c
بعده نعمل ضم لهدا الملف الى الملف الرئيسي عن طريق Include
ونضيف السطر التالي اسفل سطر الهيدر acknex.h
ولنبدا ببرمجة سكربت الطائرة الحربية ( لم نستدعي الطائرة بعد داخل المحرك نحن سنصمم فقط السكربت الخاص بها بعدها سنستدعيها)
اول شيء نبدا بانشاء اكشن جديد خاص بالطائرة ولنسميه f15

نعمل في هدا الاكشن حلقة تكرار while وداخل هده الحلقة اي شيء وضعته سيبقى يكرر حتى ينتهي هدا الاكشن متلا مسحته
ملاحظة : اتناء وضعك لحرلقة تكرار لازم تضع داخلها wait(1); لكي لا يتجمد لك المحرك.
الان خلقنا اكشن الطائرة ويلزم فقط فانكشن نضعها وسط حلقة تكرار لتحريك الطائرة
ولكي نجرب ما انشاناه سنستدعي الطائرة داخل المحرك والطريقة هي :
ندهب للملف game.c و داخل الدالة main بعد level_load نضع :
f15.mdl هو اسم المودل الموجود في المجلد
vector(0,0,0): هي موقع الطائرة داخل المحرك وانا وضعت x=0و y=0و z=0
f15 : هي الاكشن الي صممناها لهدا المودل وهي المسؤولة عن تحركاته والفانكشنات المتعلقة به
نضغط save تم ندهب لملف game.c ونضغط ايضا save بعدها نضغط على المتلت الازرق الموجود في الاعلى.
وهكدا نكون انتهينا من اهم خطوة
لكي نضيف جمالية داخل المحرك نستدعي السماء بهده الطريقة
ندهب لدالة main واسفل ent_create نضع :
لاحضو الفرق بين ent_create و ent_createlayer فالاولى مخصصة لخلق موديلات والتانية مخصصة لوضع سبرايتات غير ملموسة متل السماء وغيرها
ناتي لشرح السطر
skysunset+6.tga : هدا اسم صورة السماء والتي قمت بوضعها داخل مجلد File الدي رفعته
SKY | CUBE | VISIBLE : هي مجرد flags وهي ضرورية وتحدد طريقة عرض السماء متلا انا وضعت sky بمعنى ان الشيء الدي وضعته اريده ان يكون سماء و CUBE بمعنى ان شكلها مكعب VISIBLE بمعنى انني اريها ان تضهر حالما ادخل للعبة
ياتي دور انشاء فانكشن متخصصة في تحريك الطائرة
ندهب الى ملف airplane.c وفي الاعلى نعمل فانكشن جديدة ونسميها متلا Move_plane
شرح ما بين قوسين :
اي فانكشن يمكن تضع بجانبهااقواس وداخل هده الاقواس يمكن تضع تعليمات يا اما تستطيع تحكم في التعليمات الاساسية داخل هده الفانكشن او تعرفها بكائنات والكتيير وستفهمون في الاخير لمادا وضعت تعليمات داخل قوسين
ENTITY* plane هو تعريف بان هناك كائن اسمه plane
key_up,key_down,key_right,key_left هي مجرد تعليمات ساضع مكانها اسم الزر الاصلي ويمكن تسميها متلا هدا ادا كان الانجن لديك يقبل العربية ( مفتاح_اعلى , مفتاح_اسفل , مفتاح_يمين , مفتاح_يسار) وهكدا
المهم هده تعليمات فقط وستغير لاحقا
ننشا متغير لسرعة خارج الفانكشن و ناتي الى داخل الفانكشن ونبدا بانشاء شروط لتحكم بالمتغير ونكتب :
ناتي الان لتفسير الاسطر
var speed_airplane = 0; : هو متغير لسرعة انشئناه ويمكن تسميه ما تشاء وانا هنا سميته ب speed_airplane وانا جعلته يساوي 0
if(speed_key == 1)
{
if(speed_airplane < 40 )
{
speed_airplane += 5;
}
}
else
{
if(speed_airplane > 0 )
{
speed_airplane -= 5;
}
}
}
هدا الكود يعني ادا ضغطت على زر السرعة فستزداد سرعة الطائرة لتصل الى 40 والا ادا لم اضغط فستنزل السرعة الى الصفر
ناتي الان الى دوران المودل بعدها نربط دورانه باتجاها داخل المحرك بمعنى اننا سنخلق خدعة فيرى الاعب انه عندما يضغط على زر يمين تميل الطائرة وتدور نحو اليمين لاكن في الحقيقة الميلان هو مجرد خدعة تخدع بها الاعب ونكتب داخل الفانكشن move_plane ,و اسفل كود الي كتبناه :
plane.pan -= plane.roll *0.1; : في هدا السطر انا عملت علاقة لدوران المودل باتجاهه يعني دوران pan بدوران roll اللخاص بالمودل
الان ناتي لاخر الدالة ونضع كود لنجعل الطائرة قابلة لتحرك
شرح السطر :
plane : هو اسم الكائن الدي سيتحرك
vector : خاص بالاتجاهات xyz وادا لاحضتم اني واضع في x ألخاصة بالفكتور speed_airplane وهو المتغير اللدي وضعناه في الاعلى وتحكمنا في سرعته الان نعمل له علاقة بالكائن لكي يكون هو مصدر سرعته.
IGNORE_ME : بمعنى ان التحرك سيتجاهل الكائن نفسه لكي لايكون الكائن معرقل نفسه من الحركة
IGNORE_PASSABLE : بمعنى ان الكائن يتجاهل اي كائن اخر شفاف متل المياه و ......
والان انتهينا من دالة التحريك ورغم بساطتها الا انها تفي بالغرض حاليا
وفي الاخير بقي علينا فقط ربط الدالة بالاكشن الخاصة بالكائن وسنتبع هده الطريقة :
ندهب للاكشن الي صممناه من قبل f15
ونضع داخل حلقة التكرار الكود :move_plane(me,key_cuu,key_cud,key_cur,key_cul,key_x);
وستكون الاكشن على الشكل التالي :
شرح السطر
me ويعني انا وبالتالي اسم plane الموجود داخل فانكشن move_plane سيتبدل الى me ومعناه ان كل التعليمات صارت ملك للاكشن f15 .
key_cuu,key_cud,key_cur,key_cul,key_x هي اسماء الازرار الكيبورد الحقيقية ويمكنك تبدلها لاي زر تريده وعلى حسب رغبتك
يبقى الان كود الكمرا فقط
وانا ساضعه مباشرة واشرحه
ادا اي حد فيكم لم يفهم شيء يبقى يسال وانا ساجاوبه
المهم الان انتهينا من كود الكمرا وصار فينا نضعه في حلقة تكرار الاكشن f15
وفي الاخير ستكون اكشن f15 هكدا :
النتيجة نهائية مع وضع بعض المؤترات
متاسف على جودة الفديو فحجمه الاصلي 80 ميجا وانا قللته حتى صار 2 ميجا
رابط التجربة لمن يريد تجريبها
http://www.mediafire.com/?4jnfnk9cy9e07gy
المهم اللعبة يمكنكم تجربوها وتضعو موديل لطائرة احسن من الطائرة المستعملة لكي تضهر اللعبة بجودة اكبر
نصل الان الى طريقة اضافة شيدرز للعبة للحصول على نفس الجرافك الي في التجربة
اولا سندهب للملف الاول الي صممناه game.c ونضيف اسفل #include <acknex.h> السطر:
بعد اضافة هدا الكود الان صار فينا نضيف شيدر كيف ما نشاء وسادرج لائحة لشيدرز المتوفرة كما انه يمكن صنع شيدرز جديدة بانفسكم

و انا ساختار شيدر mtl_desaturate ولتطبيق ها شيدر على الكمرا نقوم بعمل الاتي :
ندهب لداخل فانكشن main تم اسفلها نضع كود تالي:
وبالتالي طبقنا الشيدر على الكمرا ولاضافة شيدر جديد وانا اختار mtl_bleach نقوم بوضع الكود التالي اسفل pp_set:
وبهده الطريقة يمكنكم الحصول على افضل جرافك بالمزج فقط في شيدرز
كيفكم شباب وكيف مر اول يوم من صيامكم
حبيت اليوم اعمل ورشة لتصميم لعبة طائرات حربية ويمكن نعملها ملتيبلاير على حسب راي الاعضاء
لو في احد يريد يشارك معي فليتفضل وانا بانتضاره.
المحرك المستعمل هو الجيم ستوديو .
وستكون نتيجة انشاء الله مشابهة للعبة اس كومبات وهدا فديو لها :
في هده الورشة نحتاج الى ما يلي :
*مودل جاهز لطائرة حربية ( ساضعه في المرفقات)
*صورة لسماء كخلفية ( ساضعه ايضا في المرفقات)
*مودل مكعب صغير ( سنحتاجه للكمرا)
* سكربت ايديتور
* خبرة بسيطة في لغة سي
لتحميل الموديلات الضرورية
http://www.mediafire.com/?f69he60k5svdp2l
ولنبدأ على بركة الله
اول شيء نخلق مجلد جديد لكي نضع فيه مودل طائرة وصورة الخلفية بالاضافة نضع ملف فارغ دات امتداد c ولنسمه متلا game
نفتح ملف game.c الي خلقناه من قبل داخل سكربت ايديتور
والخطوة الهامة لكي نعمل بلغة سي لازم نضع سطر هيدر في الاعلى
كود:
#include <acknex.h>
كود:
void main() { wait(1); level_load("" ); }
ننشأ ملف جديد نسميه airplane ويكون دات امتداد c بعد دالك نفتحه داخل سكربت ايديتور بجنب ملف game.c
بعده نعمل ضم لهدا الملف الى الملف الرئيسي عن طريق Include
ونضيف السطر التالي اسفل سطر الهيدر acknex.h
كود:
#include "airplane.c"
اول شيء نبدا بانشاء اكشن جديد خاص بالطائرة ولنسميه f15
نعمل في هدا الاكشن حلقة تكرار while وداخل هده الحلقة اي شيء وضعته سيبقى يكرر حتى ينتهي هدا الاكشن متلا مسحته
كود:
action f15() { while(1) { wait(1); } }
ملاحظة : اتناء وضعك لحرلقة تكرار لازم تضع داخلها wait(1); لكي لا يتجمد لك المحرك.
الان خلقنا اكشن الطائرة ويلزم فقط فانكشن نضعها وسط حلقة تكرار لتحريك الطائرة
ولكي نجرب ما انشاناه سنستدعي الطائرة داخل المحرك والطريقة هي :
ندهب للملف game.c و داخل الدالة main بعد level_load نضع :
كود:
ent_create("f15.mdl",vector(0,0,0),f15);
vector(0,0,0): هي موقع الطائرة داخل المحرك وانا وضعت x=0و y=0و z=0
f15 : هي الاكشن الي صممناها لهدا المودل وهي المسؤولة عن تحركاته والفانكشنات المتعلقة به
نضغط save تم ندهب لملف game.c ونضغط ايضا save بعدها نضغط على المتلت الازرق الموجود في الاعلى.
وهكدا نكون انتهينا من اهم خطوة
لكي نضيف جمالية داخل المحرك نستدعي السماء بهده الطريقة
ندهب لدالة main واسفل ent_create نضع :
كود:
ent_createlayer("skysunset+6.tga", SKY | CUBE | VISIBLE, 0);
ناتي لشرح السطر
skysunset+6.tga : هدا اسم صورة السماء والتي قمت بوضعها داخل مجلد File الدي رفعته
SKY | CUBE | VISIBLE : هي مجرد flags وهي ضرورية وتحدد طريقة عرض السماء متلا انا وضعت sky بمعنى ان الشيء الدي وضعته اريده ان يكون سماء و CUBE بمعنى ان شكلها مكعب VISIBLE بمعنى انني اريها ان تضهر حالما ادخل للعبة

ياتي دور انشاء فانكشن متخصصة في تحريك الطائرة
ندهب الى ملف airplane.c وفي الاعلى نعمل فانكشن جديدة ونسميها متلا Move_plane
كود:
function move_plane(ENTITY*plane,key_up,key_down,key_right,key_left ,speed_key) { }
اي فانكشن يمكن تضع بجانبهااقواس وداخل هده الاقواس يمكن تضع تعليمات يا اما تستطيع تحكم في التعليمات الاساسية داخل هده الفانكشن او تعرفها بكائنات والكتيير وستفهمون في الاخير لمادا وضعت تعليمات داخل قوسين
ENTITY* plane هو تعريف بان هناك كائن اسمه plane
key_up,key_down,key_right,key_left هي مجرد تعليمات ساضع مكانها اسم الزر الاصلي ويمكن تسميها متلا هدا ادا كان الانجن لديك يقبل العربية ( مفتاح_اعلى , مفتاح_اسفل , مفتاح_يمين , مفتاح_يسار) وهكدا
المهم هده تعليمات فقط وستغير لاحقا
ننشا متغير لسرعة خارج الفانكشن و ناتي الى داخل الفانكشن ونبدا بانشاء شروط لتحكم بالمتغير ونكتب :
كود:
var speed_airplane = 0; function move_plane(ENTITY*plane,key_up,key_down,key_right,key_left,speed_key) { if(speed_key == 1) { if(speed_airplane < 40 ) { speed_airplane += 5; } } else { if(speed_airplane > 0 ) { speed_airplane -= 5; } } }
ناتي الان لتفسير الاسطر
var speed_airplane = 0; : هو متغير لسرعة انشئناه ويمكن تسميه ما تشاء وانا هنا سميته ب speed_airplane وانا جعلته يساوي 0
if(speed_key == 1)
{
if(speed_airplane < 40 )
{
speed_airplane += 5;
}
}
else
{
if(speed_airplane > 0 )
{
speed_airplane -= 5;
}
}
}
هدا الكود يعني ادا ضغطت على زر السرعة فستزداد سرعة الطائرة لتصل الى 40 والا ادا لم اضغط فستنزل السرعة الى الصفر
ناتي الان الى دوران المودل بعدها نربط دورانه باتجاها داخل المحرك بمعنى اننا سنخلق خدعة فيرى الاعب انه عندما يضغط على زر يمين تميل الطائرة وتدور نحو اليمين لاكن في الحقيقة الميلان هو مجرد خدعة تخدع بها الاعب ونكتب داخل الفانكشن move_plane ,و اسفل كود الي كتبناه :
كود:
function move_plane(ENTITY*plane,key_up,key_down,key_right,key_left,speed_key) { var speed_airplane = 0; if(speed_key == 1) { if(speed_airplane < 40 ) { speed_airplane += 5; } } else { if(speed_airplane > 0 ) { speed_airplane -= 5; } } if(key_right == 1) { if(plane.roll < 70) { plane.roll += 5 ; } } if(key_left == 1) { if(plane.roll > -70) { plane.roll -= 5 ; } } if((key_left == 0)&&(key_right == 0)) { if(plane.roll > -70) { plane.roll -= 5 ; } } if(key_up == 1) { if(plane.tilt<70) { plane.tilt += 1; } } if(key_down == 1) { if(plane.tilt>-70) { plane.tilt -= 1; } } if((key_down == 0)&&(key_up == 0)) { if(plane.tilt>0) { plane.tilt -= 0.2; } if(plane.tilt<0) { plane.tilt += 0.2; } } plane.pan -= plane.roll *0.1; }
plane.pan -= plane.roll *0.1; : في هدا السطر انا عملت علاقة لدوران المودل باتجاهه يعني دوران pan بدوران roll اللخاص بالمودل
الان ناتي لاخر الدالة ونضع كود لنجعل الطائرة قابلة لتحرك
كود:
function move_plane(ENTITY*plane,key_up,key_down,key_right,key_left,speed_key) { var speed_airplane = 0; if(speed_key == 1) { if(speed_airplane < 40 ) { speed_airplane += 5; } } else { if(speed_airplane > 0 ) { speed_airplane -= 5; } } if(key_right == 1) { if(plane.roll < 70) { plane.roll += 5 ; } } if(key_left == 1) { if(plane.roll > -70) { plane.roll -= 5 ; } } if((key_left == 0)&&(key_right == 0)) { if(plane.roll > -70) { plane.roll -= 5 ; } if(key_up == 1) { if(plane.tilt<70) { plane.tilt += 1; } } if(key_down == 1) { if(plane.tilt>-70) { plane.tilt -= 1; } } if((key_down == 0)&&(key_up == 0)) { if(plane.tilt>0) { plane.tilt -= 0.2; } if(plane.tilt<0) { plane.tilt += 0.2; } } } plane.pan -= plane.roll *0.1; c_move(plane,vector(speed_airplane,0,0),nullvector,IGNORE_ME|IGNORE_PASSABLE); }
شرح السطر :
كود:
c_move(plane,vector(speed_airplane,0,0),nullvector,IGNORE_ME|IGNORE_PASSABLE);
vector : خاص بالاتجاهات xyz وادا لاحضتم اني واضع في x ألخاصة بالفكتور speed_airplane وهو المتغير اللدي وضعناه في الاعلى وتحكمنا في سرعته الان نعمل له علاقة بالكائن لكي يكون هو مصدر سرعته.
IGNORE_ME : بمعنى ان التحرك سيتجاهل الكائن نفسه لكي لايكون الكائن معرقل نفسه من الحركة
IGNORE_PASSABLE : بمعنى ان الكائن يتجاهل اي كائن اخر شفاف متل المياه و ......
والان انتهينا من دالة التحريك ورغم بساطتها الا انها تفي بالغرض حاليا
وفي الاخير بقي علينا فقط ربط الدالة بالاكشن الخاصة بالكائن وسنتبع هده الطريقة :
ندهب للاكشن الي صممناه من قبل f15
ونضع داخل حلقة التكرار الكود :move_plane(me,key_cuu,key_cud,key_cur,key_cul,key_x);
وستكون الاكشن على الشكل التالي :
كود:
action f15() { while(1) { move_plane(me,key_cuu,key_cud,key_cur,key_cul,key_x); wait(1); } }
شرح السطر
me ويعني انا وبالتالي اسم plane الموجود داخل فانكشن move_plane سيتبدل الى me ومعناه ان كل التعليمات صارت ملك للاكشن f15 .
key_cuu,key_cud,key_cur,key_cul,key_x هي اسماء الازرار الكيبورد الحقيقية ويمكنك تبدلها لاي زر تريده وعلى حسب رغبتك
يبقى الان كود الكمرا فقط
وانا ساضعه مباشرة واشرحه
كود:
VECTOR cam_set; VECTOR offset; VECTOR camera_to; function handle_camera(ENTITY* ent_model,model_distance,model_y,hight) { camera.pan = ent_model.pan; في هدا السطر انا جعلت اتجاه الكمرا هو اتحاه ent_model vec_set(offset.x,vector(-model_distance,model_y,hight)); هنا في هدا سطر وضعت التعليمات الخاصة ب اتجاه offset vec_rotate(offset.x,camera.pan); ,هنا كدالك جعلت اتجاه ال offset هو اتجاه الكمرا vec_add(offset.x,ent_model.x); هنا الصقت ال offset بمحور x الخاص ب ent_model cam_set.x = offset.x + fcos((camera.pan),fcos(camera.tilt,-100)); هنا حددت بعد ال cam_set عن محور x لل offset cam_set.y = offset.y + fsin((camera.pan),fcos(camera.tilt,-100)); وكدالك هنا بالنسبة للمحور y cam_set.z = offset.z + fsin(camera.tilt,-100); وكدالك هنا بالنسبة للمحور z vec_lerp(camera.x,camera.x,cam_set.x,0.5); هدا الكود خاص بتاخير لحاق الاوبجكت باخر وانا جعلت الكمرا تتاخر باللحاق ب cam_set الان جاء وقت وضع الكمرا ترى في المودل فقط vec_set (camera_to.x, vector(my.x,my.y,my.z+10)); vec_sub (camera_to.x, camera.x); vec_to_angle (camera.pan,vector(camera_to.x,camera_to.y,camera_to.z)); camera.arc= 90; كود خاص ب الارك ////////////////////////////////////////////////// }
المهم الان انتهينا من كود الكمرا وصار فينا نضعه في حلقة تكرار الاكشن f15
وفي الاخير ستكون اكشن f15 هكدا :
كود:
action f15() { while(1) { move_plane(me,key_cuu,key_cud,key_cur,key_cul,key_x); handle_camera(me,-50,0,10); wait(1); } }
النتيجة نهائية مع وضع بعض المؤترات
متاسف على جودة الفديو فحجمه الاصلي 80 ميجا وانا قللته حتى صار 2 ميجا
رابط التجربة لمن يريد تجريبها
http://www.mediafire.com/?4jnfnk9cy9e07gy
المهم اللعبة يمكنكم تجربوها وتضعو موديل لطائرة احسن من الطائرة المستعملة لكي تضهر اللعبة بجودة اكبر
نصل الان الى طريقة اضافة شيدرز للعبة للحصول على نفس الجرافك الي في التجربة
اولا سندهب للملف الاول الي صممناه game.c ونضيف اسفل #include <acknex.h> السطر:
كود:
#include <mtlView.c>
و انا ساختار شيدر mtl_desaturate ولتطبيق ها شيدر على الكمرا نقوم بعمل الاتي :
ندهب لداخل فانكشن main تم اسفلها نضع كود تالي:
كود:
pp_set(camera,mtl_desaturate);
كود:
pp_add (mtl_bleach);
وبهده الطريقة يمكنكم الحصول على افضل جرافك بالمزج فقط في شيدرز
تعليق