MLX42 เป็นไลบรารีกราฟิกที่มีหน้าต่างน้อยที่สุดและมีประสิทธิภาพ ใช้งานง่าย ข้ามแพลตฟอร์ม เพื่อสร้างแอปพลิเคชันกราฟิกโดยไม่ต้องทำงานโดยตรงกับกรอบหน้าต่างดั้งเดิมของระบบปฏิบัติการที่กำหนด
มันมีเครื่องมือพื้นฐานในการวาดพื้นผิวลงบนหน้าต่างรวมถึงการแก้ไขในขณะรันไทม์เมื่อมีการแสดงบนหน้าต่าง
สำคัญ
บางครั้งอาจดูเหมือนไม่มีการอัปเดตเกิดขึ้นเป็นเวลานาน เป็นไปตามที่คาดหวัง โครงการ / lib ถือว่าเสร็จสมบูรณ์และต้องมีการอัปเดตเพียงเล็กน้อย ยังคงรับประกันการแก้ไขข้อบกพร่องและโครงการยังคงได้รับการบำรุงรักษาอย่างแข็งขัน
MLX42 มาพร้อมกับคุณสมบัติมากมายที่ทำให้การใช้งานเป็นเรื่องน่ายินดีแทนที่จะเป็นงานบ้าน
รันบน WindowsXP ของคุณยาย บนเดเบียนของลุงของคุณ หรือบน MacOS ของฮิปสเตอร์! ไม่ว่าแพลตฟอร์มใดก็ตาม หาก MLX42 สามารถสร้างบนแพลตฟอร์มนั้นได้ มันก็จะทำงานบนระบบหน้าต่างดั้งเดิมของมัน
สิ่งนี้ช่วยให้คุณทำงานในโครงการของคุณได้ไม่ว่าจะใช้เครื่องใดก็ตาม
MLX42 ใส่ใจในเรื่องเอกสารที่ดี ทุกฟังก์ชั่น การใช้งาน และแม้กระทั่งการทำงานภายในบางอย่างได้รับการบันทึกไว้! ไม่ต้องเดาและค้นหาอีกต่อไปว่าบางสิ่งทำงานหรือควรจะทำงานอย่างไร
สร้างขึ้นบน OpenGL และใช้การเรนเดอร์แบบเป็นชุดเพื่อเร่งกระบวนการเรนเดอร์ให้เร็วขึ้นเมื่อเปรียบเทียบกับไลบรารีอื่น
โครงการนี้ได้รับการดูแลอย่างแข็งขันโดย Codam และนักเรียนจาก 42 Network สิ่งนี้ทำให้นักเรียนมีโอกาสโดยตรงในการเรียนรู้เพิ่มเติมเกี่ยวกับห้องสมุด รวมถึงแก้ไขจุดบกพร่องที่อาจเกิดขึ้น แทนที่จะเพียงยอมรับมัน
MLX42 แนะนำความเข้ากันได้กับ Emscripten ทำให้ MLX42 สามารถทำงานในเว็บเบราว์เซอร์ผ่าน WebAssembly การปรับเปลี่ยนนี้เกิดขึ้นได้เพราะ @PepeLevi ให้เครดิตเขาสำหรับการแยกและการสนับสนุนของเขา
โดยรวมแล้วการก่อสร้างโครงการนี้จะเป็นดังนี้สำหรับระบบ ALL ตราบใดที่ CMake สามารถเข้าใจได้
ในกรณีที่ระบบของคุณไม่ได้ติดตั้ง glfw cmake จะตรวจพบสิ่งนี้และดาวน์โหลดให้คุณ จากนั้นคุณสามารถเรียกใช้ sudo make install
ในไดเร็กทอรี _deps
ของ glfw หากคุณใช้คอมพิวเตอร์ 42 (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 และ CMake ขอแนะนำอย่างยิ่งให้คุณใช้ brew เพื่อติดตั้งการขึ้นต่อกันที่ขาดหายไป
สำหรับ 42 วิทยาเขต คุณสามารถใช้: 42Homebrew
มิฉะนั้นด้วยโฮมบรูว์:
brew install glfw
brew install cmake
หากคุณใช้ Apple Silicon (ชิป M1 หรือใหม่กว่า) โปรดทราบว่าเส้นทางการติดตั้ง Homebrew นั้นแตกต่างออกไป คุณอาจต้องการอัปเดตไฟล์การกำหนดค่าเชลล์ของคุณ สำหรับผู้ใช้ Zsh (เชลล์เริ่มต้นสำหรับ macOS เวอร์ชันใหม่กว่า):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib
รีสตาร์ทเซสชันเชลล์ของคุณหรือรีสตาร์ทเทอร์มินัลเพื่อให้การเปลี่ยนแปลงมีผล
สำหรับ 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
จะสร้างไฟล์โครงการ Visual Studio เพียงสร้างมันขึ้นมาและเมื่อคุณมีไฟล์ .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 );
}