الرسم وتشكيل النص وتشغيل الصوت وخدمة HTTP باستخدام Raylib
لبات 0.7.0 · الإصدار الحالي
نوافذ 0.7.0 أصلية ونص عربي ومختلط مشكل وأعمار الخط والصوت وخدمة صريحة ونشر.
محتويات الصفحة
تجهيز المضيف الأصلي
المضيف الأصلي فقط، لبات 0.7.0 المنشور. ثبّت الأدوات الأصلية. استورد core::raylib أو أساسي::رايليب في كل وحدة مصدر تستخدم المكتبة. تقبل كل بادئة مستوردة أسماء الأعضاء العربية والإنجليزية المتطابقة. استورد الصيغتين لاستخدام البادئتين القصيرتين. تحتفظ أسماء المستخدم والنصوص والمسارات ببايتاتها.
لا يحتاج الفحص والبناء إلى شاشة أو مترجم C. يحتاج تشغيل نافذة إلى Linux بمعمارية x86_64 وglibc 2.34 أو أحدث وشاشة Wayland/EGL أو X11/GLX متاحة وOpenGL 3.3 core. يستخدم XWayland مسار X11. تضمّن الأداة خلفية Raylib 6.0 المثبتة، فلا تحتاج إلى Raylib نظامي. راجع متطلبات النظام.
عند وجود النقطتين تختار القيمة الدقيقة XDG_SESSION_TYPE=wayland مسار Wayland أولا، وتختار القيم الأخرى X11 أولا. عند وجود قيمة غير فارغة واحدة من WAYLAND_DISPLAY أو DISPLAY يحاول التنفيذ ذلك المسار وحده. يمكن أن ينتقل إلى النقطة الأخرى بعد تحرير آمن لفشل الأولى. عند غياب النقطتين يعيد InitWindow الرمز raylib.host_unavailable. لا يوجد نجاح لنافذة بلا شاشة. تبقى الخلفية الناجحة ثابتة حتى الإغلاق.
نزّل البرامج من مجموعة Raylib. تسرد كل عائلة الصيغ الموردة والملفات المرخصة قبل المصدر. احتفظ بأسماء المصادر ومسارات الأصول الأصلية. تحتاج عائلة الصور إلى PNG وإشعاره تحت docs/examples/assets نسبة إلى مجلد عمل العملية. لا تحتاج هذه العائلات إلى وحدات مصدر. يرفض المتصفح المكتبة حتى إن لم يستخدم الاستيراد.
فحص كل نتيجة
تعيد العمليات العادية result<T>، وتعيد فحوص الجاهزية والصلاحية bool مباشرة. افحص ok / نجاح قبل قراءة value / قيمة أو error / الخطأ. تؤدي قراءة الفرع الخطأ إلى مصيدة. قارن رمز ASCII الثابت error::code، ورسائل Raylib تضم اللغتين. استخدم --diagnostic-language=en لتشخيصات CLI أو --aspl-diagnostic-language=en للبرنامج الناتج.
مقطع توضيحي
استورد أساسي::رايليب.
دالة ابدأ_الرئيسية() -> ص64 {
دع فتح = رايليب::هيئ_نافذة(640, 360, "سلام ASPL").
إذا لا فتح::نجاح { اطبع(فتح::error::الرمز). أرجع 1. }
دع إغلاق = رايليب::أغلق_النافذة().
إذا لا إغلاق::نجاح { اطبع(إغلاق::error::الرسالة). أرجع 2. }
أرجع 0.
}يوضح المقطع فحص استدعاءات دورة الحياة. تحتفظ البرامج الكاملة القابلة للتنزيل أدناه بنتائج الفهرس. راجع مرجع الواجهة للأحجام الدقيقة والسياقات والإخفاقات.
امتلاك جيل نافذة
استدع SetConfigFlags قبل فتح النافذة. يستبدل أعلام النافذة التالية المحفوظة. يقبل SetTargetFPS معدلا غير سالب، والصفر يزيل سقف التوقيت. افتح بأبعاد i32 موجبة وعنوان دون NUL. تنسخ الأداة العناوين وتحتفظ بها حتى الاستبدال أو انتهاء الاستخدام الأصلي. يحتاج SetWindowTitle إلى نافذة حية وإطار مغلق.
يمتلك تنفيذ واحد حجز أجهزة العملية. تجري عمليات الجهاز على الخيط الرئيسي للعملية. IsWindowReady فحص كلي، وWindowShouldClose ملاحظة مفحوصة. لا يغلق طلب الإغلاق النافذة بذاته. يقرر التطبيق متى ينتهي أو يغلقها. ينجح CloseWindow عندما تكون مغلقة بالفعل.
يبطل الإغلاق نسخ مالك النسيج قبل تدمير سياق الرسوم. تنشئ إعادة الفتح جيلا جديدا. تبقى الأعلام والتوقيت المحفوظان، بينما يعاد ضبط الهروب وطوابير الإدخال وسجل الفأرة والتوقيت. تغير عائلة النافذة العنوان وتنتظر إدخال في الطرفية ثم تغلق وتعيد الفتح.
إقران إطارات الرسم
استدع BeginDrawing ثم ClearBackground وعمليات الرسم ثم EndDrawing. تحتاج عمليات الرسم والمسح إلى إطار مفتوح. تعيد البداية المكررة أو النهاية غير المقترنة raylib.invalid_order وتحفظ الحالة الحالية. أغلق وضع الكاميرا قبل إنهاء الإطار.
يحتاج التحميل ودورة حياة النافذة وتغييرات العنوان ومفتاح الخروج وFPS ومرشح النسيج والتفافه إلى إطار مغلق. تستطيع ملاحظات الإدخال والتوقيت قراءة العينة الحالية داخل الإطار. يعرض EndDrawing العمل المقبول ويستطلع أحداث المضيف ويطبق التوقيت المستهدف. يعيد GetTime النوع f64 وGetFrameTime النوع f32 وGetFPS النوع i32. تعرض النافذة الجديدة زمن إطار وFPS صفريين قبل أول إطار مكتمل.
تعرض عائلة الإطارات تكرارين قصيرين وتفحص إعادة ضبط التوقيت بعد الفتح. FPS هدف ولا يضمن أداء المضيف المشغول.
قراءة عينات لوحة المفاتيح والفأرة والحجم
تحتاج ملاحظات النافذة والإدخال إلى نافذة حية للتنفيذ المستدعي والخيط الرئيسي. تقرأ حالة مأخوذة ولا تثبت استدعاءات راجعة للمصدر. استخدم ثوابت Key وMouseButton الدقيقة، ولا يجوز بناؤها من أعداد صحيحة. تصف Down وUp حالة الاستمرار، وتصف Pressed وReleased الانتقالات، ويشمل IsKeyPressedRepeat ملاحظات التكرار.
يستهلك GetKeyPressed مفتاحا واحدا من الطابور ويعيد KEY_NULL عند فراغه. يستهلك GetCharPressed قيمة محرف Unicode واحدة ويعيد صفرا عند الفراغ. كرر الاستدعاء لتفريغ الطوابير عند الحاجة. حدث المفتاح والنص المكتوب ملاحظتان منفصلتان. يعطل SetExitKey(KEY_NULL) مفتاح الخروج، ويعيد فتح نافذة جديدة مفتاح الهروب.
تستخدم مواضع الفأرة وفروقها والعجلة قيما f32 مفحوصة. قد يختلف GetScreenWidth وGetScreenHeight المنطقيان عن GetRenderWidth وGetRenderHeight الفيزيائيين. يعرض IsWindowResized عينة تغيير الحجم الحالية.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- لبات 0.7.0 أصلي على Linux بمعمارية x86_64 وglibc 2.34 أو أحدث.
- يحتاج التشغيل إلى شاشة Wayland/EGL أو X11/GLX متاحة وOpenGL 3.3 core. لا يحتاج إلى Raylib نظامي أو مترجم C. لا يحتاج الفحص والبناء إلى شاشة.
الإدخال: لا يحتاج إلى أسطر إدخال.
// شغل باستخدام: aspl run docs/examples/raylib/نافذة-وإدخال.لبات
// اكتب نصا أو انقر أو مرر لتغيير اللون. غير الحجم لطباعة الأبعاد الجديدة.
// يطلب مفتاح الهروب الإغلاق. يتوقف المثال أيضا بعد 180 إطارا.
استورد أساسي::رايليب.
دالة ابدأ_الرئيسية() -> ص64 {
دع أعلام = رايليب::اضبط_أعلام_الإعداد(رايليب::علم_نافذة_قابلة_للتحجيم).
دع معدل_الإطارات = رايليب::اضبط_معدل_الإطارات(60).
إذا لا أعلام::نجاح أو لا معدل_الإطارات::نجاح { أرجع 1. }
دع مفتوح = رايليب::هيئ_نافذة(640, 360, "ASPL input / إدخال رايليب").
إذا لا مفتوح::نجاح { اطبع(مفتوح::الخطأ::الرسالة). أرجع 2. }
دع مفتاح_خروج = رايليب::اضبط_مفتاح_الخروج(رايليب::مفتاح_هروب).
إذا لا مفتاح_خروج::نجاح { اطبع(مفتاح_خروج::الخطأ::الرسالة). أرجع 3. }
متغير إطار: ص64 = 0.
متغير لون = رايليب::أزرق_سماوي.
طالما إطار < 180 {
دع إغلاق_جار = رايليب::هل_يجب_إغلاق_النافذة().
إذا لا إغلاق_جار::نجاح { اطبع(إغلاق_جار::الخطأ::الرسالة). أرجع 4. }
إذا إغلاق_جار::قيمة { أرجع 0. }
دع منقور = رايليب::هل_ضغط_زر_الفأرة(رايليب::زر_فأرة_أيسر).
دع مضغوط = رايليب::هل_ضغط_المفتاح(رايليب::مفتاح_مسافة).
دع عجلة = رايليب::حركة_عجلة_الفأرة().
إذا لا منقور::نجاح أو لا مضغوط::نجاح أو لا عجلة::نجاح { أرجع 5. }
إذا منقور::قيمة أو مضغوط::قيمة أو عجلة::قيمة لا يطابق 0.0 { لون = رايليب::عنابي. }
دع مدخل = رايليب::المحرف_المدخل().
دع مفتاح = رايليب::المفتاح_المضغوط().
إذا لا مدخل::نجاح أو لا مفتاح::نجاح { أرجع 6. }
إذا مدخل::قيمة لا يطابق 0 {
لون = رايليب::أخضر_داكن.
اطبع("Unicode / محرف: "). اطبع(نسق_ص64(ص64(مدخل::قيمة))). اطبع("\س").
}
دع محجم = رايليب::هل_تغير_حجم_النافذة().
إذا لا محجم::نجاح { أرجع 7. }
إذا محجم::قيمة أو إطار يطابق 0 {
دع عرض = رايليب::عرض_الشاشة(). دع ارتفاع = رايليب::ارتفاع_الشاشة().
دع عرض_الرسم = رايليب::عرض_التصيير(). دع ارتفاع_الرسم = رايليب::ارتفاع_التصيير().
إذا لا عرض::نجاح أو لا ارتفاع::نجاح أو لا عرض_الرسم::نجاح أو لا ارتفاع_الرسم::نجاح { أرجع 8. }
اطبع("Screen / شاشة: "). اطبع(نسق_ص64(ص64(عرض::قيمة))). اطبع("x"). اطبع(نسق_ص64(ص64(ارتفاع::قيمة))).
اطبع(" render="). اطبع(نسق_ص64(ص64(عرض_الرسم::قيمة))). اطبع("x"). اطبع(نسق_ص64(ص64(ارتفاع_الرسم::قيمة))). اطبع("\س").
}
دع مبدوء = رايليب::ابدأ_الرسم().
إذا لا مبدوء::نجاح { اطبع(مبدوء::الخطأ::الرسالة). أرجع 9. }
// تعمل الملاحظات المأخوذة أيضا أثناء إطار رسم مفتوح.
دع موضع = رايليب::موضع_الفأرة(). دع فرق = رايليب::تغير_موضع_الفأرة().
إذا لا موضع::نجاح أو لا فرق::نجاح { أرجع 10. }
دع ممسوح = رايليب::امسح_الخلفية(لون).
إذا لا ممسوح::نجاح { اطبع(ممسوح::الخطأ::الرسالة). أرجع 11. }
دع منته = رايليب::أنه_الرسم().
إذا لا منته::نجاح { اطبع(منته::الخطأ::الرسالة). أرجع 12. }
إطار = إطار + 1.
}
دع مغلق = رايليب::أغلق_النافذة().
إذا لا مغلق::نجاح { اطبع(مغلق::الخطأ::الرسالة). أرجع 13. }
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل نافذة-وإدخال.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"behavior": {
"en": "Left click or scroll selects maroon. Space also selects maroon, but a queued character, including a typed space, takes precedence and selects dark green. Each consumed character prints its Unicode scalar number. The first frame and resizes print logical screen and physical render dimensions. Escape or 180 frames ends the loop with status 0. Output depends on the host and input.",
"ar": "يختار النقر الأيسر أو التمرير اللون العنابي. يختاره مفتاح المسافة أيضا، لكن يتقدم المحرف المنتظر في الطابور، بما فيه المسافة المكتوبة، ويختار الأخضر الداكن. يطبع كل محرف مستهلك رقم قيمة Unicode له. يطبع الإطار الأول وتغيير الحجم أبعاد الشاشة المنطقية والتصيير الفيزيائية. ينتهي التكرار بمفتاح الهروب أو بعد 180 إطارا بحالة 0. يعتمد الإخراج على المضيف والإدخال."
}
}
}مشاركة الأنسجة وإغلاقها
يقبل LoadTexture ملفات PNG ويحتاج إلى نافذة حية خارج الإطار. تحل المسارات نسبة إلى مجلد عمل العملية. افحص النتيجة قبل أخذ Texture المعتم. يعيد GetTextureWidth وGetTextureHeight بيانات مفحوصة. اختر المرشح POINT أو BILINEAR والالتفاف REPEAT أو CLAMP خارج الإطارات.
تشارك نسخ النسيج مالكا مدارا واحدا قابلا للإغلاق. يغلق UnloadTexture عبر أي نسخة كل النسخ، وينجح تكراره. يعيد IsTextureValid بعدها خطأ. تعيد بقية عمليات الوصول raylib.closed_resource حتى إن اختفت النافذة السابقة أيضا. يحتفظ الرسم المقبول بالذاكرة الخلفية حتى انتهاء استخدامها الأصلي، فلا يبطل التحرير المنطقي في الإطار الأخير العمل المقبول قبله. لا تعيد إعادة فتح النافذة إحياء الأنسجة القديمة.
ارسم باستخدام DrawTexture أو DrawTextureV أو DrawTextureEx أو DrawTextureRec أو DrawTexturePro. تحافظ أبعاد مستطيل المصدر الموقعة على الانعكاس. يحتفظ المقياس الصفري أو السالب ومستطيلات الوجهة الموقعة بسلوك Raylib المقبول، مع فحص الحسابات الناتجة قبل الدخول الأصلي.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- لبات 0.7.0 أصلي على Linux بمعمارية x86_64 وglibc 2.34 أو أحدث.
- يحتاج التشغيل إلى شاشة Wayland/EGL أو X11/GLX متاحة وOpenGL 3.3 core. لا يحتاج إلى Raylib نظامي أو مترجم C. لا يحتاج الفحص والبناء إلى شاشة.
الإدخال: لا يحتاج إلى أسطر إدخال.
نزّل الملفات المطلوبة وجهزها قبل التشغيل:
استورد أساسي::رايليب.
دالة ابدأ_الرئيسية() -> ص64 {
دع مفتوح = رايليب::هيئ_نافذة(480, 300, "PNG sprites / صور متحركة").
إذا لا مفتوح::نجاح { اطبع(مفتوح::الخطأ::الرسالة). أرجع 1. }
دع محمل = رايليب::حمل_نسيجا("docs/examples/assets/raylib-sprites.png").
إذا لا محمل::نجاح { اطبع(محمل::الخطأ::الرسالة). أرجع 2. }
دع نسيج = محمل::قيمة.
دع مرادف = نسيج.
إذا رايليب::عرض_النسيج(نسيج)::قيمة لا يطابق 32 أو رايليب::ارتفاع_النسيج(نسيج)::قيمة لا يطابق 16 { أرجع 3. }
دع مرشح = رايليب::اضبط_مرشح_النسيج(نسيج, رايليب::مرشح_نسيج_نقطي).
دع التفاف = رايليب::اضبط_التفاف_النسيج(نسيج, رايليب::التفاف_نسيج_تثبيت).
دع معدل_الإطارات = رايليب::اضبط_معدل_الإطارات(60).
إذا لا مرشح::نجاح أو لا التفاف::نجاح أو لا معدل_الإطارات::نجاح { أرجع 4. }
دع كاميرا = رايليب::كاميرا2 {
إزاحة: رايليب::متجه2 { س: 15.0, ص: 10.0 }, هدف: رايليب::متجه2 { س: 0.0, ص: 0.0 },
دوران: 0.0, تكبير: 1.0
}.
دع أول = رايليب::مستطيل { س: 24.0, ص: 24.0, عرض: 32.0, ارتفاع: 16.0 }.
دع ثان = رايليب::مستطيل { س: 30.0, ص: 28.0, عرض: 32.0, ارتفاع: 16.0 }.
دع تصادم = رايليب::هل_يتداخل_مستطيلان(أول, ثان).
دع تداخل = رايليب::مستطيل_التداخل(أول, ثان).
إذا لا تصادم::نجاح أو لا تداخل::نجاح { أرجع 16. }
إذا لا تصادم::قيمة { أرجع 17. }
متغير إطار: ص32 = 0.
طالما إطار < 20 {
إذا لا رايليب::ابدأ_الرسم()::نجاح أو لا رايليب::امسح_الخلفية(رايليب::أبيض_رايليب)::نجاح { أرجع 5. }
إذا لا رايليب::ابدأ_وضع_ثنائي_الأبعاد(كاميرا)::نجاح { أرجع 6. }
إذا لا رايليب::ارسم_نسيجا(نسيج, 24, 24, رايليب::أبيض)::نجاح { أرجع 7. }
إذا لا رايليب::ارسم_نسيجا_بمتجه(نسيج, رايليب::متجه2 { س: 100.0, ص: 24.0 }, رايليب::أزرق_سماوي)::نجاح { أرجع 8. }
إذا لا رايليب::ارسم_نسيجا_موسعا(نسيج, رايليب::متجه2 { س: 40.0, ص: 110.0 }, -10.0, 4.0, رايليب::أبيض)::نجاح { أرجع 9. }
إذا لا رايليب::ارسم_جزء_نسيج(نسيج, رايليب::مستطيل { س: 16.0, ص: 0.0, عرض: -16.0, ارتفاع: 16.0 },
رايليب::متجه2 { س: 250.0, ص: 24.0 }, رايليب::أبيض)::نجاح { أرجع 10. }
إذا لا رايليب::ارسم_نسيجا_متقدما(نسيج, رايليب::مستطيل { س: 16.0, ص: 0.0, عرض: 16.0, ارتفاع: -16.0 },
رايليب::مستطيل { س: 330.0, ص: 160.0, عرض: -96.0, ارتفاع: 96.0 },
رايليب::متجه2 { س: 48.0, ص: 48.0 }, 25.0, رايليب::لون { أحمر: 255, أخضر: 255, أزرق: 255, ألفا: 210 })::نجاح { أرجع 11. }
إذا لا رايليب::ارسم_محيط_مستطيل_موسعا(تداخل::قيمة, 1.0, رايليب::أحمر)::نجاح { أرجع 18. }
إذا لا رايليب::أنه_وضع_ثنائي_الأبعاد()::نجاح { أرجع 12. }
إذا إطار يطابق 19 {
إذا لا رايليب::حرر_النسيج(مرادف)::نجاح أو رايليب::هل_النسيج_صالح(نسيج) { أرجع 13. }
}
إذا لا رايليب::أنه_الرسم()::نجاح { أرجع 14. }
إطار = إطار + 1.
}
إذا لا رايليب::حرر_النسيج(نسيج)::نجاح أو لا رايليب::أغلق_النافذة()::نجاح { أرجع 15. }
اطبع("texture sprites complete").
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل صور-وكاميرا.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": "texture sprites complete",
"behavior": {
"en": "20 frames show tinted, rotated and flipped atlas sprites with a red rectangle intersection. The final frame unloads an alias before presentation and checks that the original is invalid. Success prints texture sprites complete without a trailing newline and returns 0.",
"ar": "تعرض 20 إطارا صور الأطلس الملونة والمدورة والمنعكسة مع تقاطع مستطيل أحمر. يحرر الإطار الأخير نسخة المالك قبل العرض ويتحقق من بطلان الأصل. يطبع النجاح texture sprites complete دون سطر جديد ويعيد 0."
}
}
}تحويل إحداثيات كاميرا2
أنشئ كل حقول Camera2D، الإزاحة والهدف والدوران والتكبير الموجب. تقاس الزوايا بالدرجات. يحتاج BeginMode2D(camera) إلى إطار رسم مفتوح دون وضع كاميرا نشط. أقرنه بـEndMode2D قبل EndDrawing. تعيد الأوضاع المتداخلة أو غير المقترنة raylib.invalid_order دون تغيير الزوج الحالي.
ارسم داخل الوضع بإحداثيات العالم، ثم ارسم حدود الشاشة أو عناصرها بعد مغادرته. GetWorldToScreen2D وGetScreenToWorld2D مساعدان نقيان مفحوصان لا يحتاجان إلى نافذة أو إطار. حول إحداثيات الفأرة المأخوذة بالكاميرا نفسها عند اختبار عناصر العالم. تفشل المدخلات غير المنتهية والتكبير الصفري والتحويلات الناتجة غير القابلة للتمثيل قبل الدخول الأصلي.
ترسم عائلة أشكال الكاميرا مستطيلا ودائرة وخطا سميكا ومثلثا عبر الكاميرا، ثم نقطة وحدودا بإحداثيات الشاشة.
اختبار التصادم في فضاء إحداثيات واحد
مساعدات التصادم عمليات نقية مفحوصة. لا تحتاج إلى شاشة أو إطار أو مالك مورد ويسمح بها في معالجات HTTP والاستدعاءات الراجعة المدارة. الرسم وعمليات الجهاز للتطبيق فقط، ولا يستطيع مساعد أو قيمة دالة مخزنة تجاوز قيود آثارها.
استخدم CheckCollisionRecs وGetCollisionRec للمستطيلات أو اختبارات الدائرة والمستطيل والنقطة والمثلث في المرجع. قدم المعاملين في فضاء الإحداثيات نفسه. يجب أن يكون نصف القطر غير سالب. تتبع الأشكال الموقعة أو المنحلة المقبولة سلوك الخلفية المثبتة. قد تعيد الحسابات الناتجة المفحوصة raylib.numeric_overflow حتى عندما تكون كل المدخلات منتهية.
تتحقق عائلة الصور من تداخل المستطيلين عند 24,24 و30,28، ثم ترسم التقاطع المعاد بالأحمر داخل وضع الكاميرا. يفحص ذلك هندسة التصادم وموضع الرسم.
اختيار الخطوط المضمنة أو المخصصة
يعيد GetFontDefault الخط العربي واللاتيني المضمن بحجم أساسي 32. لا يحتاج النص على المعالج إلى شاشة أو جهاز صوت. تستخدم حزمة HarfBuzz وICU وFreeType المثبتة Unicode 17 وخطي Noto Sans Arabic Regular 2.013 وNoto Sans Regular 2.015 المضمنين. لا تستبدل خطوط المضيف أو لغته أو ICU_DATA هذه القاعدة. يتضمن ملف الإشعارات المرافق تراخيص الخطوط ونسبة FreeType وإخلاء مسؤوليتها.
للخط المخصص، قدم ملف حدود TrueType مرخصا ذا وجه واحد نسبة إلى مجلد العمل. يستخدم LoadFont الحجم الأساسي 32. يقبل LoadFontEx حجما أساسيا 1..4096 وتلميحات تجهيز منسوخة من نوع list<i32> لقيم المحارف. تعني القائمة الفارغة عدم التجهيز المسبق ولا تحد التغطية. لا تدعم مجموعات الخطوط أو CFF/PostScript أو WOFF/WOFF2 أو خطوط الصور النقطية والألوان. تعيد الجداول المطلوبة المعطوبة raylib.invalid_font، والملفات غير المدعومة raylib.unsupported_font، وفشل قراءة الملف raylib.load_failed.
يجرب الاختيار الخط المخصص ثم الخط المضمن الاحتياطي المفضل للنظام الكتابي. يحافظ على عناقيد المحارف وتسلسلات الوصل العربية معا. يتطلب اختيار خط عربي مخصص ميزات الوصل والعلامات المقبولة. لا يقبل مربعات بديلة نهائية، ويعيد النص غير المغطى raylib.missing_glyph.
تشارك نسخ الخط الإغلاق. يملك الخط المخصص نسخة من بايتات الملف، فلا يغير استبدال الملف بعد التحميل النص الموجود. يغلق UnloadFont نسخ الخط المخصص، وتحتفظ التخطيطات الموجودة ببيانات الخط المستقلة. ينجح تحرير الخط الافتراضي دون إبطاله. يقرأ GetFontBaseSize البيانات ولا يضبط حجم التصيير. يتطلب تحميل الخط سياق التطبيق والخيط الرئيسي خارج الإطارات، ولا يحتاج إلى نافذة حية. يسمح بالوصول الافتراضي والقياس وإنشاء التخطيط والتحرير على المعالج في معالجات HTTP والاستدعاءات الراجعة المدارة.
حفظ ترتيب النص المنطقي وقياس تخطيطه
قدم النص بترتيبه المنطقي. لا يعيد الوصل العربي والربط والعلامات وترتيب الاتجاهين العربي واللاتيني كتابة النص أو تسوية المعرفات أو تغيير بايتات المسار. يستخدم MeasureText وDrawText الاتجاه Auto والمحاذاة Start دون التفاف أو تباعد إضافي للأسطر. يشترط MeasureTextEx وDrawTextEx وDrawTextPro تباعد محارف صفريا.
يأخذ CreateTextLayout حقول TextOptions الستة كلها. font_size منته في 0.5..4096. direction هو Auto أو LTR أو RTL. يستخدم Auto أول محرف قوي، ويختار LTR للفقرات المحايدة فقط. يفعل has_width قيمة width منتهية موجبة، وإلا يكون العرض غير نشط. alignment هو Start أو End أو Center أو Left أو Right. يتبع Start وEnd اتجاه الفقرة الأساسي، أما Left وRight فجانبان فيزيائيان. line_spacing منته وغير سالب.
يستخدم الالتفاف فواصل أسطر ICU الجذرية ثم فواصل طارئة بين عناقيد المحارف. قد يتجاوز عنقود كبير العرض المقدم. تفصل LF وCR وCRLF وU+2029 الفقرات، وتكسر U+2028 السطر. تتبع الأسطر الفارغة والنهائية وتحكم الاتجاهين وZWJ/ZWNJ والواصلات اللينة قواعد التخطيط. للنص الفارغ صفر من الأسطر والارتفاع. تعيد NUL وعلامة الجدولة وDEL ومحارف Cc الأخرى غير المدعومة raylib.invalid_text.
يعيد MeasureTextLayout النوع TextMetrics. size صندوق منطقي يستخدم العرض المقدم عندما يكون نشطا. ink حدود المحارف المحلية بما فيها العلامات والتجاوزات. يقرب الحجم الفعلي إلى 1/64 مع كسر التعادل نحو العدد الزوجي. يقبل MeasureText أحجاما صحيحة 1..4096 ويقرب عرض النص المشكل لأعلى إلى i32 مفحوص. يعيد MeasureTextEx الحجم المنطقي من نوع Vector2. تعمل هذه العمليات على المعالج قبل إنشاء نافذة.
التخطيطات ملاك مشتركون ثابتون. يغلق تحرير نسخة كل النسخ وينجح تكراره. يحتفظ التخطيط بخطوطه بعد تحرير Font المخصص ويبقى بعد إغلاق النافذة وإعادة فتحها. يعيد الوصول إلى تخطيط مغلق raylib.closed_resource، ويعيد فحص الصلاحية خطأ.
رسم المواضع المقاسة
يرسم DrawTextLayout عند الركن العلوي الأيسر المنطقي. يضيف DrawTextLayoutPro الأصل والدوران. يشكل DrawTextEx وDrawTextPro النص المنطقي نفسه بتباعد محارف صفري. يحول الأصل والدوران وCamera2D الموضع دون تغيير المقاييس المحلية. يحافظ إخلاء مخبأ المحارف على هذه المقاييس.
يتطلب رسم النص خيط التطبيق الرئيسي ونافذة حية وإطار رسم مفتوحا. لا يرسل فشل التحقق أو المحرف أو الحساب أو التجهيز المعروف أي جزء من طلب النص. يبقى الرسم المقبول سابقا صالحا. قد يحتفظ العمل المقبول ببيانات المحارف بعد التحرير المنطقي حتى العرض أو انتهاء الاستخدام الأصلي.
تجهز عائلة النص المشكل والصوت تخطيطها وتقيسه قبل فتح النافذة. توضح الحدود الرمادية الصندوق المنطقي والحمراء الحبر. يلزم ملف النغمة OGG الأصلي وإشعار CC0 خارجيا، والخطوط الافتراضية مضمنة.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- لبات 0.7.0 أصلي على Linux بمعمارية x86_64 وglibc 2.34 أو أحدث.
- يحتاج التشغيل إلى شاشة Wayland/EGL أو X11/GLX متاحة وOpenGL 3.3 core. لا يحتاج الفحص والبناء إلى أجهزة أو مترجم C أو Raylib نظامي.
- خدمة تشغيل PulseAudio أو PipeWire متوافقة أو جهاز ALSA مباشر متاح. لا تحتاج الخطوط الافتراضية المرخصة المضمنة إلى تنزيل خط.
- احفظ OGG المورد وإشعار CC0 في شجرة الأصول الموضحة في الصفحة نسبة إلى مجلد عمل العملية.
الإدخال: لا يحتاج إلى أسطر إدخال.
نزّل الملفات المطلوبة وجهزها قبل التشغيل:
استورد أساسي::رايليب.
دالة ابدأ_الرئيسية() -> ص64 {
// لا يحتاج التخطيط والقياس شاشة. يبقى النص في ترتيبه المنطقي.
دع خط_محمل = رايليب::الخط_الافتراضي().
إذا لا خط_محمل::نجاح { اطبع(خط_محمل::الخطأ::الرسالة). أرجع 1. }
دع خيارات = رايليب::خيارات_النص {
حجم_الخط: 32.0, اتجاه: رايليب::اتجاه_نص_تلقائي,
له_عرض: صواب, عرض: 430.0, محاذاة: رايليب::محاذاة_نص_بداية,
تباعد_الأسطر: 4.0
}.
دع مجهز = رايليب::أنشئ_تخطيط_نص(خط_محمل::قيمة, "سلام ASPL 123\سبَِّ Hello", خيارات).
إذا لا مجهز::نجاح { اطبع(مجهز::الخطأ::الرسالة). أرجع 2. }
دع تخطيط = مجهز::قيمة.
دع مقاس = رايليب::قس_تخطيط_النص(تخطيط).
إذا لا مقاس::نجاح { اطبع(مقاس::الخطأ::الرسالة). أرجع 3. }
دع صوت = رايليب::هيئ_جهاز_الصوت().
إذا لا صوت::نجاح { اطبع(صوت::الخطأ::الرسالة). أرجع 4. }
دع موسيقى_محملة = رايليب::حمل_تدفق_موسيقى("docs/examples/assets/raylib-tone.ogg").
إذا لا موسيقى_محملة::نجاح { اطبع(موسيقى_محملة::الخطأ::الرسالة). أرجع 5. }
دع موسيقى = موسيقى_محملة::قيمة.
إذا لا رايليب::اضبط_تكرار_الموسيقى(موسيقى, صواب)::نجاح أو لا رايليب::شغل_تدفق_الموسيقى(موسيقى)::نجاح { أرجع 6. }
دع مفتوح = رايليب::هيئ_نافذة(500, 300, "Shaped text / نص مشكل").
إذا لا مفتوح::نجاح { اطبع(مفتوح::الخطأ::الرسالة). أرجع 7. }
إذا لا رايليب::اضبط_معدل_الإطارات(60)::نجاح { أرجع 8. }
متغير إطار: ص32 = 0.
طالما إطار < 60 {
دع إغلاق_جار = رايليب::هل_يجب_إغلاق_النافذة().
إذا لا إغلاق_جار::نجاح { أرجع 9. }
إذا إغلاق_جار::قيمة { أرجع 0. }
// يتقدم التدفق فقط عندما يستدعي التطبيق حدث_تدفق_الموسيقى.
إذا لا رايليب::حدث_تدفق_الموسيقى(موسيقى)::نجاح { أرجع 10. }
إذا لا رايليب::ابدأ_الرسم()::نجاح أو لا رايليب::امسح_الخلفية(رايليب::أبيض_رايليب)::نجاح { أرجع 11. }
دع حجم = مقاس::قيمة::حجم.
دع حبر = مقاس::قيمة::حبر.
دع صندوق = رايليب::مستطيل { س: 30.0, ص: 30.0, عرض: حجم::س, ارتفاع: حجم::ص }.
إذا لا رايليب::ارسم_محيط_مستطيل_موسعا(صندوق, 1.0, رايليب::رمادي)::نجاح { أرجع 12. }
دع صندوق_حبر = رايليب::مستطيل { س: 30.0 + حبر::س, ص: 30.0 + حبر::ص, عرض: حبر::عرض, ارتفاع: حبر::ارتفاع }.
إذا لا رايليب::ارسم_محيط_مستطيل_موسعا(صندوق_حبر, 1.0, رايليب::أحمر)::نجاح { أرجع 13. }
إذا لا رايليب::ارسم_تخطيط_النص(تخطيط, رايليب::متجه2 { س: 30.0, ص: 30.0 }, رايليب::أسود)::نجاح { أرجع 14. }
إذا لا رايليب::أنه_الرسم()::نجاح { أرجع 15. }
إطار = إطار + 1.
}
إذا لا رايليب::حرر_تدفق_الموسيقى(موسيقى)::نجاح أو لا رايليب::أغلق_جهاز_الصوت()::نجاح { أرجع 16. }
إذا لا رايليب::أغلق_النافذة()::نجاح أو لا رايليب::حرر_تخطيط_النص(تخطيط)::نجاح { أرجع 17. }
اطبع("shaped text and explicit music updates complete\س").
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل نص-مشكل-وصوت.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"behavior": {
"en": "Up to 60 frames draw logical Arabic/Latin text and marks, with gray logical-box and red ink outlines. Looping OGG advances through explicit updates. Normal completion prints shaped text and explicit music updates complete followed by a newline and returns 0. Closing early also returns 0 without that final line.",
"ar": "ترسم حتى 60 إطارا نصا عربيا ولاتينيا منطقيا وعلامات، بحدود رمادية للصندوق المنطقي وحمراء للحبر. يتقدم OGG المتكرر بتحديثات صريحة. يطبع الاكتمال الطبيعي shaped text and explicit music updates complete ثم سطرا جديدا ويعيد 0. يعيد الإغلاق المبكر أيضا 0 دون السطر النهائي."
}
}
}تهيئة الصوت وتحديث الموسيقى
يجرب InitAudioDevice خدمة PulseAudio عبر libpulse.so.0 ثم ALSA مباشرة عبر libasound.so.2، بما فيه فشل بدء التشغيل. يعمل PipeWire عبر خدمته المتوافقة مع PulseAudio. يتطلب كل انتقال تحريرا كاملا آمنا. يبقى المسار الناجح ثابتا حتى الإغلاق، ولا يوجد نجاح بجهاز وهمي. يشترك الصوت والنافذة في حجز جهاز العملية للتنفيذ مع نطاقي إغلاق وتراجع منفصلين.
حمل Sound أو Music بعد تهيئة الصوت وخارج إطارات الرسم. يفك LoadSound بايتات WAV/OGG/MP3 منسوخة. يحتفظ LoadMusicStream ببايتات منسوخة ومفكك ومخازن بث محدودة مستقلة عن الملف الأصلي. التشغيل والإيقاف المؤقت والاستئناف والإيقاف ومستوى الصوت والتوازن والحدة والبحث والتكرار وUpdateMusicStream عمليات للتطبيق وخيطه الرئيسي مسموحة داخل إطار. مستوى الصوت منته في 0..1 والتوازن في -1..1 والحدة منتهية موجبة. يجب أن يلائم معدل إعادة التعيين الناتج النطاق الأصلي المقبول. يحفظ الرفض الحدة السابقة، ويعيد فشل المحول قيمتها أو يغلق ذلك المالك.
لا يفك تشغيل الموسيقى وحده العينات ولا يملأ مخازنها. استدع UpdateMusicStream صراحة، عادة مرة في كل إطار. يعرض GetMusicTimeLength وGetMusicTimePlayed ثواني f32 مفحوصة. يقبل SeekMusicStream المجال 0..الطول المبلغ عنه شاملا الطرفين. الطرف الأخير نهاية منطقية للملف. يعيد التحديث التالي تشغيل الموسيقى الجارية المتكررة أو يوقف الموسيقى غير المتكررة والفارغة. يبقى تحديث الموسيقى الموقوفة أو المتوقفة مؤقتا غير نشط. يغلق رفض البحث من المفكك نسخ Music ويعيد raylib.load_failed.
تشارك نسخ Sound وMusic مالكا قابلا للإغلاق في جيل الصوت الحالي. يوقف التحرير التشغيل ويلغي تتبعه، ويبطل إغلاق الجهاز كل التوابع قبل التدمير الأصلي. لا يحيي الفتح الجديد النسخ القديمة. تبقى البيانات والتكاليف حتى انتهاء استخدام المازج والمفكك بغض النظر عن اكتمال التشغيل. IsAudioDeviceReady وIsSoundValid وIsMusicValid فحوص كلية. يقرأ GetMusicLooping بيانات المالك المحفوظة. يسمح بهذه العمليات في المعالجات والاستدعاءات الراجعة. تبقى ملاحظات التشغيل وSetMusicLooping مشروطة بسياق التطبيق. لا يستدعي المازج دالة مصدر لبات.
إعطاء HTTP والرسم أدوارا صريحة
استورد core::http مع Raylib. يملك دليل HTTP وواجهته تصريحات الخدمة الكاملة. يعيد start النوع Session<C,S> بعد جاهزية المستمعين ولا يشغل معالجا. استدع progress خارج إطارات الرسم. ميزانيته الافتراضية 4096 تعليمة و2 ms نشطة وصفر ms انتظار. الأدوار محدودة ومتسلسلة، وقد يتجاوز عمل النظام أو المكتبة الأصلية active_ms. يستطيع المعالج المشغول التنازل عند ميزانية التعليمات مع استمرار التطبيق في الرسم.
قد يحافظ EndDrawing والإدخال المنتظر على النقل والمواعيد خارج الرسم دون تشغيل معالج مصدر. لا يحرك الإدخال داخل الإطار HTTP أو المعالجات. قد تنتهي مهلة طلب عميل HTTP حاجب في التطبيق نحو خادمه الصريح نفسه. رتب تقدما صريحا بالتواتر الذي يحتاجه التطبيق.
تستطيع مساعدات حالة الجلسة وإعداداتها في التطبيق العمل داخل إطار. تبقى مساعدات Context خاصة بالمعالج الحي. تنسخ القراءة الحالة، وتحفظ اللقطات هوية الجلسة والإصدار داخليا وتبقى قيمتها للقراءة فقط بعد الإغلاق. يستبدل النشر المشروط الحالة كلها ويزيد الإصدار. تعيد لقطة قديمة من الجلسة نفسها نجاحا بقيمة خطأ، وتعيد لقطة جلسة أخرى http.invalid_argument. لا يمنح مالك أو لقطة أو قيمة دالة محفوظة سلطة جهاز أو Context. تمنع عمليات الجهاز في المعالجات عبر كل الاستدعاءات. يسمح بالحساب النقي والنص على المعالج والفحوص الكلية وبيانات المالك للقراءة فقط.
يبدأ stop_session التصريف. واصل التقدم حتى SESSION_CLOSED. يسحب close_session الخدمة فوريا دون تشغيل معالجات التصريف. ينجح تكرار الإيقاف والإغلاق الطبيعيين. تعيد مساعدات الحالة المغلقة http.closed_session، والإطار أو السياق الخاطئ http.invalid_order أو http.invalid_context. تبقى إخفاقات المضيف المسجلة بعد التحرير الآمن.
تقدم عائلة HTTP والإطارات المتزامنة البرامج العربية والإنجليزية والمختلطة الأصلية. جهز الطرف العلوي والعملاء المحليين الموصوفين هناك. يتحرك المربع مع تقاسم /busy و/wait و/fast الأدوار. يتيح تأخير الطرف العلوي تقادم اللقطة. راجع نشر HTTP لمتطلبات TLS والثقة.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- لبات 0.7.0 أصلي على Linux بمعمارية x86_64 وglibc 2.34 أو أحدث.
- يحتاج التشغيل إلى شاشة Wayland/EGL أو X11/GLX متاحة وOpenGL 3.3 core. لا يحتاج الفحص والبناء إلى أجهزة أو مترجم C أو Raylib نظامي.
- منفذا اتصال محلي 8000 و8001 غير مشغولين. جهز الطرف العلوي المحلي والعملاء المستقلين المتزامنين كما في الصفحة. يجعل تأخير الطرف العلوي تقادم اللقطة قابلا للتكرار. لا تلزم وحدات مصدر أو أصول ملفات.
الإدخال: لا يحتاج إلى أسطر إدخال.
// شغل خادم ويب بعيد على 127.0.0.1:8001، ثم اطلب /busy و/wait و
// /fast على المنفذ 8000. تواصل النافذة الرسم بينما تتناوب المعالجات.
استورد أساسي::رايليب.
استورد أساسي::ويب.
سجل حالة { إطارات: ص64, مشغول: منطقي, سريع: منطقي, تعارض: منطقي }
دالة طلب_صادر(سياق: ويب::سياق<نص,حالة>, محفوظ: ص64) -> ويب::استجابة_خادم {
دع لقطة = ويب::التقط_الحالة(سياق).
دع طلب = ويب::أنشئ_طلب("GET", ويب::اقرأ_إعدادات(سياق))::قيمة.
دع رد = ويب::اطلب(طلب, ويب::خيارات_طلب()).
إذا لا رد::نجاح {
أرجع ويب::استجابة_نصية(502, رد::الخطأ::الرمز, "text/plain")::قيمة.
}
إذا محفوظ لا يطابق 7 { أرجع ويب::أنشئ_استجابة(500, [])::قيمة. }
دع منشور = ويب::استبدل_الحالة_إن_كانت_حالية(سياق, لقطة, لقطة::قيمة)::قيمة.
متغير حالي = ويب::اقرأ_حالة(سياق).
حالي::تعارض = لا منشور.
ويب::استبدل_حالة(سياق, حالي).
أرجع ويب::استجابة_نصية(200, "conflict", "text/plain")::قيمة.
}
دالة معالج(الطلب: ويب::طلب_وارد, سياق: ويب::سياق<نص,حالة>) -> ويب::استجابة_خادم {
إذا الطلب::مسار يطابق "/busy" {
متغير الحالة = ويب::اقرأ_حالة(سياق).
الحالة::مشغول = صواب.
ويب::استبدل_حالة(سياق, الحالة).
طالما صواب {}
}
إذا الطلب::مسار يطابق "/wait" { أرجع طلب_صادر(سياق, 7). }
متغير حالي = ويب::اقرأ_حالة(سياق).
حالي::سريع = رايليب::هل_النافذة_جاهزة().
ويب::استبدل_حالة(سياق, حالي).
أرجع ويب::استجابة_نصية(200, "fast", "text/plain")::قيمة.
}
دالة ابدأ_الرئيسية() -> ص64 {
دع مفتوح = رايليب::هيئ_نافذة(480, 240, "ASPL HTTP and drawing").
إذا لا مفتوح::نجاح { اطبع(مفتوح::الخطأ::الرمز). أرجع 1. }
دع معدل_الإطارات = رايليب::اضبط_معدل_الإطارات(60).
إذا لا معدل_الإطارات::نجاح { أرجع 9. }
متغير خادم = ويب::إعدادات_خدمة().
خادم::مستمعون = [ويب::أنشئ_مستمع("127.0.0.1", 8000)::قيمة].
دع وجهات = ويب::أنشئ_موجه([
ويب::أنشئ_وجهة("GET", "/busy", معالج)::قيمة,
ويب::أنشئ_وجهة("GET", "/wait", معالج)::قيمة,
ويب::أنشئ_وجهة("GET", "/fast", معالج)::قيمة
])::قيمة.
دع مبدوء = ويب::ابدأ(خادم, وجهات, "http://127.0.0.1:8001/",
حالة {إطارات: 0, مشغول: خطأ, سريع: خطأ, تعارض: خطأ}).
إذا لا مبدوء::نجاح { اطبع(مبدوء::الخطأ::الرمز). أرجع 2. }
دع مالك = مبدوء::قيمة.
اطبع("ready\س").
متغير ميزانية = ويب::ميزانية_التقدم().
ميزانية::حد_التعليمات = 128.
متغير إطارات: ص32 = 0.
طالما إطارات < 180 و لا رايليب::هل_يجب_إغلاق_النافذة()::قيمة {
إذا لا ويب::تقدم(مالك, ميزانية)::نجاح { أرجع 3. }
إذا لا رايليب::ابدأ_الرسم()::نجاح { أرجع 4. }
إذا لا رايليب::امسح_الخلفية(رايليب::أبيض_رايليب)::نجاح { أرجع 10. }
متغير الحالة = ويب::التقط_حالة_الجلسة(مالك)::قيمة::قيمة.
الحالة::إطارات = الحالة::إطارات + 1.
إذا لا ويب::استبدل_حالة_الجلسة(مالك, الحالة)::نجاح { أرجع 5. }
إذا لا رايليب::ارسم_مستطيلا(إطارات, 90, 40, 40, رايليب::أزرق)::نجاح { أرجع 11. }
إذا لا رايليب::أنه_الرسم()::نجاح { أرجع 6. }
إطارات = إطارات + 1.
}
دع نهائي = ويب::حالة_الجلسة(مالك)::قيمة.
إذا لا ويب::أغلق_الجلسة(مالك)::نجاح { أرجع 7. }
إذا لا رايليب::أغلق_النافذة()::نجاح { أرجع 8. }
إذا نهائي::مشغول و نهائي::سريع و نهائي::تعارض {
اطبع("busy fast conflict\س").
}
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل ويب-متزامن.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"behavior": {
"en": "A square moves for up to 180 frames. The program prints ready followed by a newline after listener startup. Concurrent busy, wait and fast requests exercise bounded handler turns and a stale snapshot. It prints busy fast conflict followed by a newline only if all three observations occur, then returns 0. Client timing and early window closure affect that final line.",
"ar": "يتحرك مربع حتى 180 إطارا. يطبع البرنامج ready ثم سطرا جديدا بعد بدء المستمع. تفحص طلبات busy وwait وfast المتزامنة أدوار المعالج المحدودة ولقطة قديمة. يطبع busy fast conflict ثم سطرا جديدا فقط عند تحقق الملاحظات الثلاث، ثم يعيد 0. يؤثر توقيت العملاء والإغلاق المبكر في السطر النهائي."
}
}
}حفظ الأسماء المكافئة وهوية المستخدم والنصوص
تسمي الأسماء المكافئة الموردة الأنواع والعمليات نفسها. تعد الصيغتان لحقل سجل مورد واحد تكرارا. تحتفظ سجلات المستخدم وحقولها بأسمائها المكتوبة. يختار تبديل اللغة التوثيق ولا يترجم المصدر. تحتفظ النصوص بالمحارف المفككة وبايتات NUL. النص الذي يشبه مسارا ليس قراءة ملف. تفرض عمليات النص والمسار والعنوان كل منها قواعد مدخلاتها.
تعمل عائلة الهوية والنصوص دون رسوم أو صوت أو طرف علوي. تستخدم القياس المشكل المضمن والأسماء المكافئة للسجلات والتعدادات والأعلام وميزانية تقدم HTTP النقية. يحتفظ استدعاء abs غير الآمن العادي من libc.so.6 بعقد توافق C. تطبع رسالة ثنائية اللغة لجدولة غير صالحة ومسار PNG نصيا ومحتوى مفككا وNUL. لا يلزم تنزيل PNG.
تتضمن رسائل أخطاء النص scalar_index=N المنطقي من الصفر وscalar=U+XXXX. يستخدم UTF-8 الأصلي المعطوب byte_offset=N. هذه تفاصيل رسائل وليست حقول نتيجة إضافية أو واجهة تحليل رسائل. تهرب الرسالة محارف التحكم غير المدعومة، ويحتفظ الإخراج العادي بالبايتات النصية.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- لبات 0.7.0 أصلي على Linux بمعمارية x86_64 وglibc 2.34 أو أحدث.
- لا تلزم شاشة أو جهاز صوت أو طرف علوي أو أصول ملفات أو وحدات مصدر. يستخدم القياس المشكل الخطوط المرخصة المضمنة، ويستخدم استدعاء abs غير الآمن مكتبة C النظامية الأساسية.
الإدخال: لا يحتاج إلى أسطر إدخال.
استورد أساسي::رايليب.
استورد أساسي::ويب.
غير_آمن خارجي مطلق(رقم: ص32) -> ص32 = سي("libc.so.6", "abs").
// أسماء المستخدم وحقول السجل عربية. تبقى المسارات والقيم الحرفية كما كتبت.
سجل أصل { اسم_الملف: نص, محفوظ_حرفيا: نص }
دالة ابدأ_الرئيسية() -> ص64 {
إذا غير_آمن مطلق(-7) لا يطابق 7 { أرجع 11. }
دع الأصل = أصل { اسم_الملف: "docs/examples/assets/raylib-sprites.png", محفوظ_حرفيا: "مسار/é.png\صA" }.
إذا الأصل::اسم_الملف لا يطابق "docs/examples/assets/raylib-sprites.png" { أرجع 1. }
إذا الأصل::محفوظ_حرفيا لا يطابق "مسار/e\ي{0301}.png\صA" { أرجع 2. }
دع أ: رايليب::متجه2 = رايليب::متجه2 { س: 1.25, ص: 2.5 }.
دع ب: رايليب::متجه2 = رايليب::متجه2 { س: أ::س, ص: أ::ص }.
إذا ب::س لا يطابق 1.25 أو ب::ص لا يطابق 2.5 { أرجع 3. }
دع مفتاح: رايليب::مفتاح = رايليب::مفتاح_مسافة.
إذا مفتاح لا يطابق رايليب::مفتاح_مسافة { أرجع 4. }
دع أعلام = رايليب::علم_نافذة_قابلة_للتحجيم | رايليب::علم_تلميح_تزامن_رأسي.
إذا أعلام لا يطابق رايليب::علم_نافذة_قابلة_للتحجيم | رايليب::علم_تلميح_تزامن_رأسي { أرجع 5. }
دع ميزانية: ويب::ميزانية_تقدم = ويب::ميزانية_التقدم().
إذا ميزانية::حد_التعليمات لا يطابق 4096 { أرجع 6. }
دع خط = رايليب::الخط_الافتراضي().
إذا لا خط::نجاح { اطبع(خط::الخطأ::الرسالة). أرجع 7. }
دع إنجليزي = رايليب::قس_النص_موسعا(خط::قيمة, "سلام ASPL 123", 32.0, 0.0).
دع عربي = رايليب::قس_النص_موسعا(خط::قيمة, "سلام ASPL 123", 32.0, 0.0).
إذا لا إنجليزي::نجاح أو لا عربي::نجاح { أرجع 8. }
إذا إنجليزي::قيمة::س لا يطابق عربي::قيمة::س { أرجع 9. }
دع غير_صالح = رايليب::قس_النص("bad\تtext", 32).
إذا غير_صالح::نجاح أو غير_صالح::الخطأ::الرمز لا يطابق "raylib.invalid_text" { أرجع 10. }
اطبع(غير_صالح::الخطأ::الرسالة). اطبع("\س").
اطبع(الأصل::اسم_الملف). اطبع("\س").
اطبع(الأصل::محفوظ_حرفيا). اطبع("\سidentity and literals complete\س").
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل أسماء-وقيم-حرفية.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"behavior": {
"en": "Runs headlessly with status 0. It prints the bilingual invalid-tab diagnostic with the tab's zero-based scalar position and Unicode value, a literal PNG path, decomposed e plus U+0301 and an actual NUL before A, then identity and literals complete. The path is never opened. All supplied variants have identical output bytes.",
"ar": "يعمل دون أجهزة بحالة 0. يطبع رسالة الجدولة غير الصالحة باللغتين مع موضع محرف الجدولة من الصفر وقيمة Unicode له، ومسار PNG نصيا، وe مفككة مع U+0301 وNUL فعلية قبل A، ثم identity and literals complete. لا يفتح المسار. لكل الصيغ الموردة بايتات إخراج متطابقة."
},
"output": "Text input is invalid. مدخل النص غير صالح. MeasureText: text.input: scalar_index=3 scalar=U+0009.\ndocs/examples/assets/raylib-sprites.png\nمسار/é.png\u0000A\nidentity and literals complete\n"
}
}الإنهاء وتحرير الموارد
افحص نتائج التحرير والإغلاق الصريحين عند الانتهاء الطبيعي. يسحب الرجوع أو المصيدة أو الحد أو الإلغاء عمل المصدر ويهجر الإطار المفتوح دون عرض إطار أخير عمدا. يحرر التنظيف عمل GPU قبل نافذته وعمل المازج والمفكك قبل جهاز الصوت. تبقى الذاكرة والتكاليف محفوظة عندما يتعذر إثبات التحرير الأصلي. لا يوجد ضمان قطع قسري داخل العملية لتعليق برنامج تشغيل المضيف.
الحدان الافتراضيان 256 MiB للآلة الافتراضية وحساب خلفية مشترك واحد قدره 128 MiB لـRaylib وHTTP. يحفظ الرفض قبل الدخول الأصلي الحالة، ويضمن الفشل بعد الآثار الأصلية تنظيف الموارد المملوكة دون تراجع عام. راجع الحدود والأخطاء.
عند توزيع برنامج ELF احتفظ بملفه المرافق .THIRD-PARTY-NOTICES والأصول والإشعارات المطلوبة. يعمل البرنامج الناتج دون المصدر أو مترجم لبات لكنه يحتاج إلى متطلبات رسوم Linux الموثقة. يبقى مصدر الدليل الأصلي (يفتح في نافذة جديدة) تنزيلا مطابقا للمنشور.
توقف أول إشارة SIGINT/SIGTERM كود التطبيق نهائيا وتلغي الإدخال وطلبات التطبيق المنتظرة، وتصرف فقط معالجات HTTP المقبولة سابقا خارج الرسم. تسحب الإشارة الثانية التصريف المتبقي. لا تشغل المصائد والحدود والإلغاء الآخر معالجات تصريف. يستخدم تنظيف الموارد المتبقية موعدا واحدا t + max(R,H) تقيده نطاقات التنفيذ والعملية والجلسة السابقة، ولا تجدده المحاولات. R مهلة تنظيف Raylib. H مهلة الجلسة المتبقية، وإلا أقصى 1000 ms ومهل تنظيف العملاء المقبولين عندما يبقى عمل HTTP. لا تضيف الاستيرادات غير المستخدمة أو الترويسات المغلقة مهلة. تبقى حالات الانتهاء 5 للمصيدة و6 للحد و7 للإلغاء و8 لفشل المضيف، مع نسبة تنظيف منفصلة للنتيجة الأساسية السابقة.
النشر بمتطلبات المضيف الفعلية
تستهدف الأدوات والبرامج الناتجة Linux بمعمارية x86_64 وglibc 2.34 أو أحدث. هي ELF64 PIE بمفسر /lib64/ld-linux-x86-64.so.2 واعتمادين مباشرين libc.so.6 وlibm.so.6، مع RELRO وربط فوري ومكدس غير قابل للتنفيذ ودون RPATH/RUNPATH. تجلب مكتبات الرسوم والصوت المحملة ديناميكيا اعتمادياتها وصلاحياتها وبرامج تشغيلها. يحتاج النص على المعالج والمساعدون النقيون إلى قاعدة المعالج وglibc فقط، ولا يحصل الاستيراد وحده على شاشة أو جهاز صوت.
| المسار | مكتبات المضيف ومتطلباته |
|---|---|
| X11 أو XWayland | libX11.so.6 وlibXxf86vm.so.1 وlibXi.so.6 وlibXrandr.so.2 وlibXcursor.so.1 وlibXinerama.so.1 وlibXrender.so.1 وlibXext.so.6. يجرب GLX أولا libGLX.so.0 ثم libGL.so.1. يلزم DISPLAY مصرح وOpenGL 3.3 core. |
| Wayland | libwayland-client.so.0 وlibwayland-cursor.so.0 وlibwayland-egl.so.1 وlibxkbcommon.so.0 وlibEGL.so.1. يلزم compositor/subcompositor وxdg-shell وذاكرة مشتركة ولوحة مفاتيح ومؤشر ومخرجات قابلة للاستخدام وسمة مؤشر. يستخدم OpenGL 3.3 core لسطح المكتب دون libdecor. عند غياب إجراءات EGL GL يجرب libOpenGL.so.0 ثم libGL.so.1. |
| PulseAudio أو خدمة PipeWire المتوافقة | libpulse.so.0 وخدمة تشغيل متاحة ونقطة صوت قابلة للاستخدام. |
| ALSA المباشر | libasound.so.2 وجهاز تشغيل قابل للاستخدام ومصرح. |
يستخدم تحميل المضيف بحث المحمل المعتاد بنطاق فوري ومحلي وفحص الرموز المطلوبة. لا تلزم روابط مكتبات التطوير. يتبع اختيار الشاشة تجهيز المضيف، ويجرب الصوت PulseAudio ثم ALSA. يوقف رفض المدخلات أو الموارد أو الإلغاء أو تعذر إثبات التنظيف المحاولات. يعرض فشل كل المرشحين بعد التحرير الآمن فئة المرشح الأخير والخلفيات المجربة. لا يستبدل مسار الرسوم أو الصوت النجاح بتشغيل دون جهاز.
تضمن الأدوات Raylib 6.0 وHarfBuzz 14.4.0 وICU 78.3 ببيانات Unicode 17.0.0 الكاملة وFreeType 2.14.3 والخطوط الافتراضية. لا يستدعي فحص التطبيق وبناؤه مترجم C أو مجمعا أو رابطا ولا يحصل على جهاز. لا يحتاج المتلقي إلى مشغل لبات أو Raylib نظامي أو خطوط مضيف أو مصدر. تبقى ملفات PNG وWAV/OGG/MP3 والخطوط المخصصة خارجية عند استخدامها. احفظ مسارات مجلد العمل وتراخيصها.
بعد تنزيل عائلة النص المشكل وOGG وإشعاره في الشجرة المذكورة:
mkdir -p deploy/docs/examples/assets
aspl build -o deploy/shaped docs/examples/raylib/نص-مشكل-وصوت.لبات
cp docs/examples/assets/raylib-tone.ogg docs/examples/assets/raylib-tone.NOTICE deploy/docs/examples/assets/
cd deploy
./shaped --aspl-diagnostic-language=arوزع <program>.THIRD-PARTY-NOTICES بجانب الملف التنفيذي مع إشعارات الأصول. لا يقرأ التشغيل الملف المرافق. ينشر البناء المرافق ذريّا أولا ثم الملف التنفيذي. يمنع فشل الإشعار نشر التنفيذي، ويحفظ فشل التنفيذي اللاحق الملف القديم ويبلغ عن الإشعار المنشور. يعيد اصطدام المصدر أو الوحدة output-is-source، وتطابق مساري التنفيذي والمرافق output-path-collision، وفشل الأمان أو الكتابة أو النشر host-operation-failed مع تفاصيل المرحلة والمسار والنتيجة الجزئية. لا ينشئ تشغيل المصدر مرافقا.
تختار شجرة الاستيراد كلها، بما فيها الاستيرادات غير المستخدمة والمتعدية، برنامجا مجهزا أساسيا أو HTTP أو Raylib أو مشتركا. لا تضيف مخرجات الأساسي أو HTTP وحدهما متطلبات Raylib أو الخطوط أو الجهاز. يجب أن تطابق سجلات البايتكود والفهرس والتجهيز الخاصة الأداة المختارة، وليست ABI عامة ثابتة. تحتفظ البرامج المستقلة الموزعة سابقا بهوياتها المضمنة. توفر خطوات التثبيت ومتطلبات النظام والتنزيلات ونشر HTTP الإجراءات المرتبطة. يحتفظ مصدر النشر الأصلي (يفتح في نافذة جديدة) ببايتاته المنشورة ونطاق أدلته.