問題
私が作成している 2D ゲームでは、game
ゲーム オブジェクトへのポインタを保持するクラスにいくつかのベクトル リストがあります。これらは次のように定義されました。
std::vector<std::unique_ptr<Enemy>> enemies;
std::vector<std::unique_ptr<Item>> items;
次のコードを使用して、それらを繰り返し処理します。
for (std::vector<std::unique_ptr<Enemy>>::iterator it = enemies.begin(); it != enemies.end(); ++it) {
(*it)->Draw(screen);
for (std::vector<std::unique_ptr<Item>>::iterator it = items.begin(); it != items.end(); ++it) {
(*it)->Draw(screen);
最初はこれでうまくいきましたが、ある時点でゲームが実行されなくなり、デバッグを開始しようとすると「プログラムを開始できません」というエラーが表示されました。オンラインで解決策を検索しましたが、うまくいくものは見つかりませんでした。
これらのベクトルをこの回答に含めた理由は、ループが削除されたときにゲームが実行されるためです。items
2 番目のループ ( ) を削除するだけでゲームが実行されることもわかりました。次に、items
配列を標準のポインター ベクトルに変更するstd::vector<Item*>
と、新しいループが機能します。次のコードでループすると、次のように機能します。
for (size_t i = 0; i < items.size(); i++) {
items[i]->Draw(screen);
次に、コードを を使用するように変更しunique_ptr
、ベクトルを埋めるコードを削除しました。これでゲームも実行されるようになったので、ここで何か間違ったことをしているのではないかと心配しています。これは私がベクトルを埋める方法です:
std::unique_ptr<Item> sword(new Item(118 * tilesize, 81 * tilesize, "Sword"));
items.push_back(std::move(sword));
enemies
ベクトルが同じように満たされるため、これも奇妙です。
私が間違っていること、およびVisual Studioがプロジェクトをビルドしているのに、.exeがないために実行できない理由を誰かが指摘できますか?
関連する可能性のあるコード
品目クラス
class Item : public GameObject
{
public:
Item() {}
Item(int, int, char*);
virtual ~Item(void) {}
void Draw(Surface*);
}; // Item class
Item::Item(int x, int y, char *itemname) :
GameObject(x, y) {
tag = "Item";
name = itemname;
if (name == "Sword") {
sprite = spr_item_sword;
} else if (name == "Coconut") {
}
}
void Item::Draw(Surface *dest) {
GameObject::Draw(dest);
}
ゲームオブジェクトクラス
class GameObject
{
public:
Vec2D position;
Sprite *sprite;
char *tag, *name;
GameObject(void) {}
GameObject(int, int);
virtual ~GameObject(void) {}
virtual void Draw(Surface*);
}; // GameObject class
ログ
1>------ Build started: Project: Zelda, Configuration: Debug Win32 ------
1>Build started 25-10-2013 16:04:26.
1>InitializeBuildStatus:
1> Creating "Debug\Zelda.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1> game.cpp
1>c:\program files\microsoft visual studio 10.0\vc\include\vector(753): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
1> c:\program files\microsoft visual studio 10.0\vc\include\vector(746) : while compiling class template member function 'void std::vector<_Ty>::reserve(unsigned int)'
1> with
1> [
1> _Ty=Tmpl8::TileGraph
1> ]
1> MY_PATH_TO_FILE\game.h(40) : see reference to class template instantiation 'std::vector<_Ty>' being compiled
1> with
1> [
1> _Ty=Tmpl8::TileGraph
1> ]
1> item.cpp
1> template.cpp
1> Generating Code...
1>ManifestResourceCompile:
1> All outputs are up-to-date.
1>Link:
1> LINK : MY_PATH_TO_FILE\Debug\Zelda.exe not found or not built by the last incremental link; performing full link
1> Creating library MY_PATH_TO_FILE\Debug\Zelda.lib and object MY_PATH_TO_FILE\Tile Cutter\Debug\Zelda.exp
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>Manifest:
1> All outputs are up-to-date.
1>LinkEmbedManifest:
1> All outputs are up-to-date.
1> Tile_Cutter.vcxproj -> MY_PATH_TO_FILE\Debug\Zelda.exe
1>FinalizeBuildStatus:
1> Deleting file "Debug\Zelda.unsuccessfulbuild".
1> Touching "Debug\Zelda.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:03.10
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========