الصفحة الرئيسية/ التقنية / وحدة إدخال OpenGL : دورة OpenGL لغة c++ الدرس الثالث

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


for Large تمت الكتابة بواسطة : محمد

for Large for Mobile

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

في البداية يجب إجراء إعلان دالة الإدخال في بداية صفحة main.cpp.

بالتالي نقوم بنسخ هذا الكود:

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

لا شك بأن دالة key_callback هي من نوع void مع قيم ثابتة ، ما يعني لا تصلح للتعديل إلا في حالات استثنائية إن استدعى الأمر.  

الآن وبعد الإعلان عن الدالة في المشروع يتطلب منا القيام بعملية التنفيذ أسفل دالة 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);
}

 

   

المراجع

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

وقت النشر : 2023-02-04 20:18:22 ·

1    التصنيفات






2    مقالات من التقنية

يعتمد هذا الموقع على عرض الإعلانات في تحقيق الدخل ، نشكر تفهمكم الدائم ونتمنى لكم قضاء وقت رائع ... وشكراً :D .