Rosakasa
Elixir

Rosakasa

محرك ألعاب ثلاثي الأبعاد بسيط لنظام Lys Entertainment. (يبدو الأمر أشبه بالهلوسة، حيث يتم تحديد الواقع من جانب الخادم)

GitHub|

محرك إطار عرض C بسيط مع خرطوشة عرض تجريبية ومضيف PC SDL2.

يهدف هذا المشروع إلى التشغيل على أجهزة ESP32 في المستقبل. ويُعد المضيف الحالي على الكمبيوتر الشخصي
هدفًا أصليًا للتطوير لاختبار محرك إطار العرض و
الخرطوشة التجريبية قبل دمجها في الأنظمة المدمجة.

كما يرتبط rosakasa_core بمشروع
Lys Entertainment System
، الموجود في مستودع منفصل.

التخطيط

include/rosakasa/display/   واجهة برمجة تطبيقات (API) عامة لـ framebuffer/العرض
demo/ نقطة دخول إعداد/تحديث كارتيدج العرض التوضيحي
demo/src/ أدوات مساعدة ومصادر عرض كارتيدج العرض التوضيحي
host/pc/ ملف قابل للتنفيذ على الكمبيوتر الشخصي يربط المحرك بكارتيدج العرض التوضيحي
src/engine/ دورة حياة المحرك، وحزم HTTP/WebSocket، وواجهة العرض الخلفية SDL

يتم التقاط مصادر كارتيدج العرض التوضيحي الموجودة ضمن demo/src/ تلقائيًا بواسطة CMake.

الكمبيوتر الشخصي الأصلي

make build
make run

إذا لم يكن SDL2 مثبتًا محليًّا، يقوم CMake بتنزيل SDL2 باستخدام FetchContent بشكل افتراضي.

تكوين المحرك

يتولى rosakasa_engine تكوين الحزم من خلال RosakasaEngineConfig.
تتوفر حزم HTTP وWebSocket ولكنها معطلة افتراضيًّا حتى يتم ربط
خلفية مدمجة أو خلفية للكمبيوتر الشخصي:

RosakasaEngineConfig config = rosakasa_engine_default_config();

config.websocket.enabled = true;
config.websocket.host = "192.168.1.10";
config.websocket.path = "/socket";
config.websocket.port = 80;
config.websocket.use_tls = false;
config.websocket.send = platform_websocket_send;
config.websocket.user_data = platform_websocket;

rosakasa_engine_create_with_config(&config, &engine);

واجهة برمجة التطبيقات (API) للإرسال الموجهة للمحرك محايدة من حيث الخلفية:

RosakasaWebSocket *websocket = rosakasa_engine_websocket(engine);

rosakasa_websocket_send_text(websocket, "{\"type\":\"ping\"}");

تتولى دالة الاستدعاء send المُهيأة مسؤولية النقل الفعلي عبر المنصة
وكتابة إطارات WebSocket. على أجهزة الكمبيوتر الشخصية (PC)، يمكن أن يتم ذلك بدعم من مكتبة WebSocket أصلية؛
أما على ESP32، فيمكن أن يتم ذلك بدعم من عميل ESP-IDF WebSocket.

يتضمن مضيف الكمبيوتر الشخصي (PC) خلفية أساسية ws://. قم بتمكينها باستخدام متغيرات
البيئة قبل التشغيل:

ROSAKASA_WS_HOST=127.0.0.1 ROSAKASA_WS_PORT=4000 ROSAKASA_WS_PATH=/socket make run

ROSAKASA_WS_TLS=1 مخصص لـ wss://، لكن الخلفية على جهاز الكمبيوتر الشخصي لا تدعم
TLS حتى الآن.

رسم العرض التوضيحي

يحتوي العرض التوضيحي على تجريد محلي لمخزن الإطارات:

typedef struct {
    uint8_t *pixels;
    int width;
    int height;
    int pitch_bytes;
} Framebuffer;

تستقبل دوال المساعدة في الرسم معلمة Framebuffer *، لذا لا تحتاج مواقع الاستدعاء إلى تكرار أبعاد الشاشة:

draw_line(&demo_framebuffer, (Point){20, 20}, (Point){220, 220}, 220);
draw_square(&demo_framebuffer, center, length, 255);

تبدأ إحداثيات الشاشة من أعلى اليسار:

(0, 0) x تزداد ->
  |
  v
y تزداد

بالنسبة لمخزن الإطارات الافتراضي 240x240، يكون مركز الشاشة:

Point screen_center = {
    demo_framebuffer.width / 2,
    demo_framebuffer.height / 2,
};

تتعامل دالة draw_square مع وسيطها من نوع Point على أنه مركز المربع.