オブジェクト2Dクラスを拡張し、チップを複数持った上でそれらを全て一括で高速に描画できる2D描画オブジェクトです。
同じくテクスチャを描画するテクスチャオブジェクト2Dの場合は、描画するテクスチャの数だけそのインスタンスを生成する必要があります。しかし、テクスチャオブジェクト2DはOnUpdateメソッドを呼び出す分、その数が増えるとゲームに対して甚だしい負荷がかかります。そこで、このマップオブジェクト2Dはテクスチャと描画の情報をまとめたチップを複数持つことで、OnUpdateメソッドを一度しか呼び出さずに複数のテクスチャを描画することができ、ゲームに掛かる負荷を減らすことが出来ます。図に示すように大量の画像も高速に描画できます。
描画対象とするチップはAddChipにて追加、RemoveChipにて削除することが出来ます。
アクションゲームにおいて、マップチップや背景オブジェクトなどのゲーム中にてほぼ更新する必要はないが大量に描画する必要があるテクスチャを扱うのにこのマップオブジェクト2Dは適しています。逆にプレイヤーや敵キャラクターなど毎フレーム更新するオブジェクトを扱うには、テクスチャオブジェクト2Dが適しています。
チップの作成や設定については、チップの項を御覧ください。
名称 | 説明 |
---|---|
AddChip | チップを描画対象として追加する (追加成功か否かが返り値) |
RemoveChip | チップを描画対象から削除する(削除成功か否かが返り値) |
名称 | 説明 |
---|---|
CenterPosition | 描画の際に適用する変換(拡大、回転、移動)の基準位置。(親から見た相対座標にて設定) |
DrawingPriority | 描画の優先順位 |
なし
MapObject2Dクラスのサンプルです。
#include <ace.h>
// MapObject2Dのサンプル。敷き詰められたタイルをカメラで撮影して画面に表示しています。
int main()
{
// AC-Engineを初期化する。
ace::Engine::Initialize(ace::ToAString("MapObject2D").c_str(), 640, 480, ace::EngineOption());
// シーンを生成する
auto scene = std::make_shared<ace::Scene>();
// レイヤーを生成する
auto layer = std::make_shared<ace::Layer2D>();
// シーンにレイヤーを追加する
scene->AddLayer(layer);
// シーンを切り替える
ace::Engine::ChangeScene(scene);
// カメラを設定する。
auto camera = std::make_shared<ace::CameraObject2D>();
camera->SetSrc(ace::RectI(0, 0, 640, 480));
camera->SetDst(ace::RectI(0, 0, 640, 480));
{
// マップオブジェクトを生成する。
auto mapObject = std::make_shared<ace::MapObject2D>();
auto texture = ace::Engine::GetGraphics()->CreateTexture2D(ace::ToAString("Data/Texture/Sample2.png").c_str());
// マップオブジェクトに50*50=2500個のチップを登録する。
for (int i = 0; i < 50; ++i)
{
for (int j = 0; j < 50; ++j)
{
// チップを生成する。
auto chip = std::make_shared<ace::Chip2D>();
// チップにテクスチャを設定する。
chip->SetTexture(texture);
// チップの描画先を指定する。
chip->SetPosition(ace::Vector2DF(i * 40 - 1000, j * 40 - 1000));
// マップオブジェクトにチップを追加する。
mapObject->AddChip(chip);
}
}
// レイヤーにマップオブジェクトを追加する。
layer->AddObject(mapObject);
// レイヤーにカメラオブジェクトを追加する。
layer->AddObject(camera);
}
// AC-Engineのウインドウが閉じられていないか確認する。
while (ace::Engine::DoEvents())
{
// カメラを移動させる
auto pos = camera->GetSrc();
pos.X += 1;
pos.Y += 1;
pos.X %= 1000;
pos.Y %= 1000;
camera->SetSrc(pos);
// AC-Engineを更新する。
ace::Engine::Update();
}
// AC-Engineの終了処理をする。
ace::Engine::Terminate();
return 0;
}