表紙の写真

スプライトを描く(4)

SoftwareSpriteクラスをArrayコンテナに入れて、次のようにコーディングをしましたがArray::push_backメソッドを呼び出すとエラーになります。前回、自前のソフトウェアスプライト型を使わなかったのは、手直ししている時間がなかったからです。

void Main()
{
   Texture texPlayer(U"option.png");
   Array<SoftwareSprite> option;
   for (int x : {0, 1, 2}) {
       option.push_back(SoftwareSprite(&texPlayer, x * 16, 0, 16, 16));
   }

   while (System::Update())
   {
       Create<Option>(option);
       TaskCall::All::Update();
       Task::All::Update();
   }
   Task::All::Clear();
}

エラーの原因を調べてみると、少々SoftwareSpriteクラスを書き換えなければならないことがわかりました。今回はエラー対処の備忘録です。


SoftwareSpriteクラスの修正

まずは引数つきのコンストラクタを追加します。内部でDefineメソッドを呼び出すようにします。これは先のエラーとは関係ありません。

SoftwareSprite::SoftwareSprite(Texture *Tex, int Left, int Top, int Width, int Height) {
   Define(Tex, Left, Top, Width, Height);
}

次にArray::push_backメソッドでエラーとなる根本原因を修正します。どうやら次の基底クラスを持つクラスしか受けつけてもらえないようです。

std::vactor<T, std::conditional_t<false, s3d::AlignedAllocator<T, 8Ui64>, std::allocator<T>>>

この辺りの話と絡むのかもしれないので自分用にメモを残します。

・C++11の新機能によるインターフェースの共通化
 https://cpplover.blogspot.com/2012/03/c11.html
・クラステンプレートとエイリアステンプレートの違い
 https://cpplover.blogspot.com/2012/03/blog-post.html

SoftwareSpriteクラスを派生させるように書き直します。

class SoftwareSprite : std::vector<SoftwareSprite, std::conditional_t<false, AlignedAllocator<SoftwareSprite, 8Ui64>, std::allocator<SoftwareSprite>>>

これで動くようになりました。

Arrayコンテナの強力な能力を使うためにはひと工夫が必要なのではないかと思います。

将来的にArrayコンテナではソフトウェアスプライトを管理しないかもしれませんが、OpenSiv3Dの勉強をすることが目的なのでArrayコンテナの利用方法を知るいい機会になりました。


この記事が気に入ったらサポートをしてみませんか?