وحدة إدخال OpenGL وهي إحدى الطرق الممكنة التي تمكننا من التفاعل مع شاشه أوبن جل ومع استخدام GLFW ستتمكن من الحصول على شكل من أشكال التحكم الرئيسيه في النافذة.
وبالتالي تزودنا وحدة إدخال OpenGL بدالة اتصال رجعية تشير إلى ضبط عمليات الإدخال في وقت مناسب.
في هذا الدرس ستتمكن من إنشاء لوحة تحكم بسيطة تقوم بفعل حدث عند فتح النافذة.
على سبيل المثال , سنشير إلى وحدة إدخال OpenGL بالخروج من البرنامج عند الضغط على المفتاح Esc في لوحة المفاتيح.
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
يأخذ مفتاح الإدخال أول قيمة متمثلة بالشاشة بينما القيمة الثانية تعبر عن المفتاح الذي سيتم الضغط عليه وهو متمثل بقيمة من نوع integer.[1]
وبالتالي لا ننسى أن جميع القيم في المدخلات هي عبارة عن أرقام عشرية يستقبلها الحاسوب ويقوم بتمريرها إلى القسم الخاص بوحدات الإدخال.[1]
ومع ذلك عندما يتم الضغط على أي مفتاح تتولى مكتبة GLFW الاتصال بالدالة السابقة وتحدد محتوى المعالجة بناء عليه.[1]
يقوم الأمر scancode بفحص رمز الإدخال ليتم توجيه العملية ثم تتولى كل من قيمة الحدث والنمط الإجراء المطلوب.[1]
بعد القيام باستلام المدخلات في الشاشة تعمل وحدة إدخال OpenGL على استقبال القيمة. ومن ثم تعيد الحدث لمؤشر النافذة من خلال الشيفرة التالية.[1]
glfwSetKeyCallback(window, key_callback);
تقوم الدالة glfwSetKeyCallback باستقبال دالة قيمة كل من النافذة و دالة key_callback لتتم عملية المعالجة بناء عليها.[1]
مع ذلك نضع في الحسبان الكثير من مهام key_callback التي يمكننا استخدامها لاحقًا مثل فحص الأخطاء وتغيير أبعاد الشاشة مثل التصغير أو التكبير وغيرها من المدخلات التي تتم عبر وحدة إدخال OpenGL .[1]
في حال وجدت صعوبة في فهم الشيفرة السابقة , سنوفر لك شيفرة قمنا بتطبيقها على التوالي في هذا الدرس. ولكن ندعوك إلى التحقق من طريقة الربط التي قمنا بها في الدرس الأول من هذه الدورة.
في البداية يتوجب علينا إجراء إعلان دالة الإدخال في بداية صفحة main.cpp. بالتالي قم بنسخ هذه الشيفرة :
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
في حال وجدت صعوبة في فهم آلية الوظائف وكيف تعمل فإننا وفرنا لك شرح جيد من خلال دورة c++ للمبتدئين. لا بد للإشارة بأن دالة key_callback هي باطلة مع قيم ثابتة, ما يعني لا تصلح للتعديل إلا في حالات استثنائية إن دعت لها الحاجة.
الآن وبعد الإعلان عن الدالة في المشروع يتطلب منا القيام بعملية التنفيذ أسفل دالة main.cpp وبالتالي تصبح شيفرة التنفيذ على النحو التالي:
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { std::cout << key << std::endl; if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); }
يتبقى الجزء الأخير من وحدة إدخال OpenGL وهو الاتصال بالدالة من داخل main.cpp عن طريق الوظيفة glfw SetKey Callback لتصبح الشيفرة المناداة على النحو التالي:
glfwSetKeyCallback(window, key_callback);
بالتالي وبعد أن الانتهاء من ضبط وحدة الإدخال سنتمكن من تنفيذ الشيفرة لتصبح على النحو التالي:
#include <iostream> #define GLEW_STATIC #include <glew.h> #include <glfw3.h> GLFWwindow*window; // key callback declaration void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); void main() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); window = glfwCreateWindow(800, 600, "First OpenGL Page", nullptr, nullptr); if (window == nullptr) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); } glfwMakeContextCurrent(window); //glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { std::cout << "Failed to initialize GLEW" << std::endl; //return -1; } glViewport(0, 0, 800, 600); //Call input units glfwSetKeyCallback(window, key_callback); while (!glfwWindowShouldClose(window)) { glClearColor(0.1f, 0.3f, 0.7f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwPollEvents(); glfwSwapBuffers(window); } glfwTerminate(); //return 0; } //key_callback definition void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { std::cout << key << std::endl; if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); }![]()