Simple 2D هو محرك رسومات صغير مفتوح المصدر يوفر إمكانات الرسم والوسائط والإدخال الأساسية ثنائية الأبعاد. إنه مكتوب بلغة C ويعمل عبر العديد من الأنظمة الأساسية، مما يؤدي إلى إنشاء نوافذ أصلية والتفاعل مع الأجهزة باستخدام 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 باستخدام مجموعات تطوير البرامج (SDK) لنظامي التشغيل iOS وtvOS. يمكن العثور على أمثلة لمشاريع Xcode في مستودع deps
.
قم بتنزيل مثبت Windows لـ Visual C++ أو MinGW.
بالنسبة إلى MinGW، نوصي باستخدام بيئة MSYS2 (متوفرة أيضًا على Chocolatey) مع موجه أوامر MinGW 64 بت (عادةً mingw64.exe
). يمكن أيضًا تثبيت Simple 2D على MinGW باستخدام تعليمات Linux أدناه.
قم بتشغيل البرنامج النصي simple2d.sh
Bash. سيتم شرح كل شيء على طول الطريق وستتم مطالبتك قبل اتخاذ أي إجراء. لتشغيل البرنامج النصي من الويب، الصق هذا المقتطف في جهازك الطرفي:
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. نظرًا لأن معظم توزيعات Linux تحتوي على حزم SDL مهيأة لمنصات سطح المكتب التقليدية، فسيقوم برنامج التثبيت النصي بتجميع SDL من المصدر عند اكتشاف ARM، مما يؤدي إلى تعطيل أنظمة النوافذ (مثل X11) وOpenGL (مما يفرض OpenGL ES بدلاً من ذلك).
بمجرد التثبيت، استخدم الأداة المساعدة لسطر الأوامر simple2d
لتحديث Simple 2D، والتحقق من المشكلات، وإخراج المكتبات اللازمة لتجميع التطبيقات، والمزيد. ما عليك سوى تشغيل simple2d
لرؤية جميع الأوامر والخيارات المتاحة.
وبدلاً من ذلك، يمكنك تجميع وتثبيت Simple 2D من المصدر. قم أولاً باستنساخ هذا الريبو باستخدام:
git clone --recursive https://github.com/simple2d/simple2d.git
للحفاظ على حجم هذا المستودع صغيرًا، يتم استخدام وحدات Git الفرعية للإشارة إلى وسائط الاختبار والتبعيات. تضمن العلامة --recursive
تهيئة الوحدات الفرعية وتحديثها عند استنساخ هذا الريبو. إذا قمت باستنساخ هذا الريبو بدون علامة --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، في هذا الريبو (المشار إليها بواسطة الوحدة الفرعية deps
) وتم تثبيتها بواسطة كلا الملفين.
على نظام التشغيل 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" في الملف التمهيدي هذا.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.
إنشاء تطبيقات ثنائية الأبعاد أمر بسيط! لنقم بإنشاء نافذة ورسم مثلث...
#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). الآن قم بتشغيل التطبيق باستخدام ./triangle
على نظامي التشغيل macOS وLinux، أو triangle.exe
على Windows، واستمتع بمثلثك المذهل في نافذة مقاس 640 × 480 بمعدل 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 ) "
دعونا نتعرف على تطبيقات الهيكلة للرسم ثنائي الأبعاد والمزيد.
يتم التحكم في كل المحتوى المعروض، والإدخال، والصوت من خلال النافذة، لذا فإن إنشاء نافذة هو أول شيء ستفعله. ابدأ بإعلان مؤشر إلى بنية 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
يمكن أيضًا دمج العلامات باستخدام عامل التشغيل OR، على سبيل المثال: 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 );
يمكن لـ 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 أو واجهات برمجة تطبيقات الرسومات — فسوف يسعدنا إرشادك خلال كل ذلك.
إذا كنت من عشاق C وOS، فيجب عليك التفكير بجدية في المساهمة في SDL حتى نتمكن من الاستمرار في كتابة الألعاب دون القلق بشأن تفاصيل النظام الأساسي أدناه. ألق نظرة على المحادثات من Steam Dev Days، وخاصة حديث Ryan C. Gordon حول تطوير الألعاب باستخدام SDL 2.0.
simple2d.sh
deps
repo (اتبع الإرشادات الموجودة في README)، وقم بتشغيل git submodule update --remote
في هذا الريبو لتحديث الوحدة الفرعيةsimple2d.sh
و simple2d.cmd
وقم بإجراء التغييراتrelease
make/nmakev#.#.#
; قم بإرفاق مثبتات Windows ومكتبات Apple لإصدار الملاحظاتsha256
الجديد لأرشيف الإصدار والأطر باستخدام shasum -a 256 <file>
brew audit --strict ./simple2d.rb
لاكتشاف أي مشكلات تتعلق بالصيغةbrew install ./simple2d.rb
تم إنشاء Simple 2D بواسطة توم بلاك، الذي اعتقد أن برمجة الرسومات البسيطة كانت صعبة للغاية وقرر أن يفعل شيئًا حيال ذلك.
كل شيء مرخص من معهد ماساتشوستس للتكنولوجيا (MIT)، لذا اخترقه بعيدًا.
يتمتع!