1

編集: SDLを使用するか、Window、Linux、Mac、iOS、Androidで実行される、これを行うためのビルド済みライブラリはありますか?

現時点では、コンテキストを変更する方法が非常に優れたデザインであるかどうかはわかりませんが、完全には完成していません。私は自分の時間を無駄にすることを本当に心配しています。ウィンドウ管理とイベント処理にSDLを使用しています。

私は現在、これを管理するためにSDL(具体的にはSDL 2)をクラスでラップしています。これらは私のクラスとそれらが行うことです:

  • ウィンドウ-ウィンドウについて説明します
  • WindowContext -Windowのコンテキストを記述します(抽象クラ​​ス)
  • WindowDelegate-コンテキストがいつ変更されたか、ウィンドウがいつ開閉するかなどを決定するために使用されます。
  • WindowEventListener-ウィンドウからのイベントをリッスンします(関数をコールバックするのではなく、ポーリングに固執する必要があるかどうかはわかりません)

とにかく、これがどのように機能するかの例です:

OglWindowContext* context = new OglWindowContext;
// change context's settings
Window window(ipoint2(), idimension2(640, 480), "Test Window", 
              Window::Resizeable, context, &windowListener, 
              NULL /* window delegate */);

while(window.isOpen())
{
    window.processEvents(); // calls back events to the WindowEventListener
    window.draw(); // calls the context's draw method
}

注:ipoint2は2Dポイントです

そして、次のように呼び出すことで、コンテキストを途中で変更できます。

window.setContext(new Dx9Context); // or whatever context you would like

これを行うためのより簡単な方法はありますか、またはより効率的な方法を言う必要がありますか?

4

1 に答える 1

1

レンダラーの切り替えは、現時点では Windows 以外のプラットフォームではあまり意味がないため、Windows、Linux、Mac、iOS、および Android のサポートに対するあなたの要求は奇妙に聞こえます。おそらく、一般的に移植性を高めるのに役立つライブラリを探しているのでしょうか?

いずれかのレンダラー (opengl/d3d) で実行するか、一般的に移植性を実現するには、ある種の移植性レイヤーを実装する必要があります。

基本的に、2 つのプログラムを作成することから始めることができます。1 つは OpenGL で回転する立方体を描画し、もう 1 つは D3D で同じことを行う完全に別のプログラムです。次に、これらを組み合わせた 3 番目のプログラムを次のように記述します。

  • 共通のインターフェースの背後にある 2 つのアプリケーションから異なるものを抽象化する
    • さまざまなプラットフォームに入ると、次のようになりますが、これらに限定されません。
      • アプリケーション制御ループ
      • レンダラー (つまり、グラフィック出力)
      • ファイル I/O
      • ユーザー入力
      • オーディオ
      • システム サービス (スレッドなど)
  • すべてのターゲット プラットフォームに共通のインターフェイスを実装する
  • 抽象化インターフェースのみを介してアプリケーション機能を実装する

Windows 上の D3D と OpenGL は実質的に別のプラットフォームと見なすことができますが、アプリケーションの起動時にどちらかを選択できます。選択はおそらくレンダラーとアプリケーション制御ループに影響します。

ランタイム中の切り替えも完全に可能ですが、おそらく手間がかかりすぎて価値がありません.

SDL が実際に上記の多くのことを行っていることに気付くかもしれません。

于 2012-12-17T10:25:25.367 に答える