Tích hợp LibRocket với SDL và OpenGL


7

Tôi hiện đang tham gia vào một dự án trò chơi và chúng tôi đạt đến điểm chúng tôi muốn thêm GUI cho menu và các thứ khác nhưng thời gian chúng tôi có thể dành để phát triển hệ thống của riêng mình có thể khiến chúng tôi mất một chút thời gian và đây là một phần của hệ thống mà chúng tôi không muốn mất quá nhiều thời gian.

Vì vậy, chúng tôi đang đọc về một số Thư viện UI như GUIchan, CEGUI và gần đây là LibRocket rất linh hoạt và hữu ích, vậy câu hỏi của tôi là liệu Librocket có thể được tích hợp với dự án phát triển SDL / OpenGL trong C ++ không? và nếu bạn biết nơi để tìm thông tin về điều đó, bởi vì chúng ta không thể tìm thấy thứ gì đó như thế.

Câu trả lời:


7

Có, bạn hoàn toàn có thể sử dụng libRocket với gần như bất kỳ hệ thống kết xuất nào (Có ứng dụng libRocket trong hầu hết các hệ thống Máy tính để bàn, iOS và Android.)

libRocket sử dụng một giao diện kết xuất trừu tượng trong nội bộ. libRocket là một thư viện sẵn sàng phân tích văn bản thành các cấu trúc bên trong, sau đó đẩy hình học của nó vào trình kết xuất trừu tượng đó.

Vì vậy, không có gì được hiển thị cả nếu bạn không tự thực hiện trình kết xuất. Bạn chỉ cần kế thừa Rocket :: Core :: RenderInterface nếu tôi không nhầm và tự thực hiện một vài chức năng.

Tài liệu về cách làm điều này có thể được tìm thấy ở đây: http://librocket.com/wiki/documentation/C%2B%2BManual/Interfaces

Sau đó, khi bạn chỉ định trình kết xuất tùy chỉnh của mình, nó sẽ được sử dụng để đẩy hình học. Tại thời điểm này, bạn có toàn quyền kiểm soát những gì phải làm với nó.

Có các mẫu xung quanh trình kết xuất OpenGL, nhưng bạn có thể điều chỉnh một mẫu cho SDL, nếu bạn thấy phù hợp với mình!

Hy vọng nó giúp.


Cảm ơn vì nhận xét, điều đó sẽ giúp tôi rất nhiều trong quá trình này.
oscar.rpr

1
@ oscar.rpr Cũng cần lưu ý rằng libRocket cung cấp giao diện kết xuất mẫu không cung cấp tối ưu hóa mà bạn có thể sử dụng trong các mẫu / shell / include / ShellRenderInterface.h và các mẫu / shell / src / ShellRenderInterface.cpp như được giải thích ở đây . Ngoài ra, lần cuối cùng tôi sử dụng nó, thư viện đã không bật GL_VERTEX_ARRAYS khi nó được hiển thị, vì vậy tôi phải tự làm điều đó hoặc tôi không thể thấy gì.
Martin Foot

Cảm ơn đã trả lời, tôi sẽ làm việc với điều đó những ngày này, tôi nói cho bạn biết sự tiến bộ của tôi.
oscar.rpr

1

Tôi đoán bạn phải thực hiện một số thay đổi trong mã libRocket để vượt qua việc tạo Window. Tôi không chắc có cách nào khác không nhưng tôi chắc chắn đoạn mã này sẽ hoạt động! và tôi giả sử bạn đang phát triển cho một hệ thống windows, nếu bạn đang nhắm mục tiêu một nền tảng khác thì có một bước tương tự nhưng với các biến và chức năng thay đổi khác nhau!

trước hết bạn cần phải có một trình xử lý cho cửa sổ mà SDL tạo ra. đoạn mã này trích xuất giá trị CTNH yêu cầu (theo đây :

#include <SDL_syswm.h>

struct SDL_SysWMinfo wmInfo;
SDL_VERSION(&wmInfo.version);

if(-1 == SDL_GetWMInfo(&wmInfo))
    throw AVException(SDL_GetError());

HWND hwndSDL = wmInfo.window;

bây giờ chúng ta cần đảm bảo libRocket sử dụng cùng một cửa sổ để hiển thị, sau khi tìm kiếm một chút trong các tệp tôi đã tìm thấy một tệp hg/shell/src/win32/ShellWin32.cpp(địa chỉ dựa trên googlecode) có chứa các chức năng tạo cửa sổ. ở đó bạn sẽ thấy một chức năng được đặt tên bool Shell::OpenWindow(const char* name, bool attach_opengl). đó là chức năng chính chịu trách nhiệm tạo cửa sổ. để làm cho libRocket sử dụng lại hwndSDLbiến của chúng tôi, bạn phải xóa / nhận xét tất cả các dòng trong hàm đó ngoại trừ:

if (attach_opengl)
{
    opengl_attached = AttachOpenGL();
    if (!opengl_attached)
        return false;
}

và ngay trước khi những dòng này thêm đoạn mã này:

window_handle = hwndSDL;

Tôi biết đó có thể không phải là cách tốt nhất để làm việc nhưng tôi chắc chắn nó sẽ hoạt động. và nếu bạn đang nhắm mục tiêu bất cứ thứ gì ngoài cửa sổ, bạn chỉ cần tìm các giá trị tương đương cho giá trị HWND và chức năng tạo lại. họ chắc chắn ở đâu đó trong mã vì hầu hết tất cả các hệ thống cửa sổ hoặc cửa sổ hoặc không phải cửa sổ đều có chung logic.


Xin lỗi, bạn có sử dụng libRocket thường xuyên không? Tôi gần như chắc chắn libRocket không đến với loại mã cấp thấp đó .. Không bỏ qua câu trả lời của bạn :) Tôi sẽ thử một câu trả lời nào :)
Grimshaw

Cảm ơn câu trả lời, tôi sẽ kiểm tra ý tưởng của bạn cho các dự án trò chơi trong tương lai.
oscar.rpr

1
@Devil không tôi mới phát hiện ra một thư viện như vậy tồn tại! như tôi đã nói trong câu trả lời của mình, tôi không chắc đây có phải là phương pháp tốt nhất cho libRocket không, nhưng nó sẽ hoạt động. Tôi đã làm điều tương tự để kết nối một số thư viện đồ họa khác. ví dụ: để khởi tạo một gameengine trong Qt SDK.
Ali1S232
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.