نظام التشغيل والتنفيذ وصول مستقل إلى لوحة المفاتيح؟

StackOverflow https://stackoverflow.com/questions/621716

سؤال

لقد صنعت لعبة FPS مع MSVC ++ والتي تعمل بشكل جيد للغاية على Windows. لكنني الآن أحاول أن أجعلها محمولة (على الأقل أريد إنشاء Linux وإصدار Windows) ، لذلك قررت تغيير IDE إلى Code :: Blocks والإطار إلى WXWidgets. ولكن يبدو أن رموز المفاتيح الافتراضية ورموز المسح مختلفة في أنظمة مختلفة.

لقد واجهت في وقت سابق أن الرموز المفاتيح الافتراضية قد تكون مختلفة حتى في نفس نظام التشغيل ولكن الكمبيوتر مختلف (حصلت على تقارير أخطاء حول عدم قدرتها على التحكم رمز لاستخدام Scancodes بدلاً من رموز Vertkeain) (تحرير: مع WXWidgets كلاً من رموز Virtkail و Scan على Numpad لها قيم مختلفة اعتمادًا على حالة numlock ، Bang!)

الآن مع WXWidgets ، يبدو أن WxKeyevent :: getRawKeyCode والرمز الذي تم الحصول عليه مسبقًا من WM_Keydown's LPARAM مختلفان. وأحصل أيضًا على رمز فحص مختلف تمامًا على Linux (Ubuntu) من GetRawKeyCode.

حسنًا ، يمكنني إنشاء جدول رمز المسح الخاص بي عن طريق الضغط على جميع المفاتيح ورؤية الرمز الذي يعطيه ، ولكن المشكلة الوحيدة التي يديرها Ubuntu على جهاز الكمبيوتر المحمول الخاص بي ، ولا يحتوي الكمبيوتر المحمول على لوحة مفاتيح كاملة ... لكنني بحاجة جميعًا إليها لجعل إعدادات التحكم تعمل.

لذا فإن السؤال: هل هناك طريقة قياسية وعبر منصة للحصول على نفس الكود لنفس المفتاح (المفتاح في نفس الموضع ليكون أكثر دقة)؟ (على الأقل على Windows و Linux)

هل كانت مفيدة؟

المحلول

في حال لم تفكر في ذلك بالفعل ، فقد تتمكن من استخدامه SDL.

نصائح أخرى

هذه هي مجموعة أدوات الرسومات ذات المستوى الأدنى الذي تستخدمه يحدث فرقًا كبيرًا (أفترض أنك لا تكتب رسومات ثلاثية الأبعاد في WXWidgets). إذا كنت تستخدم OpenGL ، هل نظرت إلى ماذا تخمة يقدر على؟

ال glatkeyboardfunc و glutspecialfunc مدموج مع GlutgetModiers يمكن أن تكون كافية لرمز لوحة المفاتيح عبر المنصات ، ويمكن استخدام GLUT لأجهزة الإدخال الأخرى.

لكي أكون صادقًا ، ما زلت لا أرى كيف يمكن أن يكون لذلك أي علاقة بـ WXWidgets.

رأيي هو أنه من الخطأ تمامًا استخدام WXWidgets لترميز الألعاب ثلاثية الأبعاد سريعة الخطى. في تطوير لعبة "المتشددين" ، يجب عليك استخدامها لتطوير أدوات داعمة ، مثل المحررين والمحولات.

SDL هو الطريق للذهاب. قد يبدو الأمر أساسيًا تمامًا ، ولكن بمجرد أن تبدأ في التضحية بالأطفال الصغار للآلهة غير المقدسة لـ SDL ، مثل أشياء مثل SDL_IMAGE (مثالي لقراءة العديد من تنسيقات ملفات الصور - إلى الحد الذي أستخدمه أحيانًا SDL فقط لقراءة مثل JPEG) أو SDL_Mixer (الحل الوحيد الذي تحتاجه لقراءة وتشغيل الصوت الأساسي - OGG ، WAV ، ...).

لذلك لا تنظر إلى أبعد من SDL. حتى دعم الرسومات ثنائي الأبعاد جيد بمجرد البدء في استخدام SDL_GFX. قد يبدو SDL في البداية أساسيًا ، ولكن بمجرد الاعتماد على جميع المكتبات الإضافية التي تم بناؤها حولها ، وبمجرد أن ترمز إلى عدد قليل من الأغلفة حولها ، سترى أن SDL هو التوازن المثالي بين الضروريات العارية وسهولة الاستخدام المتقدم.

سأكون سعيدًا بمساعدتك بأي شكل من الأشكال مع SDL لأنني أجدها رائعة جدًا.

قد أسيء إساءة فهم ما تراه هنا ، لكن النظر إلى عاد رمز المفاتيح الخام سوف يؤدي إلى اختلافات الأجهزة ونظام التشغيل والتكوين والمنصة ، لذلك يجب أن تنظر إلى تم إرجاع رمز المفاتيح الظاهري بواسطة الحدث الرئيسي.

تحرير: ربما wxwidgets فقط لا تتعامل معه بشكل صحيح (مشكوك فيه). تتمثل مشكلة مفتاح Numlock في "إجبارك على العمل حول هذا (ضعيف) باستخدام رمز المسح الخام.

إذا كان هذا هو الحال ، فأنت لا تحتاج إلى التخلص من ما فعلته ، ولكن إذا أضفت SDL فقط لأشياء الإدخال ، ستجد المكالمات التي تُرجع SDL_KEYSYM لا تُرجع فقط scricode للأجهزة (والتي لا يمكنك فعل أي شيء بشأن "إصلاح") ولكن أيضًا قم بتخطيطها إلى حرف Unicode ورمز افتراضي ، وهو ما أعتقد ما تبحث عنه. نأمل أن لا تملك مكالماتهم مشكلة معدل numlock هذه.

إذا لم تكن قد لا تستخدم SDL ، فإنني أوصي SFML - مكتبة الوسائط المتعددة البسيطة والسريعة. انها متعددة المنصات وبسيطة حقا للاستخدام. على سبيل المثال ، من قسم الدروس:

bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

حيث المدخلات

const sf::Input& Input = App.GetInput();

هناك بعض المؤشرات هذا SFML أسرع من SDL ، ومع ذلك أنا أميل إلى استخدامه لطرح التعليمات البرمجية السريعة والمحمولة لأنني أحب استخدامه أكثر من SDL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top