Simple 2D เป็นเอ็นจิ้นกราฟิกโอเพ่นซอร์สขนาดเล็กที่ให้ความสามารถด้านการวาดภาพ 2D สื่อ และการป้อนข้อมูลที่จำเป็น เขียนด้วยภาษา C และทำงานได้บนหลายแพลตฟอร์ม สร้าง windows แบบเนทีฟ และโต้ตอบกับฮาร์ดแวร์โดยใช้ SDL ในขณะที่เรนเดอร์เนื้อหาด้วย OpenGL
โปรดทราบว่า README นี้จะได้รับการอัปเดตอย่างต่อเนื่องเมื่อมีการเพิ่มคุณสมบัติใหม่ แก้ไขข้อบกพร่อง และทำการเปลี่ยนแปลงอื่นๆ ดูบันทึกประจำรุ่นสำหรับลิงก์ไปยังเอกสารประกอบของเวอร์ชันนั้น
เปิดปัญหาบน GitHub หากคุณพบปัญหาใดๆ มีคำขอคุณสมบัติ หรือเพียงแค่ต้องการถามคำถาม เรียนรู้เพิ่มเติมเกี่ยวกับการมีส่วนร่วมด้านล่าง
Simple 2D รองรับระบบปฏิบัติการหลักและแพลตฟอร์มฮาร์ดแวร์ทั้งหมด และได้รับการทดสอบบน macOS, iOS, tvOS, Windows, Linux และ Raspbian รุ่นล่าสุดบน Raspberry Pi
หากต้องการติดตั้งรุ่นล่าสุด...
ใช้โฮมบรูว์:
brew tap simple2d/tap
brew install simple2d
สูตร Homebrew ข้างต้นจะติดตั้งเฟรมเวิร์ก iOS และ tvOS ไปที่ /usr/local/Frameworks/Simple2D
ตามค่าเริ่มต้น หลังจากติดตั้งแล้ว ให้รันคำสั่ง simple2d simulator
เพื่อดูตัวเลือกที่มีอยู่สำหรับการโต้ตอบกับเครื่องจำลอง iOS และ tvOS เรียกใช้ simple2d build
เพื่อเรียนรู้วิธีสร้างโปรเจ็กต์ Xcode ด้วย iOS และ tvOS SDK ตัวอย่างโปรเจ็กต์ Xcode สามารถพบได้ในพื้นที่เก็บข้อมูล deps
ดาวน์โหลดตัวติดตั้ง Windows สำหรับ Visual C++ หรือ MinGW
สำหรับ MinGW เราขอแนะนำให้ใช้สภาพแวดล้อม MSYS2 (มีให้ใช้งานใน Chocolatey ด้วย) พร้อมด้วยพรอมต์คำสั่ง MinGW 64 บิต (โดยปกติคือ mingw64.exe
) สามารถติดตั้ง Simple 2D บน MinGW ได้โดยใช้คำแนะนำ Linux ด้านล่าง
เรียกใช้สคริปต์ Bash simple2d.sh
ทุกอย่างจะได้รับการอธิบายตลอดทาง และคุณจะได้รับแจ้งก่อนดำเนินการใดๆ หากต้องการเรียกใช้สคริปต์จากเว็บ ให้วางส่วนย่อยนี้ในเทอร์มินัลของคุณ:
url= ' https://raw.githubusercontent.com/simple2d/simple2d/master/bin/simple2d.sh ' ; which curl > /dev/null && cmd= ' curl -fsSL ' || cmd= ' wget -qO - ' ; bash <( $cmd $url ) install
Simple 2D รองรับแพลตฟอร์ม ARM ที่ใช้ Linux เช่น Raspberry Pi เนื่องจากลีนุกซ์ส่วนใหญ่มีแพ็คเกจ SDL ที่กำหนดค่าไว้สำหรับแพลตฟอร์มเดสก์ท็อปแบบดั้งเดิม สคริปต์การติดตั้งจะคอมไพล์ SDL จากแหล่งที่มาเมื่อตรวจพบ ARM ซึ่งจะปิดการใช้งานระบบหน้าต่าง (เช่น X11) และ OpenGL (บังคับใช้ OpenGL ES แทน)
เมื่อติดตั้งแล้ว ให้ใช้ยูทิลิตีบรรทัดคำสั่ง simple2d
เพื่ออัปเดต Simple 2D ตรวจสอบปัญหา ส่งออกไลบรารีที่จำเป็นสำหรับการคอมไพล์แอปพลิเคชัน และอื่นๆ เพียงเรียกใช้ simple2d
เพื่อดูคำสั่งและตัวเลือกที่มีทั้งหมด
หรือคุณสามารถคอมไพล์และติดตั้ง Simple 2D จากแหล่งที่มาได้ ขั้นแรกให้โคลน repo นี้โดยใช้:
git clone --recursive https://github.com/simple2d/simple2d.git
เพื่อรักษาขนาดของพื้นที่เก็บข้อมูลนี้ให้มีขนาดเล็ก โมดูลย่อย Git จะใช้เพื่ออ้างอิงสื่อทดสอบและการขึ้นต่อกัน การตั้งค่าสถานะ --recursive
ช่วยให้มั่นใจได้ว่าโมดูลย่อยจะเริ่มต้นและอัปเดตเมื่อมีการโคลน repo นี้ หากคุณบังเอิญโคลน Repo นี้โดยไม่มีแฟล็ก --recursive
คุณยังคงสามารถเริ่มต้นและอัปเดตโมดูลย่อยด้วย:
git submodule init
git submodule update --remote
อัปเดตโมดูลย่อยเหล่านี้ได้ตลอดเวลาโดยใช้ git submodule update --remote
ถัดไป สร้างและติดตั้งบนระบบที่คล้าย Unix รวมถึง Windows ที่ใช้ MinGW โดยการเรียกใช้:
make && make install
บน Windows ที่ใช้ Visual C++ ให้เปิดพร้อมท์คำสั่ง Visual Studio 64 บิตแล้วเรียกใช้:
nmake /f NMakefile all install
โปรดทราบว่าบน macOS และ Linux makefile จะไม่ตรวจสอบหรือติดตั้งการขึ้นต่อกัน ซึ่งแตกต่างจากการติดตั้งผ่าน Homebrew หรือสคริปต์ simple2d.sh
ตามลำดับ การพึ่งพาสำหรับ Windows ซึ่งรองรับทั้ง Visual C++ และ MinGW จะ รวมอยู่ใน repo นี้ (อ้างอิงโดยโมดูลย่อย deps
) และติดตั้งโดย makefiles ทั้งสอง
บน Windows ที่ใช้ Visual C++ นั้น Simple 2D จะถูกติดตั้งไปที่ %LOCALAPPDATA%simple2d
ดังนั้นอย่าลืมเพิ่มสิ่งนั้นลงในพาธของคุณ (เช่น ด้วย set PATH=%PATH%;%LOCALAPPDATA%simple2d
) ในกรณีอื่นๆ ทั้งหมด จะมีการติดตั้งไปที่ /usr/local/
บน Windows ที่ใช้ MinGW ตรวจสอบให้แน่ใจว่า /usr/local/bin
อยู่ในเส้นทางของคุณเช่นกัน
หากต้องการสร้างไฟล์เก็บถาวรรีลีสซึ่งแนบมาในรูปแบบการดาวน์โหลดในแต่ละรีลีส ให้รัน make release
บน macOS และ Windows โดยใช้ MinGW และ nmake /f NMakefile release
บน Windows โดยใช้ Visual C++
Simple 2D มีโปรแกรมทดสอบหลายโปรแกรมเพื่อให้แน่ใจว่าทุกอย่างทำงานได้ตามปกติ
auto.c
- ชุดการทดสอบหน่วยอัตโนมัติสำหรับอินเทอร์เฟซสาธารณะtriangle.c
— ตัวอย่าง "Hello Triangle" ใน README นี้testcard.c
— กราฟิกการ์ดที่คล้ายกับการ์ดทดสอบทีวี โดยมีเป้าหมายเพื่อให้แน่ใจว่าภาพและอินพุตทำงานได้อย่างถูกต้องaudio.c
— ทดสอบฟังก์ชันเสียงด้วยรูปแบบไฟล์ต่างๆ ที่แปลเป็นทั้งตัวอย่างเสียงและเพลงcontroller.c
— ให้การตอบรับด้วยภาพและตัวเลขของอินพุตคอนโทรลเลอร์เกมtriangle-ios-tvos.c
- triangle.c
ที่ได้รับการดัดแปลงซึ่งออกแบบมาสำหรับอุปกรณ์ iOS และ tvOS รัน make test
หรือ nmake /f NMakefile test
บน Windows โดยใช้ Visual C++ เพื่อคอมไพล์การทดสอบไปยังไดเร็กทอรี test/
ไฟล์ปฏิบัติการที่ได้จะมีชื่อเดียวกันกับไฟล์ต้นฉบับ C เนื่องจากพาธสื่อถูกตั้งค่าไว้ค่อนข้างในโปรแกรมทดสอบเหล่านี้ ตรวจสอบให้แน่ใจว่าได้ใส่ cd
ลงในไดเร็กทอรี test/
ก่อนที่จะรันการทดสอบ ตัวอย่างเช่น:
# On Unix-like systems
make test && cd test/ && ./testcard
# On Windows using MinGW
make test & cd test & testcard.exe
# On Windows using Visual C++
nmake /f NMakefile test & cd test & testcard.exe
การทดสอบแต่ละครั้งยังมีเป้าหมาย makefile ด้วย ดังนั้นคุณสามารถสร้างและรันการทดสอบโดยใช้ make test testcard
เป็นต้น หรือถอนการติดตั้งทุกอย่างได้อย่างสะดวก สร้าง Simple 2D ใหม่และการทดสอบจากแหล่งที่มา และรันการทดสอบโดยใช้ make rebuild <name_of_test>
ตัวอย่างเช่น:
# Rebuild and run `auto.c` then `testcard.c`...
# ...on Unix-like systems and Windows using MinGW
make rebuild auto testcard
# ...on Windows using Visual C++
nmake /f NMakefile rebuild auto testcard
หากต้องการรันการทดสอบ iOS และ tvOS ขั้นแรกให้รัน make frameworks && make install-frameworks
เพื่อสร้างและติดตั้งเฟรมเวิร์ก iOS และ tvOS จากนั้น รัน make ios
เพื่อรันการทดสอบในเครื่องจำลอง iOS และ make tvos
รันใน tvOS Simulator
การสร้างแอป 2D เป็นเรื่องง่าย! มาสร้างหน้าต่างและวาดรูปสามเหลี่ยมกัน...
#include <simple2d.h>
void render () {
S2D_DrawTriangle (
320 , 50 , 1 , 0 , 0 , 1 ,
540 , 430 , 0 , 1 , 0 , 1 ,
100 , 430 , 0 , 0 , 1 , 1
);
}
int main () {
S2D_Window * window = S2D_CreateWindow (
"Hello Triangle" , 640 , 480 , NULL , render , 0
);
S2D_Show ( window );
return 0 ;
}
บันทึกโค้ดด้านบนลงในไฟล์ชื่อ triangle.c
และคอมไพล์โดยการรัน simple2d build triangle.c
บนบรรทัดคำสั่ง (ใน MinGW ให้รันใน Bash prompt) ตอนนี้รันแอปโดยใช้ ./triangle
บน macOS และ Linux หรือ triangle.exe
บน Windows และเพลิดเพลินไปกับรูปสามเหลี่ยมอันน่าทึ่งของคุณในหน้าต่างขนาด 640x480 ที่ 60 เฟรมต่อวินาที!
คำสั่ง simple2d build
เป็นทางลัดที่มีประโยชน์สำหรับการรวบรวมไฟล์ต้นฉบับเดียว แน่นอน คุณสามารถใช้คอมไพเลอร์ได้โดยตรง เช่น บนระบบที่คล้าย Unix:
cc triangle.c ` simple2d --libs ` -o triangle
และบน Windows ที่ใช้ Visual C++ ในพรอมต์คำสั่งของนักพัฒนา:
cl triangle.c /I %LOCALAPPDATA% s imple2d /link /LIBPATH %LOCALAPPDATA% s imple2d s imple2d.lib /SUBSYSTEM:CONSOLE
# as a PowerShell command
iex " cl triangle.c $( simple2d --libs ) "
มาเรียนรู้เกี่ยวกับการจัดโครงสร้างแอปพลิเคชันสำหรับการวาดภาพ 2D และอื่นๆ อีกมากมาย
เนื้อหา อินพุต และเสียงที่เรนเดอร์ทั้งหมดจะถูกควบคุมโดยหน้าต่าง ดังนั้นการสร้างหน้าต่างจึงเป็นสิ่งแรกที่คุณจะทำ เริ่มต้นด้วยการประกาศตัวชี้ไปยังโครงสร้าง S2D_Window
และเริ่มต้นโดยใช้ S2D_CreateWindow()
S2D_Window * window = S2D_CreateWindow (
"Hello World!" , // title of the window
800 , 600 , // width and height
update , render , // callback function pointers (these can be NULL)
0 // flags
);
หากต้องการตั้งค่าความกว้างและความสูงของหน้าต่างให้เหมือนกับจอแสดงผล ให้ใช้ S2D_DISPLAY_WIDTH
และ S2D_DISPLAY_HEIGHT
สำหรับค่าเหล่านั้นตามลำดับ
ค่าสถานะหน้าต่างอาจเป็น 0
หรือค่าใดค่าหนึ่งต่อไปนี้:
S2D_RESIZABLE // allow window to be resized
S2D_BORDERLESS // show window without a border
S2D_FULLSCREEN // show window at fullscreen
S2D_HIGHDPI // enable high DPI mode
แฟล็กยังสามารถรวมกันได้โดยใช้ตัวดำเนินการระดับบิตหรือ เช่น: S2D_RESIZABLE | S2D_BORDERLESS
ขนาดของวิวพอร์ต พื้นที่ที่กราฟิกถูกวาดในหน้าต่าง สามารถตั้งค่าได้อย่างอิสระจากขนาดหน้าต่าง ดังนี้:
window -> viewport . width = 400 ;
window -> viewport . height = 300 ;
วิวพอร์ตมีโหมดการปรับขนาดต่างๆ เช่น S2D_FIXED
(วิวพอร์ตจะยังคงขนาดเดียวกับการเปลี่ยนแปลงขนาดหน้าต่าง), S2D_EXPAND
(วิวพอร์ตจะขยายให้เต็มหน้าต่างเมื่อปรับขนาด), S2D_SCALE
(ค่าเริ่มต้นที่วิวพอร์ตจะปรับขนาดตามสัดส่วนและอยู่ตรงกลางใน window) หรือ S2D_STRETCH
(วิวพอร์ตจะขยายจนเต็มหน้าต่าง) ตั้งค่าโหมดดังนี้:
window -> viewport . mode = S2D_FIXED ;
ก่อนที่จะแสดงหน้าต่าง คุณสามารถตั้งค่าคุณลักษณะเหล่านี้ได้:
window -> vsync = false; // set the vertical sync, true by default
window -> icon = "app.png" ; // set the icon for the window
เมื่อหน้าต่างของคุณพร้อมใช้งาน ให้แสดงโดยใช้:
S2D_Show ( window );
ทุกครั้งก่อนหรือระหว่างการแสดงหน้าต่าง คุณสามารถตั้งค่าแอตทริบิวต์เหล่านี้ได้:
// Cap the frame rate, 60 frames per second by default
window -> fps_cap = 30 ;
// Set the window background color, black by default
window -> background . r = 1.0 ;
window -> background . g = 0.5 ;
window -> background . b = 0.8 ;
window -> background . a = 1.0 ;
ฟังก์ชันการโทรกลับสามารถเปลี่ยนแปลงได้ตลอดเวลา — ข้อมูลเพิ่มเติมด้านล่าง สามารถอ่านค่าหลายค่าได้จากโครงสร้าง S2D_Window
โปรดดูรายละเอียดในไฟล์ส่วนหัว simple2d.h
ไอคอนหน้าต่างสามารถเปลี่ยนแปลงได้โดยใช้:
S2D_SetIcon ( window , "new_icon.png" );
จับภาพหน้าจอของหน้าต่างในรูปแบบ PNG โดยระบุเส้นทางของไฟล์:
S2D_Screenshot ( window , "./screenshot.png" );
เมื่อคุณทำหน้าต่างเสร็จแล้ว ให้ปล่อยมันโดยใช้:
S2D_FreeWindow ( window );
วงหน้าต่างคือที่ที่การกระทำทั้งหมดเกิดขึ้น: อัตราเฟรมได้รับการตั้งค่า อินพุตได้รับการจัดการ อัปเดตสถานะแอป และแสดงผลภาพ คุณจะต้องประกาศฟังก์ชันสำคัญสองฟังก์ชันซึ่งจะถูกเรียกโดยลูปหน้าต่าง: update()
และ render()
เช่นเดียวกับเกมลูปทั่วไป update()
ใช้สำหรับอัปเดตสถานะแอปพลิเคชัน และ render()
ใช้สำหรับวาดฉาก Simple 2D ปรับทั้งฟังก์ชันให้มีประสิทธิภาพและความแม่นยำ ดังนั้นจึงควรแยกงานอัปเดตและเรนเดอร์ออกจากกัน
ฟังก์ชันการอัพเดตและการเรนเดอร์ควรมีลักษณะดังนี้:
void update () { /* update your application state */ }
void render () { /* draw stuff */ }
อย่าลืมเพิ่มชื่อฟังก์ชันเหล่านี้เมื่อเรียกใช้ S2D_CreateWindow()
(ดูตัวอย่างในส่วน "หน้าต่าง" ด้านบน)
หากต้องการออกจากลูปหน้าต่างเมื่อใดก็ได้ ให้ใช้:
S2D_Close ( window );
สามารถวาดรูปทรงและพื้นผิวทุกประเภทได้ในหน้าต่าง เรียนรู้เกี่ยวกับแต่ละรายการด้านล่าง
มีรูปทรงเรขาคณิตหลายแบบ เช่น สามเหลี่ยม รูปสี่เหลี่ยม (ซึ่งใช้เป็นรูปสี่เหลี่ยมผืนผ้าและสี่เหลี่ยมจัตุรัสได้) เส้น และวงกลม ทุกรูปร่างจะมีจุดยอด กล่าวคือ จุดที่เส้นสองเส้นมาบรรจบกันทำให้เกิดมุม (เช่น สามเหลี่ยมมีสามจุด) สำหรับแต่ละจุดยอดของสามเหลี่ยมและรูปสี่เหลี่ยมขนมเปียกปูน จะต้องตั้งค่าหกค่า ได้แก่ พิกัด x
และ y
และค่าสีสี่ค่า เส้นจะมีจุดยอดสองจุด แม้ว่าจะสามารถกำหนดสีสำหรับแต่ละมุมได้ วงกลมมีจุดกึ่งกลางจุดเดียวและสีที่สามารถตั้งค่าได้ เมื่อจุดยอดมีค่าสีต่างกัน ช่องว่างระหว่างจุดยอดจะผสมกันในลักษณะไล่ระดับสี
ชวเลขสำหรับตัวอย่างด้านล่างคือ:
x = the x coordinate
y = the y coordinate
// Color range is from 0.0 to 1.0
r = red
g = green
b = blue
a = alpha ( opacity )
เมื่อใช้สัญลักษณ์นี้ x2
จะเป็นพิกัด x
ที่สอง และ b2
จะเป็นค่าสีน้ำเงินที่จุดยอดนั้น
หากต้องการวาดรูปสามเหลี่ยมให้ใช้:
S2D_DrawTriangle ( x1 , y1 , r1 , g1 , b1 , a1 ,
x2 , y2 , r2 , g2 , b2 , a2 ,
x3 , y3 , r3 , g3 , b3 , a3 );
หากต้องการวาดรูปสี่เหลี่ยมให้ใช้:
S2D_DrawQuad ( x1 , y1 , r1 , g1 , b1 , a1 ,
x2 , y2 , r2 , g2 , b2 , a2 ,
x3 , y3 , r3 , g3 , b3 , a3 ,
x4 , y4 , r4 , g4 , b4 , a4 );
หากต้องการวาดเส้น ให้ใช้:
S2D_DrawLine ( x1 , y1 , x2 , y2 ,
width ,
r1 , g1 , b1 , a1 ,
r2 , g2 , b2 , a2 ,
r3 , g3 , b3 , a3 ,
r4 , g4 , b4 , a4 );
หากต้องการวาดวงกลมให้ใช้:
S2D_DrawCircle ( x , y , radius , sectors , r , g , b , a );
รูปภาพในรูปแบบยอดนิยมมากมาย เช่น JPEG, PNG และ BMP สามารถวาดในหน้าต่างได้ ต่างจากรูปร่าง รูปภาพจะต้องอ่านจากไฟล์และจัดเก็บไว้ในหน่วยความจำ เพียงประกาศตัวชี้ไปยังโครงสร้าง S2D_Image
และเริ่มต้นโดยใช้ S2D_CreateImage()
เพื่อระบุเส้นทางของไฟล์ไปยังรูปภาพ
S2D_Image * img = S2D_CreateImage ( "image.png" );
หากไม่พบรูปภาพก็จะคืนค่า NULL
เมื่อคุณมีภาพแล้ว คุณสามารถเปลี่ยนตำแหน่ง x, y
ได้ดังนี้:
img -> x = 125 ;
img -> y = 350 ;
เปลี่ยนขนาดของรูปภาพโดยการปรับความกว้างและความสูง:
img -> width = 256 ;
img -> height = 512 ;
หมุนภาพดังนี้:
// Angle should be in degrees
// The last parameter is the point the image should rotate around, either:
// S2D_CENTER, S2D_TOP_LEFT, S2D_TOP_RIGHT, S2D_BOTTOM_LEFT, or S2D_BOTTOM_RIGHT
S2D_RotateImage ( img , angle , S2D_CENTER );
// Or, set a custom point to rotate around
img -> rx = 50 ;
img -> ry = 75 ;
// Set the rotation angle directly
img -> rotate = 90 ;
คุณยังสามารถปรับสีของภาพได้ดังนี้:
// Default is 1.0 for each, a white color filter
img -> color . r = 1.0 ;
img -> color . g = 0.8 ;
img -> color . b = 0.2 ;
img -> color . a = 1.0 ;
สุดท้ายให้วาดภาพโดยใช้:
S2D_DrawImage ( img );
เนื่องจากรูปภาพได้รับการจัดสรรแบบไดนามิก ให้ปล่อยให้ว่างโดยใช้:
S2D_FreeImage ( img );
สไปรท์เป็นรูปภาพชนิดพิเศษที่สามารถใช้สร้างภาพเคลื่อนไหวได้ หากต้องการสร้างสไปรท์ ให้ประกาศตัวชี้ไปยังโครงสร้าง S2D_Sprite
และเริ่มต้นโดยใช้ S2D_CreateSprite()
เพื่อระบุเส้นทางของไฟล์ไปยังอิมเมจสไปรท์ชีต
S2D_Sprite * spr = S2D_CreateSprite ( "sprite_sheet.png" );
หากไม่พบภาพสไปรท์ ก็จะคืนค่า NULL
คลิปภาพต่อเรียงให้เป็นภาพเดียวโดยจัดให้มีรูปสี่เหลี่ยมผืนผ้าสำหรับตัดภาพ:
S2D_ClipSprite ( spr , x , y , width , height );
ตำแหน่ง x, y
ของสไปรท์นั้นสามารถเปลี่ยนแปลงได้ดังนี้:
spr -> x = 150 ;
spr -> y = 275 ;
เปลี่ยนขนาดของสไปรท์โดยการปรับความกว้างและความสูง:
spr -> width = 100 ;
spr -> height = 100 ;
หมุนสไปรท์ดังนี้:
// Angle should be in degrees
// The last parameter is the point the sprite should rotate around, either:
// S2D_CENTER, S2D_TOP_LEFT, S2D_TOP_RIGHT, S2D_BOTTOM_LEFT, or S2D_BOTTOM_RIGHT
S2D_RotateSprite ( spr , angle , S2D_CENTER );
// Or, set a custom point to rotate around
spr -> rx = 50 ;
spr -> ry = 75 ;
// Set the rotation angle directly
spr -> rotate = 90 ;
คุณยังสามารถปรับสีของภาพสไปรท์ได้ดังนี้:
// Default is 1.0 for each, a white color filter
spr -> color . r = 1.0 ;
spr -> color . g = 0.8 ;
spr -> color . b = 0.2 ;
spr -> color . a = 1.0 ;
สุดท้าย วาดสไปรท์โดยใช้:
S2D_DrawSprite ( spr );
เนื่องจากสไปรท์ได้รับการจัดสรรแบบไดนามิก ให้ปลดปล่อยพวกมันโดยใช้:
S2D_FreeSprite ( spr );
ข้อความถูกวาดเหมือนรูปภาพมาก เริ่มต้นด้วยการค้นหาแบบอักษร OpenType ที่คุณชื่นชอบ (ที่มีนามสกุลไฟล์ .ttf
หรือ .otf
) จากนั้นประกาศตัวชี้ไปยังโครงสร้าง S2D_Text
และเริ่มต้นโดยใช้ S2D_CreateText()
ที่ให้เส้นทางไฟล์ไปยังแบบอักษร ข้อความที่จะแสดง และขนาด .
S2D_Text * txt = S2D_CreateText ( "vera.ttf" , "Hello world!" , 20 );
หากไม่พบไฟล์ฟอนต์ ไฟล์นั้นจะส่งคืน NULL
จากนั้น คุณสามารถเปลี่ยนตำแหน่ง x, y
ของข้อความได้ เช่น:
txt -> x = 127 ;
txt -> y = 740 ;
หมุนข้อความดังนี้:
// Angle should be in degrees
// The last parameter is the point the text should rotate around, either:
// S2D_CENTER, S2D_TOP_LEFT, S2D_TOP_RIGHT, S2D_BOTTOM_LEFT, or S2D_BOTTOM_RIGHT
S2D_RotateText ( txt , angle , S2D_CENTER );
// Or, set a custom point to rotate around
txt -> rx = 50 ;
txt -> ry = 75 ;
// Set the rotation angle directly
txt -> rotate = 90 ;
เปลี่ยนสีข้อความดังนี้:
// Default is 1.0 for each, a white color filter
txt -> color . r = 0.5 ;
txt -> color . g = 1.0 ;
txt -> color . b = 0.0 ;
txt -> color . a = 0.7 ;
สุดท้าย วาดข้อความโดยใช้:
S2D_DrawText ( txt );
คุณยังสามารถเปลี่ยนข้อความได้ตลอดเวลา:
S2D_SetText ( txt , "A different message!" );
// Format text just like `printf`
S2D_SetText ( txt , "Welcome %s!" , player );
เนื่องจากข้อความได้รับการจัดสรรแบบไดนามิก ให้ปล่อยให้ว่างโดยใช้:
S2D_FreeText ( txt );
Simple 2D รองรับรูปแบบเสียงยอดนิยมหลายรูปแบบ รวมถึง WAV, MP3, Ogg Vorbis และ FLAC แนวคิดเกี่ยวกับเสียงมีสองประเภท: เสียงและดนตรี เสียงมีจุดมุ่งหมายให้เป็นตัวอย่างสั้นๆ เล่นโดยไม่มีการขัดจังหวะเหมือนเอฟเฟกต์ เพลงมีไว้สำหรับท่อนที่ยาวขึ้นซึ่งสามารถเล่น หยุดชั่วคราว หยุด เล่นต่อ และค่อยๆ จางหายไปได้ เช่นเดียวกับเพลงประกอบพื้นหลัง
สร้างเสียงโดยการประกาศตัวชี้ไปยังโครงสร้าง S2D_Sound
ก่อน และเริ่มต้นโดยใช้ S2D_CreateSound()
เพื่อระบุเส้นทางไปยังไฟล์เสียง
S2D_Sound * snd = S2D_CreateSound ( "sound.wav" );
หากไม่พบไฟล์เสียง ไฟล์นั้นจะส่งคืน NULL
เล่นเสียงดังนี้:
S2D_PlaySound ( snd );
คุณสามารถรับและตั้งค่าระดับเสียงได้ดังนี้:
int volume = S2D_GetSoundVolume ( snd );
S2D_SetSoundVolume ( snd , 50 ); // set volume 50%
นอกจากนี้ รับและตั้งค่าระดับเสียงของเสียงทั้งหมดเช่นนี้ โดยที่ระดับเสียงจะอยู่ในช่วงระหว่าง 0 (เบาที่สุด) ถึง 100 (ดังที่สุด):
int volume = S2D_GetSoundMixVolume ();
S2D_SetSoundMixVolume ( 50 ); // set volume 50%
เนื่องจากเสียงได้รับการจัดสรรแบบไดนามิก ให้ปลดปล่อยเสียงโดยใช้:
S2D_FreeSound ( snd );
ในทำนองเดียวกัน สร้างเพลงโดยการประกาศตัวชี้ไปยังโครงสร้าง S2D_Music
และเริ่มต้นโดยใช้ S2D_CreateMusic()
เพื่อระบุเส้นทางไปยังไฟล์เสียง
S2D_Music * mus = S2D_CreateMusic ( "music.ogg" );
หากไม่พบไฟล์เสียง ไฟล์นั้นจะส่งคืน NULL
เล่นเพลงในลักษณะนี้ โดยที่พารามิเตอร์ที่สองคือค่าบูลีนที่ระบุว่าควรเล่นเพลงซ้ำหรือไม่:
S2D_PlayMusic ( mus , true); // play on a loop
สามารถเล่นเพลงได้ครั้งละหนึ่งเพลงเท่านั้น ฟังก์ชันต่อไปนี้สำหรับการหยุดชั่วคราว เล่นต่อ รับและตั้งค่าระดับเสียง การหยุด และการค่อยๆ จางลง จะใช้ได้กับเพลงที่กำลังเล่นอยู่:
S2D_PauseMusic ();
S2D_ResumeMusic ();
S2D_StopMusic ();
int volume = S2D_GetMusicVolume ();
S2D_SetMusicVolume ( 50 ); // set volume 50%
// Fade out over 2000 milliseconds, or 2 seconds
S2D_FadeOutMusic ( 2000 );
เนื่องจากเพลงได้รับการจัดสรรแบบไดนามิก ให้ปล่อยให้เป็นอิสระโดยใช้:
S2D_FreeMusic ( mus );
Simple 2D สามารถจับภาพอินพุตได้จากทุกสิ่ง มาเรียนรู้วิธีการรับเหตุการณ์อินพุตจากเมาส์ คีย์บอร์ด และตัวควบคุมเกมกัน
เหตุการณ์แป้นพิมพ์ที่หน้าต่างบันทึกไว้มีสามประเภท: เมื่อกดปุ่มลง ปุ่มจะถูกกดค้างไว้ และปล่อยปุ่ม เมื่อมีเหตุการณ์คีย์บอร์ดเกิดขึ้น หน้าต่างจะเรียกใช้ฟังก์ชัน on_key()
หากต้องการบันทึกอินพุตคีย์บอร์ด ขั้นแรกให้กำหนดฟังก์ชัน on_key()
และอ่านรายละเอียดเหตุการณ์จากโครงสร้าง S2D_Event
ตัวอย่างเช่น:
void on_key ( S2D_Event e ) {
// Check `e.key` for the key being interacted with
switch ( e . type ) {
case S2D_KEY_DOWN :
// Key was pressed
break ;
case S2D_KEY_HELD :
// Key is being held down
break ;
case S2D_KEY_UP :
// Key was released
break ;
}
}
จากนั้นแนบการโทรกลับเข้ากับหน้าต่าง:
window -> on_key = on_key ;
ตำแหน่งเคอร์เซอร์ของเมาส์หรือแทร็กแพดสามารถอ่านได้ตลอดเวลาจากหน้าต่าง โปรดทราบว่ามุมบนซ้ายคือจุดเริ่มต้น (0, 0)
window -> mouse . x ;
window -> mouse . y ;
หากต้องการบันทึกอินพุตปุ่มเมาส์ ขั้นแรกให้กำหนดฟังก์ชัน on_mouse()
และอ่านรายละเอียดเหตุการณ์จากโครงสร้าง S2D_Event
ตัวอย่างเช่น:
// `e.button` can be one of:
// S2D_MOUSE_LEFT
// S2D_MOUSE_MIDDLE
// S2D_MOUSE_RIGHT
// S2D_MOUSE_X1
// S2D_MOUSE_X2
void on_mouse ( S2D_Event e ) {
switch ( e . type ) {
case S2D_MOUSE_DOWN :
// Mouse button was pressed
// Use `e.button` to see what button was clicked
// Check `e.dblclick` to see if was a double click
break ;
case S2D_MOUSE_UP :
// Mouse button was released
// Use `e.button` to see what button was clicked
// Check `e.dblclick` to see if was a double click
break ;
case S2D_MOUSE_SCROLL :
// Mouse was scrolled
// Check `e.direction` for direction being scrolled, normal or inverted:
// S2D_MOUSE_SCROLL_NORMAL
// S2D_MOUSE_SCROLL_INVERTED
// Check `e.delta_x` and `e.delta_y` for the difference in x and y position
break ;
case S2D_MOUSE_MOVE :
// Mouse was moved
// Check `e.delta_x` and `e.delta_y` for the difference in x and y position
break ;
}
}
จากนั้นแนบการโทรกลับเข้ากับหน้าต่าง:
window -> on_mouse = on_mouse ;
ซ่อนเคอร์เซอร์เหนือหน้าต่าง (และแสดงอีกครั้ง) โดยใช้:
S2D_HideCursor ();
S2D_ShowCursor ();
ตัวควบคุมเกมทั้งหมดจะถูกตรวจจับ เพิ่ม และลบออกโดยอัตโนมัติ มีเหตุการณ์สองประเภทที่หน้าต่างบันทึก: การเคลื่อนที่ของแกนและการกดปุ่ม เมื่อกดปุ่มหรือขยับจอยสติ๊ก หน้าต่างจะเรียกใช้ฟังก์ชัน on_controller()
ปุ่มและแกนถูกแมปกับเค้าโครงคอนโทรลเลอร์ Xbox ทั่วไป
หากต้องการจับอินพุตคอนโทรลเลอร์ ขั้นแรกให้กำหนดฟังก์ชัน on_controller()
และอ่านรายละเอียดเหตุการณ์จากโครงสร้าง S2D_Event
ตัวอย่างเช่น:
void on_controller ( S2D_Event e ) {
// Check `e.which` for the controller being interacted with
switch ( e . type ) {
case S2D_AXIS :
// Controller axis was moved
// Use `e.axis` to get the axis, either:
// S2D_AXIS_LEFTX, S2D_AXIS_LEFTY,
// S2D_AXIS_RIGHTX, S2D_AXIS_RIGHTY,
// S2D_AXIS_TRIGGERLEFT, S2D_AXIS_TRIGGERRIGHT,
// or S2D_AXIS_INVALID
// Use `e.value` to get the value of the axis
break ;
// For the following button events, use `e.button`
// to get the button pressed or released, which can be:
// S2D_BUTTON_A, S2D_BUTTON_B, S2D_BUTTON_X, S2D_BUTTON_Y,
// S2D_BUTTON_BACK, S2D_BUTTON_GUIDE, S2D_BUTTON_START,
// S2D_BUTTON_LEFTSTICK, S2D_BUTTON_RIGHTSTICK,
// S2D_BUTTON_LEFTSHOULDER, S2D_BUTTON_RIGHTSHOULDER,
// S2D_BUTTON_DPAD_UP, S2D_BUTTON_DPAD_DOWN,
// S2D_BUTTON_DPAD_LEFT, S2D_BUTTON_DPAD_RIGHT,
// or S2D_BUTTON_INVALID
case S2D_BUTTON_DOWN :
// Controller button was pressed
break ;
case S2D_BUTTON_UP :
// Controller button was released
break ;
}
}
จากนั้นแนบการโทรกลับเข้ากับหน้าต่าง:
window -> on_controller = on_controller ;
ดูการทดสอบ controller.c
เพื่อดูตัวอย่างวิธีโต้ตอบกับคอนโทรลเลอร์เกมอย่างละเอียด
คุณแน่ใจได้เลยว่าจะพบคอนโทรลเลอร์ที่ยังไม่มีการแมปปุ่ม โดยเฉพาะอย่างยิ่งหากเป็นของใหม่ ดูฐานข้อมูลที่มาจากชุมชนของการแมปคอนโทรลเลอร์สำหรับตัวอย่างวิธีสร้างสตริงการแมป เมื่อคุณมีสตริงการแมปแล้ว คุณสามารถลงทะเบียนโดยใช้ S2D_AddControllerMapping()
หรือเพิ่มการแมปหลายรายการจากไฟล์โดยใช้ S2D_AddControllerMappingsFromFile()
และระบุเส้นทางของไฟล์
"ความเรียบง่ายอาจยากกว่าความซับซ้อน คุณต้องทำงานหนักเพื่อทำให้ความคิดของคุณสะอาดและทำให้มันเรียบง่าย แต่สุดท้ายมันก็คุ้มค่า เพราะเมื่อคุณไปถึงที่นั่นแล้ว คุณสามารถเคลื่อนภูเขาได้" — สตีฟจ็อบส์
แม้จะมีความก้าวหน้าอย่างต่อเนื่องในด้านฮาร์ดแวร์และซอฟต์แวร์คอมพิวเตอร์กราฟิกส์ แต่การเริ่มต้นใช้งานการเขียนโปรแกรมกราฟิกอย่างง่ายนั้นไม่ใช่เรื่องง่ายหรือเข้าถึงได้ เรากำลังดำเนินการเพื่อเปลี่ยนแปลงสิ่งนั้น
หากคุณชอบโครงการนี้ โปรดพิจารณามีส่วนร่วม! ตรวจสอบประเด็นที่เปิดอยู่เพื่อดูแนวคิดหรือแนะนำแนวคิดของคุณเอง เรามองหาวิธีที่จะทำให้โปรเจ็กต์น่าดึงดูดยิ่งขึ้นและปรับปรุงประสบการณ์ของนักพัฒนาในทุกแพลตฟอร์มอยู่เสมอ ไม่ต้องกังวลหากคุณไม่ใช่ผู้เชี่ยวชาญด้าน C หรือกราฟิก API เรายินดีที่จะอธิบายให้คุณทราบทั้งหมด
หากคุณ เป็น แฮ็กเกอร์ C และ OS แบบฮาร์ดคอร์ คุณควรพิจารณามีส่วนร่วมกับ SDL อย่างจริงจัง เพื่อให้เราสามารถเขียนเกมต่อไปได้โดยไม่ต้องกังวลกับรายละเอียดของแพลตฟอร์มด้านล่าง ดูการพูดคุยจาก Steam Dev Days โดยเฉพาะการพูดคุยของ Ryan C. Gordon เกี่ยวกับการพัฒนาเกมด้วย SDL 2.0
simple2d.sh
deps
repo (ทำตามคำแนะนำใน README) และเรียกใช้ git submodule update --remote
ใน repo นี้เพื่ออัปเดต submodulesimple2d.sh
และ simple2d.cmd
ยอมรับการเปลี่ยนแปลงrelease
v#.#.#
; แนบตัวติดตั้ง Windows และไลบรารีของ Apple เพื่อเผยแพร่บันทึกย่อsha256
ใหม่สำหรับรีลีสและไฟล์เก็บถาวรเฟรมเวิร์ก โดยใช้ shasum -a 256 <file>
brew audit --strict ./simple2d.rb
เพื่อตรวจหาปัญหาใดๆ กับสูตรbrew install ./simple2d.rb
Simple 2D ถูกสร้างขึ้นโดย Tom Black ซึ่งคิดว่าการเขียนโปรแกรมกราฟิกอย่างง่ายนั้นยากเกินไปและตัดสินใจทำอะไรบางอย่างกับมัน
ทุกอย่างได้รับอนุญาตจาก MIT ดังนั้นให้แฮ็กออกไป
สนุก!