はかせのラボ

私の頭の中を書いていく雑記ブログです

DirectX アイテムドロップ

あいさつ

どうも、はかせです。
今回は敵を倒したらパワーアップアイテムが出現するようにしました。

実装

敵のゲームオブジェクトのアクティブが切れたとき
パワーアップアイテムのゲームオブジェクトを生成しています。
f:id:hakase0274:20190112230948g:plain

コードです。

void EnemyBase::OnDisable()
{
	auto scene = mGameObject->GetScene();
	auto playScene = dynamic_cast<PlayScene*>(scene);
	playScene->AddScore(mScore);
	playScene->CreatePowerUp(*mGameObject->GetTransform());
}

今までのスコア追加していたところに生成を追加しただけです。

問題たち

今回実装するにあたりアイテムドロップそのものではなく他のところで
問題が出ていた&出ています。

配列要素の削除が出来ない

std::vectorの中身でアイテムのものを削除しようとしました。
STLコンテナの中身を消すときにはremove_ifを使って
削除する要素を末尾に押し込み
削除していくのが安全であるといわれています。

ただremove_ifは内部的にはコピー移動を繰り返しているようなものらしく
スマートポインタを使っているときに使うと使えないと怒られてしまいます。
(怒られました)

なのでremoveにせよeraseにせよ実行前にスマートポインタのreset関数で
メモリを解放してその後配列の中から削除するという風にする必要があります。

メモリ使用量が増え続ける

これはまだ解決できていない問題です。
起こっていることはタイトル→メイン→リザルトという一連のプレイを行うと
数MBですがメモリ使用量が増えてしまっています。

オブジェクトプールを使っている部分があるので
使用量が増えることがあるのはわかりますが
毎プレイ起こるのはさすがにおかしいです。

アイテムドロップにしても毎回追加生成したものは削除していますし、
アイテムドロップをオフにしても起こるのでこいつが直接的な原因ではないと思っています。

あとがき

今回はアイテムドロップの実装でした。
アイテムドロップの実装自体はそこまで難しくありませんでした。
最初は生成したものが反映されなくて焦りましたが
ゲームオブジェクト管理配列をインスタンスではなく
ポインタにすることで解決できました。

ただメモリ的な問題が発覚しました。
毎回何か実装したりコードを変える度に
ちゃんと動いてるかだけでなく数回プレイしてみて
動作や結果に異状がないか確認をしっかり行うべきだったと反省しています。
これからコードを精査してバグ取りをしたいと思います・・・・orz

それでは今回はこの辺でノシ

今回作ったものはgithubに上げました。
github.com