وحدة إدخال OpenGL : دورة OpenGL لغة c++ الدرس الثالث


وحدة إدخال 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]

 


تنفيذ وحدة إدخال OpenGL



في حال وجدت صعوبة في فهم الشيفرة السابقة , سنوفر لك شيفرة قمنا بتطبيقها على التوالي في هذا الدرس. ولكن ندعوك إلى التحقق من طريقة الربط التي قمنا بها في الدرس الأول من هذه الدورة.


الإعلان عن دالة key_callback


في البداية يتوجب علينا إجراء إعلان دالة الإدخال في بداية صفحة main.cpp. بالتالي قم بنسخ هذه الشيفرة :

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);

في حال وجدت صعوبة في فهم آلية الوظائف وكيف تعمل فإننا وفرنا لك شرح جيد من خلال دورة c++ للمبتدئين. لا بد للإشارة بأن دالة key_callback هي باطلة مع قيم ثابتة, ما يعني لا تصلح للتعديل إلا في حالات استثنائية إن دعت لها الحاجة.

 

تجنب التعديل في متغيرات المكتبة الداخلية مثل العبث في الدالة 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);
}

 

 

وحدة ادخال OpenGL
صورة يظهر فيها نتائج تشغيل برنامج OpenGL بعد تنفيذ دالة وحدة الإدخال key_callback.

 

 

 

المراجع
  1. [1]^ كتاب ـــــــ offline learn OpenGL created by Joey de Vries.
  2. [2]^source code of key_callback.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *