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

محترف مشرف عبد اللطيف حاجي علي مشاركة 31

أريد أنا أسأل: لماذا DirectInput?
ماالذي يقدمه DirectInput ولا يفعل الـ Win32? حتى الـ Joystick مدعومة باستخدام رسائل WM_INPUT...
فهل يوجد ما يدعو لذلك؟ هل سنستخدم الـ ForceFeedback مثلاً؟
 
ملاحظة: أنا مع تنظيم الـ Input بالطريقة التي اقترحها سلوان
 
تعديل: تباً. لقد نسيت تماماًُ تعقيدات WM_INPUT في التعامل مع الـ Joystick.
هذا هو سؤالي الجديد☺  لماذا DirectInput في التعامل مع الـ Keyborad و الماوس (إذا كانت موجودة...)

عبد اللطيف حاجي علي
مبرمج
In|Framez

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

لسنا بحاجة لدعم الماوس إطلاقاً. لكن دعم الجويستيك مفيد (بصراحة هو إحساس آخر عندما تلعب اللعبة بالجويستيك! وكأنني ألعبها أول مرة).
كما وضح عبد اللطيف، جميع عمليات DirectInput (باستثناء الـ ForceFeedback) يمكن تنفيذها بالـ Win32 API العادي (حتى دون الحاجة إلى Raw Input). وفي الحقيقة فإن DirectInput يستخدم هذه العمليات الآن بدلاً من الوصول المباشر كما كان الحال سابقاً...
 
للكيبورد لدينا الإجراءات السابقة (GetAsyncKeyState) أو الرسائل العادية WM_KEYDOWN و WM_KEYUP.
للجويستيك لدينا موقف مشابه مع الرسائل MM_JOY1BUTTONDOWN و MM_JOY1BUTTONUP.
 
لقد قمت بترجيب النسخة على جهاز آخر وقد كانت الكيبورد تعمل دون مشاكل. سأجرب مرة أخرى على جهازي المنزلي لأرى ما القضية.
بالنسبة للجويستيك، فقد جربت نوعاً آخر (Logitech) وقد كانت تواجه نفس المشكلة، حيث أن اللاعب يتحرك إلى اليسار بشكل تلقائي. العامل المشترك بين كلا النوعين (Xbox360 Controller والـ Logitech RumblePad 2) هو أنهما تمتلكان تحكمات analog (مثل جويستيك البلايستيشن 2)، وهذه التحكمات حساسة جداً وتنقل أبسط إزاحة حتى وإن كانت في وضع حر. لذا يجب أن يتم تعديل إعدادات المنطقة الميتة dead zone للتخلص من هذه المشكلة.

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

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

وفي 19 نيسان 2008 04:52 م، ظهر شبح ابتسامة على وجه عبد اللطيف حاجي علي وهو يقول:

هذا هو سؤالي الجديد☺  لماذا DirectInput في التعامل مع الـ Keyborad و الماوس (إذا كانت موجودة...)
لا أعلم صراحة, أعتقد إن لا فرق بينهما من ناحية التطبيق, المسألة مجرد تفضيل...
يمكنني طبعاً أن أعدل النظام الموجود حالياً ليستخدم رسائل الوندوز في قراءة الكيبورد, إن إتفق أغلبية المشاركين إن ذلك أفضل بشكل ما.



أما في 19 نيسان 2008 07:25 م، فقد تنهد وسام البهنسي بارتياح وهو يرد:

وفي الحقيقة فإن DirectInput يستخدم هذه العمليات الآن بدلاً من الوصول المباشر كما كان الحال سابقاً...

لقد إكتشفت قبل قليل إن DirectInput الحالي يستخدم رسائل الوندوز لقراءة إدخال الكيبورد والماوس!, وكذلك إن هنالك جيلين من اجهزة الجويستك الآن, القديم يسمى الآن بالـ legacy والجديد وهو ما يدعم XInput, بالنسبة لـ DirectInput فإن دعمه للـ legacy هو ما أبقاه على قيد الحياة حتى الآن (هل تم التخلص منه في DX10؟ لا أعلم).
أما المشاكل التي تطرقت لها سابقاً في ما يخص الـ XBox360 Controller فيبدو أن هنالك مفتاحان معينان يمثلان إتجاهين لا يمكن للـ DirectInput التعرف على ما إذا كانا في موضع center أم لا, انا اقوم بقراءة المحور X والمحور Y فقط لذلك فلا اعتقد إن اللعبة ستتأثر, كذلك هنالك الـ head set التي لا يمكن للـ DirectInput أن يقدم دخول مباشر لها وليس لذلك علاقة هنا طبعاً.



في 19 نيسان 2008 07:25 م، غمغم وسام البهنسي باستغراب قائلاً:

