SDL を使用してモジュール設計のゲームを作成したいのですが、スプライトを表示できません。正確には、タイル セットを実装しようとしています。これは、1 つの PNG ファイルに収集された同じサイズのスプライトの束です (私の場合)。
私のデータ構造は、タイル セットで使用可能なスプライトの配列を保持する必要があります。これは、 のようなメソッドで描画できますdraw(Tile *, Position, Layer);
。
示されているように、後で複数の独立した背景レイヤーと前景レイヤーを実装するために、サーフェスの複数のレイヤーをフィーチャーしたいと考えています。同様に、定義済みの順序でscreen
サーフェス ( で作成) にブリットされたレイヤーの配列があります。SDL_SetVideoMode
ただし、コードで何が問題になっているのかわかりません。タイル セットが読み込まれている間、次のスニペットのように、現在読み込まれているタイルをレイヤー サーフェスに正常にブリットできます。
this->graphic = SDL_CreateRGBSurface(SDL_HWSURFACE | SDL_SRCALPHA,
tile_widths, tile_heights, bit_depth,
rmask, gmask, bmask, amask);
SDL_BlitSurface(tileset_graphic, &tile_position, this->graphic, nullptr);
SDL_BlitSurface(tileset_graphic, &tile_position,
((VideoController::get_instance())->layers)[0], &tile_position);
tileset_graphic
最初の行では、スプライトに対応するの部分を、後で使用するために構造体SDL_Surface *
によって保持されるにブリットしようとしています。Tile
ただし、このサーフェスを使用してレイヤーにブリットすることはできません。2 番目の (テスト) ステートメントは、考慮されている領域をtileset_graphic
レイヤーの最下部にコピーするだけです。さらに、main
メソッドでいくつかのテスト コマンドを実行しました。
テスト中の私の発見:
- ピースをレイヤーにブリットでき
tileset_graphic
、正しく表示されます(上記を参照) 画面に直接blitできます。
Tile
SDL_BlitSurface( tile->graphic, nullptr, (VideoController::the_instance)->screen, &relative_position);
ただし、レイヤーにブリットすることはできません。
Tile
SDL_BlitSurface( tile->graphic, nullptr, (VideoController::the_instance)->layers[0], &relative_position);
より正確には、テストのために全体tileset_graphic
をblitし、このテストのために既に占有されている領域にa を blitすると、スプライトが部分的に表示されます。しかし、繰り返しになりますが、なぜそうなのかはまったくわかりません...Tile
概要:
いくつかの s を別の s にブリットしようとしましSDL_Surface
たが、この (目的の) サーフェスのチェーンを試すだけで失敗するようです:
graphic --> layer --> screen
何がうまくいかないのか、またはあなたが必要とする追加情報を教えてくれる人はいますか?
編集
初期化された ( ) でのブリッティングを見つけることができましたSDL_CreateRGBSurface
が、まだ「手つかずの」レイヤー サーフェスは何らかの形で失敗しているようです。SDL_FillRect
タイルをレイヤーにブリットする前にレイヤー サーフェスで使用すると、正しく表示されます。ただし、この方法でレイヤーの透明度が失われています...