進歩の話が出たところでその進歩のお話。
あい。ちゃんSTG企画ですが一歩二歩進んだり帰ったりしながら
のんびり時間が過ぎていきます。
というのも使っている言語、C++の使い方がよく分かってないというのもあります。
だって最近になってvectorとかスマートポインタとか知りましたからね……
しかも正直言って今回のお話は動的に作る意味というのはないです。
寧ろ重くなる気もしますし、シミュレーションやRPGならまだしも
フレームレートが重要なSTGでやる所業ではないかもしれないです。
じゃあなぜやるかって?
俺カッコいEEEEEがしたいからです。
さて、現在私は敵オブジェクトを
csvで内容データを作りそれをロードして敵オブジェクトを確保しています。
その際、敵はクラス化しているのですが
それだと敵が一種類しか作れないので
ちょっとわかりにくいですが派生クラスで敵の情報を作り
csvのデータ列でどの敵オブジェクトをロード時に読み込むかという仕組みにしてます。
それによって、派生した敵はすべてユニークとなり、
個別のアニメーションができるようになりました。
問題なのはそれをどうやって追加していくのか。
ベースクラスの配列に派生クラスを入れるというのは実体ではできません。
enemy[1] = enemyA;
なんてやってもできないんです。(多分)
そのため、こういう作りでオブジェクトを作っていく場合は
ポインタを使用します。
ポインタは実際よくわかってないですが
とりあえずこんな使い方もできるんだという感じで思っといていいと思います。
Enemy* enemy = new EnemyA();
型宣言とか考えてなかったのでちょっと混乱するでしょうが
申し訳ないです。
とにかく、これによってベースクラスに対して派生クラスを
入れて使えるようになりました。
あとはベースクラスに
更新処理と描画処理をいれて仮装関数にして派生クラスに記述すればちゃんと動きますね。
ですが一つ問題があります。
new演算子を使う決まり事のようなんですが
必ずdeleteを使わないと要素を確保したままになってしまい
PCのメモリ不足。メモリリークが起きるようなんです。
上記の状態ならまだしも、配列になると厄介です。
std::vector<Enemy*> enemy;
for(int i = 0; i < 100; i++){
enemy.pushback(new EnemyA());
// EnemyAというオブジェクトを作り、そのアドレスをenemyにいれる
}
これは動的配列での方法になりますが
絶対にこれはやめてください。
for(int i = enemy.size(); 0 < i; i--){
enemy.erase(enemy.begin() + i); // enemyのアクセスを消去する
}
// 消してるのはあくまでポインタなのでEnemyAというオブジェクトは解放されていない。
これをしてもenemyに入れたnewの内容は解放されず、
vectorでアクセスできなくなっただけでPCに残りっぱなしになるようです。
こうなってしまうともうnewのオブジェクトを読むことはできなくなります。
ちなみに
for(int i = enemy.size(); 0 < i; i--){
Enemy* p = enemy[i];
enemy.erase(enemy.begin() + i); // enemyのアクセスを消去する
delete *p;
}
ってやればたぶん行けると思います。
……
面倒
eraseした時点でオブジェクトも消えて解放してよって思います。
なのでそうしましょう。
C++のstd標準ライブラリ?っていうのには
スマートポインタというものがあるようです。
その中でもstd::shared_ptrというのを使うことによって
eraseで要素を削除したときに同時に解放されようようになるみたいです。
javaのnewしたものを消してくれる機能みたいな感じですね。
std::shared_ptrには内部でカウンタを持っていてそれが
アクセスできる数というのを表してるみたいです。
それが0になったら解放されるっていう機能みたいですね。
なので
sta::vector< std::shared_ptr<Enemy*> > enemy
for(int i = 0; i < 100; i++){
enemy.pushback( std::shared_ptr< EnemyA >
// EnemyAというオブジェクトを作り、そのアドレスをenemyにいれる
}
for(int i = enemy.size(); 0 < i; i--){
enemy.erase(enemy.begin() + i); // enemyのアクセスを消去する
}
これでちゃんと消えるようになったみたいです。
ほとんど駆け足でわかりにくいと思うので
興味があったら調べてみてもらった方がいいと思います。
もっとわかりやすいと思うので……
そういえばこういうコードってブログでうまく書くにはどうすればいいんでしょうか?
なんかブログによってはコード用のスペースみたいなのがあるので
ちょっと調べてみます
ということで今回はここまでです
PR
COMMENT
カレンダー
最新記事
(02/05)
(01/22)
(06/01)
(12/18)
(12/18)
最新コメント
プロフィール
HN:
あい。
年齢:
30
性別:
非公開
誕生日:
1994/01/09
自己紹介:
仕事でunityしつつ、3Dとかやるので
そろそろどこに向かってるのか分からなくなってきた人
めーるあどれす:
nokutan_aiあっとyahoo.co.jp
このブログはリンクフリーです。
バナーのURL
"https://blog.cnobi.jp/v1/blog/user/ffb3f4a3a70931da92ac361f9c87596b/1408110435"
になってると思います。
@AI_nohito からのツイート
そろそろどこに向かってるのか分からなくなってきた人
めーるあどれす:
nokutan_aiあっとyahoo.co.jp
このブログはリンクフリーです。
バナーのURL
"https://blog.cnobi.jp/v1/blog/user/ffb3f4a3a70931da92ac361f9c87596b/1408110435"
になってると思います。
@AI_nohito からのツイート
カウンター