لقد قمت بترجيب النسخة على جهاز آخر وقد كانت الكيبورد تعمل دون مشاكل. سأجرب مرة أخرى على جهازي المنزلي لأرى ما القضية.
بالنسبة للجويستيك، فقد جربت نوعاً آخر (Logitech) وقد كانت تواجه نفس المشكلة، حيث أن اللاعب يتحرك إلى اليسار بشكل تلقائي. العامل المشترك بين كلا النوعين (Xbox360 Controller والـ Logitech RumblePad 2) هو أنهما تمتلكان تحكمات analog (مثل جويستيك البلايستيشن 2)، وهذه التحكمات حساسة جداً وتنقل أبسط إزاحة حتى وإن كانت في وضع حر. لذا يجب أن يتم تعديل إعدادات المنطقة الميتة dead zone للتخلص من هذه المشكلة.
نعم! إنها الـ dead zone! تباً لقد نسيت أن أحسب لذلك حساب...
انا ايضاً استخدم جويستك analog ولم اواجه نفس المشكلة. لذلك فلم أنتبه لها.
أضفت تعريف JOYSTICK_DEADZONE لملف Input.h بقيمة إفتراضية 3000 (أي 30 بالمئة), وعملية تعيين قيمة الـ dead zone بإستخدام SetProperty للجويستك في ملف Input.cpp.
الملفات المعدلة في المرفقات...
لنرى إن كان ذلك سيحل مشكلة الـ XBox360 والـ Logitech ;-)

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

حسناً لقد قمت بتجريب تعديلاتك الأخيرة وهي تعمل بشكل ممتاز، وأنا سعيد جداً بإضافة دعم الجويستيك (اللعبة ممتعة جداً بالجويستيك)...
 
كما اتفقنا، سيكون الرابط التالي هو رابط دائم لآخر نسخة من الكود متضمنة كل التعديلات التي تم الموافقة عليها وإدراجها في اللعبة. لن يتم قبول أي تعديلات تتسبب بتعطيل اللعبة، لذلك هذا الملف مضمون بأن يكون نسخة سليمة...
 
http://www.agdn-online.com/source/kvalley_latest.zip
 
هذا الملف فقط يحوي الكود الذي قد يتغير. أما بقية ملفات اللعبة (الصور والأصوات) فيجب تحميلها من الرابط الأساسي:
 
http://www.agdn-online.com/source/kvalley_src.zip
 
وهو يحوي كود اللعبة الأصلي في حال أردتم رؤية التطور☺
 
هل يرغب فريق الـ ++C في استلام مهام جديدة أم تفضلون الانتظار للامتحانات كذلك؟

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

خبير  أحمد عزالدين مشاركة 35

السلام عليكم
 
جزاك الله خيرا على المجهود
انا ان شاء الله مستعد للمهمة التالية
الامتحانات عندنا بعد حوالي 20 يوم
يعني يمكننا علي الاقل انهاء مهمة اخرى
 
اتمنى الا يكون ذلك ضد مصلحة اى عضو اخر - يمكننى الانتظار اذا كان الباقون مشغولين
 
وجزاكم الله خيرا
والسلام عليكم

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

مبتدئ  أحمد برهام مشاركة 36

بتاريخ 24 ابريل 2008 02:39 ص، قطب ahmed ezz حاجبيه بشدة وهو يقول:

الامتحانات عندنا بعد حوالي 20 يوم
يعني يمكننا علي الاقل انهاء مهمة اخرى
 
اتمنى الا يكون ذلك ضد مصلحة اى عضو اخر - يمكننى الانتظار اذا كان الباقون مشغولين


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

Eng Ahmed Borham

خبير  أحمد عزالدين مشاركة 37

السلام عليكم

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

void InputManager::KeyboardAssignControl(const int eGameControl, const int eDIKey)
{
	if(!m_bJoystickReady)
		return;
	m_KeyboardActionMap.insert(pair<int,>(eGameControl, eDIKey));
	m_KeyboardActionEvents.insert(pair<int,>(eGameControl, InputEvent_KeyUp));
}


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

يجب تعديل الملف input.cpp والذي يحوي الدالة المذكورة ليصبح شكلها كالاتى:
void InputManager::KeyboardAssignControl(const int eGameControl, const int eDIKey)
{
	//if(!m_bJoystickReady)
	//	return;
	m_KeyboardActionMap.insert(pair<int,>(eGameControl, eDIKey));
	m_KeyboardActionEvents.insert(pair<int,>(eGameControl, InputEvent_KeyUp));
}

وذلك بالغاء فحص الجويستيك في دالة لا تهتم الا بالتعامل مع الكيبورد

وربنا يوفقنا جميعا
والسلام عليكم

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

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

في 24 نيسان 2008 05:15 م، عقد ahmed ezz حاجبيه بتفكير وقال:

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

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

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

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

مبتدئ  أحمد برهام مشاركة 40

وفي 24 ابريل 2008 05:15 م، قال ahmed ezz متحمساً:

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

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

Eng Ahmed Borham