MLX42 عبارة عن مكتبة رسومات نوافذ عالية الأداء وسهلة الاستخدام ومتعددة المنصات لإنشاء تطبيقات رسومية دون الحاجة إلى العمل مباشرة مع إطار عمل النوافذ الأصلي لنظام التشغيل المحدد.
فهو يوفر أدوات بدائية لرسم الأنسجة على النافذة بالإضافة إلى تعديلها في وقت التشغيل عند عرضها على النافذة.
مهم
في بعض الأحيان قد يبدو أنه لم يتم إجراء أي تحديثات لفترة طويلة. هذا أمر متوقع، ويعتبر المشروع / lib مكتملًا ويتطلب الحد الأدنى من التحديثات. لا تزال إصلاحات الأخطاء مضمونة ولا يزال المشروع قيد الصيانة النشطة.
يأتي MLX42 مع مجموعة كبيرة من الميزات التي تجعل استخدامه في الواقع متعة وليس عملاً روتينيًا.
قم بتشغيله على نظام التشغيل WindowsXP الخاص بجدتك، أو على نظام دبيان الخاص بعمك، أو على نظام التشغيل MacOS الخاص بعشاق الموضة! بغض النظر عن النظام الأساسي، إذا كان بإمكان MLX42 البناء عليه، فسيتم تشغيله على نظام النوافذ الأصلي الخاص به.
يتيح لك هذا العمل على مشروعك بغض النظر عن الجهاز الذي يعمل عليه.
يهتم MLX42 بالتوثيق الجيد، حيث يتم توثيق كل وظيفة واستخدام وحتى بعض الأعمال الداخلية! لا مزيد من التخمين والبحث عن كيفية عمل شيء ما أو من المفترض أن يعمل.
إنه مبني على OpenGL ويستخدم العرض المجمع لتسريع عملية العرض مقارنة بالمكتبات الأخرى.
تتم صيانة هذا المشروع بشكل نشط بواسطة Codam بالإضافة إلى طلاب من شبكة 42. يمنح هذا الطلاب فرصة مباشرة لمعرفة المزيد عن المكتبة نفسها بالإضافة إلى إصلاح أي أخطاء محتملة بدلاً من مجرد قبولها.
يقدم MLX42 التوافق مع Emscripten، مما يسمح بتشغيل MLX42 في متصفحات الويب من خلال WebAssembly. أصبح هذا التعديل ممكنًا بفضل @PepeLevi، الفضل له في شوكته ومساهماته.
عموما بناء هذا المشروع هو كما يلي لجميع الأنظمة. طالما أن CMake يمكن أن يفهم ذلك.
في حالة عدم تثبيت برنامج glfw على نظامك، سيقوم cmake باكتشاف ذلك وتنزيله لك. يمكنك بعد ذلك تشغيل sudo make install
في دليل _deps
الخاص بـ glfw. إذا كنت تستخدم جهاز كمبيوتر (MacOS وLinux)، فاطلب من مسؤول النظام المفضل لديك تثبيته. الأمر نفسه ينطبق على CMake أو أي تبعيات أخرى قد تحتاجها لنظامك.
ومع ذلك، إذا لم تتمكن من القيام بأي من CMake، فسيظل بإمكانك جلب GLFW وإنشائه. يمكنك بعد ذلك ربطه بشكل ثابت من المجلد _deps
.
ملحوظة
بالنسبة إلى Codam، تم تثبيت GLFW بالفعل على أجهزة Mac.
ملحوظة
أثناء مرحلة الربط، يمكن أن تكون العلامة لربط GLFW إما: -lglfw3 أو -lglfw حسب نظامك.
قم بتجميع برنامجك مع المكتبة:
ربح!
لإنشاء المكتبة بالكامل وتثبيتها على نظامك، قم بتشغيل الأمر التالي:
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target install
افتراضيًا، سيقوم Windows بوضع lib المثبت في: C:Program Files (x86)mlx42
وبالنسبة لنظام التشغيل MacOS / Linux، سيتم وضعه في /usr/local/lib
و /usr/local/include
على التوالي.
يأتي MLX42 مع بعض اختبارات الوحدات للتأكد من سلامة المكتبة، ولبنائها قم بتشغيل الأمر التالي:
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel
ثم قم بتشغيلها ببساطة باستخدام:
ctest --output-on-failure --test-dir build
git clone https://github.com/codam-coding-college/MLX42.git
cd MLX42
cmake -B build # build here refers to the outputfolder.
cmake --build build -j4 # or do make -C build -j4
يسمى ملف مكتبة الإخراج libmlx42.a
وهو موجود في مجلد build
الذي حددته.
يمكنك تمرير خيارات البناء إلى cmake، على سبيل المثال: cmake -DDEBUG=1 -DGLFW_FETCH=0...
. ستتيح لك هذه على سبيل المثال إنشاءه في وضع DEBUG أو تغيير أي نوع من السلوك في وقت الإنشاء.
يمكنك العثور على مثال لملف makefile في الوثائق هنا.
إذا كان نظامك لا يحتوي على GLFW أو CM، فمن المستحسن بشدة استخدام Brew لتثبيت تلك التبعيات المفقودة.
بالنسبة لـ 42 حرمًا جامعيًا، يمكنك استخدام: 42Homebrew
خلاف ذلك مع البيرة المنزلية:
brew install glfw
brew install cmake
إذا كنت تستخدم Apple Silicon (شريحة M1 أو أحدث)، فلاحظ أن مسار تثبيت Homebrew مختلف. قد ترغب في تحديث ملف تكوين Shell الخاص بك. لمستخدمي Zsh (الواجهة الافتراضية في إصدارات macOS الأحدث):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
أعد تشغيل جلسة Shell الخاصة بك أو أعد تشغيل جهازك حتى تدخل التغييرات حيز التنفيذ.
بالنسبة لنظام التشغيل MacOS، يتعين عليك استخدام العلامات التالية لتجميع برنامجك مع المكتبة من أجل ربط البرنامج بأطر العمل الصحيحة:
-framework Cocoa -framework OpenGL -framework IOKit
عادةً، إذا قمت ببساطة بتثبيت/إنشاء glfw
من المصدر أو قمت بالفعل بتثبيته، فيجب أن يكون التجميع:
gcc main.c ... libmlx42.a -Iinclude -lglfw
# Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /opt/homebrew/Cellar/glfw/3.3.8/lib/ "
# 42Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /Users/ $( USER ) /.brew/opt/glfw/lib/ "
عند تشغيل برنامجك على نظام MacOS، قد يشكو، لأنه مع أجهزة Mac يجب عليك التفكير بشكل مختلف. في حالة ظهور أي تحذيرات أمنية أو إخبارك لنظام التشغيل MacOS بأنه لا يمكنه التحقق من المؤلف/المطور، انتقل إلى Settings > Security & Privacy
.
ستكون هناك نافذة منبثقة في الأسفل تخبرك بمحاولة تطبيق ما للتشغيل، انقر فوق الخيار للسماح بتشغيله.
بالنسبة لنظام Debian مثل (Ubuntu، Mint، Pop OS...):
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-dev
بالنسبة إلى Arch-linux (Manjaro وEndeavour وGaruda):
sudo pacman -S glfw-x11
أو (إذا كنت تستخدم مؤلف sway/wlroots أو مؤلف Wayland آخر)
sudo pacman -S glfw-wayland
قم بتنزيل وبناء MLX42
قم بتجميع برنامجك مع المكتبة:
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm
مهم
قبل البدء بكل هذه الخطوات، اقرأ هذا
.zshrc
أو .bashrc
: export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0
(إذا فشل أمر تصدير DISPLAY، راجع منشور StackOverflow هذا للحصول على البدائل)
قم بتنزيل وتثبيت تطبيق XServer بتكوين موسع (XMing غير مؤهل) يعمل VcXsrv: https://sourceforge.net/projects/vcxsrv/
افتح جدار حماية Windows Defender، واتبع الخطوات التالية:
Native opengl
Disable access control
مهم
انتبه إلى أن Visual Studio (2022) مطلوب لهذا الغرض. قد يكون التطوير على Windows محبطًا إلى حد ما.
نوصي بشدة باستخدام WSL2 لجعل هذا الأمر غير مؤلم قدر الإمكان. ومع ذلك، إذا كنت تصر على إنشاء Windows محليًا، فكل ما تحتاجه فيما يتعلق بالتبعيات هو:
بمجرد الانتهاء من تثبيت جميع التبعيات بشكل صحيح، سيقوم CMake
بإنشاء ملفات مشروع الاستوديو المرئي. ما عليك سوى إنشائه وبمجرد حصولك على ملف .lib
، انقله إلى مشروعك الفعلي وقم بتثبيته كما تفعل مع أي مكتبة أخرى.
فقط في حالة وجود مقطع فيديو يوضح لك كيف يمكن القيام بذلك. ويغطي هذا الفيديو أيضًا كيفية ربط glfw
.
بالطبع الأمر متروك لك للتأكد من أن الكود الذي تكتبه قابل للنقل. الأشياء الموجودة على Unix
لا توجد بالضرورة على Win32
.
// -----------------------------------------------------------------------------
// Codam Coding College, Amsterdam @ 2022-2023 by W2Wizard.
// See README in the root project for more information.
// -----------------------------------------------------------------------------
#include
#include
#include
#include
#define WIDTH 512
#define HEIGHT 512
static mlx_image_t * image ;
// -----------------------------------------------------------------------------
int32_t ft_pixel ( int32_t r , int32_t g , int32_t b , int32_t a )
{
return ( r << 24 | g << 16 | b << 8 | a );
}
void ft_randomize ( void * param )
{
( void ) param ;
for ( uint32_t i = 0 ; i < image -> width ; ++ i )
{
for ( uint32_t y = 0 ; y < image -> height ; ++ y )
{
uint32_t color = ft_pixel (
rand () % 0xFF , // R
rand () % 0xFF , // G
rand () % 0xFF , // B
rand () % 0xFF // A
);
mlx_put_pixel ( image , i , y , color );
}
}
}
void ft_hook ( void * param )
{
mlx_t * mlx = param ;
if ( mlx_is_key_down ( mlx , MLX_KEY_ESCAPE ))
mlx_close_window ( mlx );
if ( mlx_is_key_down ( mlx , MLX_KEY_UP ))
image -> instances [ 0 ]. y -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_DOWN ))
image -> instances [ 0 ]. y += 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_LEFT ))
image -> instances [ 0 ]. x -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_RIGHT ))
image -> instances [ 0 ]. x += 5 ;
}
// -----------------------------------------------------------------------------
int32_t main ( void )
{
mlx_t * mlx ;
// Gotta error check this stuff
if (!( mlx = mlx_init ( WIDTH , HEIGHT , "MLX42" , true)))
{
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if (!( image = mlx_new_image ( mlx , 128 , 128 )))
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if ( mlx_image_to_window ( mlx , image , 0 , 0 ) == -1 )
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
mlx_loop_hook ( mlx , ft_randomize , mlx );
mlx_loop_hook ( mlx , ft_hook , mlx );
mlx_loop ( mlx );
mlx_terminate ( mlx );
return ( EXIT_SUCCESS );
}