スプライトを描く(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コンテナの利用方法を知るいい機会になりました。