LibRocketをSDLおよびOpenGLと統合する


7

私は現在ゲームプロジェクトに携わっており、メニューやその他のGUIを追加したいところまで到達しましたが、独自のシステムの開発に費やした時間は少し時間がかかる可能性があり、これはその一部です時間を無駄にしたくないシステムの。

したがって、GUIchan、CEGUI、最近のLibRocketなど、非常に柔軟で便利なUIライブラリについて読んでいます。私の質問は、LibrocketをC ++のSDL / OpenGLで開発されたプロジェクトと統合できるかどうかです。そのような情報を見つけることができないため、その情報がどこにあるかを知っている場合。

回答:


7

はい、ほぼすべてのレンダリングシステムでlibRocketを使用できます(ほとんどのデスクトップシステム、iOSおよびAndroidにはlibRocketアプリがあります)。

libRocketは、内部的に抽象レンダーインターフェースを使用します。libRocketは、テキストを内部構造に解析し、そのジオメトリをその抽象的なレンダラーにプッシュする準備ができているライブラリです。

したがって、レンダラーを自分で実装しないと、何もレンダリングされません。誤っていない場合は、単にRocket :: Core :: RenderInterfaceを継承し、いくつかの関数を自分で実装します。

これを行う方法に関するドキュメントは、ここで見つけることができます:http : //librocket.com/wiki/documentation/C%2B%2BManual/Interfaces

次に、カスタムレンダラーを割り当てると、それがジオメトリのプッシュに使用されます。この時点で、それをどうするかを完全に制御できます。

OpenGLレンダラー用のサンプルがありますが、SDLに適合させることができます。

それが役に立てば幸い。


コメントをありがとう、それは私がプロセスの多くに役立つでしょう。
oscar.rpr

1
@ oscar.rpr libRocketが提供するサンプルレンダーインターフェースは、samples / shell / include / ShellRenderInterface.hおよびsamples / shell / src / ShellRenderInterface.cppファイルで使用できる最適化を提供しないことにも注意してください。。さらに、前回使用したとき、ライブラリはレンダリング時にGL_VERTEX_ARRAYSを有効にしなかったため、自分で行う必要がありました。または、何も表示されませんでした。
Martin Foot

返信をありがとう、私は最近それで仕事をするつもりです、私は私の進歩をあなたに話します。
oscar.rpr 2011年

1

libRocketコードにいくつかの変更を加えて、ウィンドウの作成に合格させる必要があると思います。別の方法があるかどうかはわかりませんが、このコードが機能することは間違いありません。Windowsシステム用に開発していると思います。別のプラットフォームをターゲットにしている場合、同様の手順がありますが、変数と関数が異なります。

まず、SDLが作成するウィンドウのハンドラーを取得する必要があります。このコード部分は、必要なHWND値を抽出します(ここによると:

#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;

libRocketがレンダリングに同じウィンドウを使用することを確認する必要があります。ファイルを少し検索した後、hg/shell/src/win32/ShellWin32.cppウィンドウ作成関数を含むファイル(アドレスはgooglecodeに基づいています)を見つけました。そこにという名前の関数が表示されbool Shell::OpenWindow(const char* name, bool attach_opengl)ます。これは、ウィンドウを作成する主な機能です。libRocketでhwndSDL変数を再利用するには、これらの関数以外のすべての行を削除またはコメント化する必要があります。

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

これらの行の直前に次のコードを追加します。

window_handle = hwndSDL;

私はそれが仕事をするための最良の方法ではないことを知っていますが、私はそれがうまくいくと確信しています。また、ウィンドウ以外のものをターゲットにしている場合は、HWND値とcreatewindow関数に相当するものを見つける必要があります。ほとんどすべてのウィンドウシステムがウィンドウまたは非ウィンドウのどちらかが同じロジックを共有しているため、コードのどこかにあるはずです。


libRocketを頻繁に使用しますか?libRocketがそのような低レベルのコードに到達しないと確信しています。答えを無視せずに:)とにかく答えを試します:)
Grimshaw

答えてくれてありがとう。今後のゲームプロジェクトのアイデアをチェックします。
oscar.rpr

1
@Devilいいえ、このようなライブラリが存在することを知りました!私の回答で述べたように、これがlibRocketに最適な方法であるかどうかはわかりませんが、うまくいくはずです。他のグラフィックライブラリを接続するために同じことを行いました。たとえば、Qt SDK内でゲームエンジンを初期化します。
Ali1S232
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.