実現したいこと
c++を使ってvisualStudioで2Dアクションゲームを作ろうとしており、プレイヤーがコインに当たるとコインが消える、というものを作ろうとしています。vectorを使い動的配列でコインを生成しています
発生している問題・分からないこと
プレイヤーとコインの当たり判定は上手くいき接触したコインを消すためにvectorでコインを削除するためのコードを書き実行したところ、コインに接触した瞬間にエラーが起きウィンドウを閉じると、items_[i]->Update();の部分で「ハンドルされない例外が発生しました」とエラーがおきました
エラーメッセージ
error
1ハンドルされない例外が 0x00007FF7ACE3D9AC (BaseProject.exe) で発生しました: 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。
該当のソースコード
#include <DxLib.h> #include "Stage.h" #include "GameScene.h" #include "Player.h" #include "Application.h" #include "ItemBase.h" #include "ItemStar.h" GameScene::GameScene(void) { cameraPos_.x = 0; cameraPos_.y = 0; } GameScene::~GameScene(void) { } void GameScene::Init(void) { stage_ = new Stage(); stage_->Init(this); player_ = new Player(); player_->Init(this,0); player2_ = new Player(); player2_->Init(this,100); //出現カウンターを0にする itemSpawnCounter_ = 0; //出現数を1にする itemSpawn_ = 1; //アイテムの初期化 size_t size = items_.size(); for (int i = 0; i < size; i++) { items_[i]->Release(); delete items_[i]; } items_.clear(); p1ItemCollision_ = false; p2ItemCollision_ = false; p1Score_ = 0; p2Score_ = 0; } void GameScene::Update(void) { MoveCamera(player_); MoveCamera(player2_); stage_->Update(); player_->Update(player_, DX_INPUT_PAD1); player2_->Update(player2_, DX_INPUT_PAD2); //アイテムの更新処理は動的配列で回す //出現しているアイテムはすべて更新する size_t size = items_.size(); for (int i = 0; i < size; i++) { items_[i]->Update(); p1ItemCollision_=IsCollisionItem(player_); p2ItemCollision_=IsCollisionItem(player2_); } if (p1ItemCollision_) { p1Score_+=1; p1ItemCollision_ = false; } if (p2ItemCollision_) { p2Score_+=1; p2ItemCollision_ = false; } //アイテムの出現カウントを増やす ++itemSpawnCounter_; //出現カウントが指定値を超えたら if (itemSpawnCounter_ > ITEM_SPAWN_INTERVAL && itemSpawn_ < 3) { itemSpawnCounter_ = 0; //アイテムを動的生成 //ポインタに何もささない上程を設定するときは //nullptrをしようする ItemBase* newItem = nullptr; //アイテムの生成 int itemTypeMaxNum = static_cast<int>(ItemBase::TYPE::MAX) - 1; //アイテムのタイプをランダムで決定する int newItemType = GetRand(itemTypeMaxNum); //enmuで使用するためにアイテムのタイプに戻す ItemBase::TYPE randType = static_cast<ItemBase::TYPE>(newItemType); switch (randType) { case ItemBase::TYPE::STAR: newItem = new ItemStar(); break; } newItem->Init(this); //出現座標 Vector2F spawnPos; //ワーニング回避のために一旦初期化 spawnPos.x = 0; spawnPos.y = 0; //出現位置設定 switch (randType) { case ItemBase::TYPE::STAR: spawnPos.x = cameraPos_.x + GetRand(Application::SCREEN_SIZE_X); spawnPos.y = cameraPos_.y + GetRand(Application::SCREEN_SIZE_Y) + 90; break; } //座標の設定 newItem->SetPos(spawnPos); //動的配列に追加 items_.push_back(newItem); itemSpawn_++; } } void GameScene::Draw(void) { stage_->Draw(); player_->Draw(); player2_->Draw(); //アイテムの描画も動的配列でまわす形に変更 //出現しているアイテムすべてを描画する size_t size = items_.size(); for (int i = 0; i < size; i++) { items_[i]->Draw(); } player_->Draw(); player2_->Draw(); DrawFormatString(50, 90, 0xffffff, "%d,%d", cameraPos_.x, cameraPos_.y); DrawBox(130, 100, Application::SCREEN_SIZE_X - 130, Application::SCREEN_SIZE_Y - 100, 0xff0000, false); DrawFormatString(0, 110, 0xffffff, "%d,%d", p1Score_, p2Score_); } void GameScene::Release(void) { stage_->Release(); delete stage_; player_->Release(); delete player_; player2_->Release(); delete player2_; } Vector2 GameScene::World2MapPos(Vector2 worldPos) { Vector2 ret; int mapX = worldPos.x / Stage::CHIP_SIZE_X; int mapY = worldPos.y / Stage::CHIP_SIZE_Y; ret.x = mapX; ret.y = mapY; return ret; } bool GameScene::IsCollisionStage(Vector2 worldPos) { // ワールド座標からマップ座標へ変換する Vector2 mapPos = World2MapPos(worldPos); // プレイヤーがいる位置のマップチップ番号を取得する int chipNo = stage_->GetChipNo(mapPos); // 障害物のチップ番号と当たっていたら真を返す if (chipNo == 8 || chipNo == 9 || chipNo == 10 || chipNo == 11 || chipNo == 12) { return true; } return false; } bool GameScene::IsCollisionItem(Player* player) { Vector2F pPos = player->GetPos(); //アイテムの更新処理は動的配列で回す //出現しているアイテムはすべて更新する size_t size = items_.size(); for (int i = 0; i < size; i++) { Vector2F iPos = items_[i]->GetPos(); Vector2 iSize = items_[i]->GetSize(); if (pPos.x - Player::COL_SIZE_X / 2 < iPos.x + iSize.x && iPos.x - iSize.x < pPos.x + Player::COL_SIZE_X / 2 && pPos.y - Player::COL_SIZE_Y / 2 < iPos.y + iSize.y && iPos.y - iSize.y < pPos.y + Player::COL_SIZE_Y / 2) { items_.erase(items_.begin() + i); i--; return true; } } return false; } Vector2 GameScene::GetCameraPos(void) { return cameraPos_; } void GameScene::MoveCamera(Player* player) { //プレイヤー座標の取得 Vector2F playerPos = player->GetPos(); //カメラの左枠処理 //カメラの左側よりプレイヤーが進んだら if (playerPos.x < cameraPos_.x + 130) { //カメラの座標をプレイヤー座標にする cameraPos_.x = playerPos.x - 130; } //カメラに移る範囲の右側座標 int cameraRightSidePosX = cameraPos_.x + Application::SCREEN_SIZE_X - 130; //カメラの右枠処理 //カメラの右側よりプレイヤーが進んだら if (cameraRightSidePosX < playerPos.x && playerPos.x < Stage::CHIP_SIZE_X * Stage::MAP_GROUND_SIZE_X - 130) { //プレイヤーのX座標-画面サイズをカメラ座標にする cameraPos_.x = playerPos.x - Application::SCREEN_SIZE_X + 130; } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
IsCollisionItem関数のif文のなかに「items_.erase(items_.begin() + i);」配列の要素を削除するためのコードを書いたところ今回のエラーが発生しました、このコードをコメントアウトしたところ特にエラーが発生しなかったため原因はこの部分で間違いないと思います
補足
特になし
回答1件
あなたの回答
tips
プレビュー