質問編集履歴

6 提示コードを修正

退会済みユーザー

退会済みユーザー

2021/01/27 17:41  投稿

std::vector<> .erase()メソッドでデストラクタが呼ばれてる居るのにも関わらずメモリリークしてしまう原因が知りたい。
提示コードのPlayerクラスのUpdate()関数部ですがif()文の攻撃コメント部ですが。ここでpush_backしてその下のfor文で全部削除してデストラクタのprintf()が表示されてしっかりと廃棄されているはずなのですがなぜメモリリークしてしまうのでしょうか?またコピーコンストラクタもしっかり定義されておりデストラクタもしっかりdelete mSprite;と書いて居るのですがなぜでしょうか?
場所はBullet クラスのnew している部分で片方をコメントアウトしてもリークするので両方が原因と思うのですがどうすればいいのでしょうか?
![イメージ説明](7fa4a55fd4706f3c1a3025ab7d9c5576.jpeg)
環境 Windows 10 64 bit
```cpp
#include "../../Header/Game/Player.hpp"
// コンストラクタ
Player::Player(class Game* g,const char* fileName ) : Actor_2D()
{
   Owner = g;   //Game クラス
   mSprite = new Sprite(Owner,fileName);   // スプライトクラス
   mInput = new Input_Key(Owner);           // キー入力クラス
   mSpeed = SPEED;                           // 移動速度
   mVector = glm::vec2(0,1);               // 方向               
   
   mKeyCode = Key_Code::Up;
   // RIGHT
   mSpriteNum.at(0).at(0).at(0).x = 0;
   mSpriteNum.at(0).at(0).at(0).y = 0;
   mSpriteNum.at(0).at(0).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(0).x = 0;
   mSpriteNum.at(0).at(1).at(0).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).y = CELL * 2 - 1;
   // DOWN
   mSpriteNum.at(1).at(0).at(0).x = CELL;
   mSpriteNum.at(1).at(0).at(0).y = 1;
   mSpriteNum.at(1).at(0).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(1).at(1).at(0).x = CELL - 0;
   mSpriteNum.at(1).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(1).at(1).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(1).at(1).y = CELL * 2 - 1;
   // UP
   mSpriteNum.at(2).at(0).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(0).at(0).y = 1;
   mSpriteNum.at(2).at(0).at(1).x = CELL * 3;
   mSpriteNum.at(2).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(2).at(1).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(2).at(1).at(1).x = CELL * 3 - 1;
   mSpriteNum.at(2).at(1).at(1).y = CELL * 2 - 1;
   //   LEFT
   mSpriteNum.at(3).at(0).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(0).at(0).y = 1;
   mSpriteNum.at(3).at(0).at(1).x = CELL * 4;
   mSpriteNum.at(3).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(3).at(1).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(3).at(1).at(1).x = CELL * 4 - 1;
   mSpriteNum.at(3).at(1).at(1).y = CELL * 2 - 1;
}
// 計算
void Player::Update()
{
   // キー入力
   mSpeed = SPEED;
   if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true)
   {
       mVector.x = -1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Left;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true)
   {
       mVector.x = 1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Right;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_UP) == true)
   {
       mVector.x = 0.0f;
       mVector.y = 1.0f;
       mKeyCode = Key_Code::Up;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true)
   {
       mVector.x = 0.0f;
       mVector.y = -1.0f;
       mKeyCode = Key_Code::Down;
   }   
   else {
       mSpeed = 0;
   }
   // 攻撃
   if (mInput->KeyDownHold(GLFW_KEY_SPACE) == true)
   {
       bullet.push_back(Bullet(Owner, mPosition, mVector));
   }
   
   // 弾 更新
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       itr = bullet.erase(itr);
   }
   mPosition += mVector * mSpeed;   //実移動
}
// 描画
void Player::Draw()
{   
   mSprite->DrawGraph(mPosition, mSpriteNum.at((int)mKeyCode).at(1).at(0), mSpriteNum.at((int)mKeyCode).at(1).at(1));
}
// デストラクタ
Player::~Player()
{
}
```
```cpp
#include "../../Header/Game/Bullet.hpp"
#include "../../Header/Sprite.hpp"
// コンストラクタ
Bullet::Bullet(class Game* g,glm::vec2 pos,glm::vec2 vec) : Actor_2D()
{
   Owner = g;   //Game クラス
   mPosition = pos;   //座標
   mVector = vec;       //方向
   speed = 10;           //速度
   mSprite = new Sprite(g,"Assets/Bullet.png");   // スプライトクラス
}
// 計算
void Bullet::Update()
{
   mPosition.x += mVector.x * speed;
   mPosition.y += mVector.y * speed;
//   printf("mPosition.x: %f\n", mPosition.x);
//   printf("mPosition.y: %f\n",mPosition.y);
}
// 描画
void Bullet::Draw()
{
   glm::vec2 size = mSprite->getSize();
   mSprite->DrawGraph(mPosition,glm::vec2(0,1),glm::vec2(size.x,size.y));
}
glm::vec2 Bullet::getPosition()
{
   return mPosition;
}
// コピーコンストラクタ
Bullet::Bullet(const Bullet &b)
{
   printf("Bullet コピーコンストラクタ\n");
   
   mPosition = b.mPosition;
   mVector = b.mVector;
   speed = b.speed;
   Owner = b.Owner;
   
   mSprite = new Sprite(b.Owner, "Assets/Bullet.png");
   //mSprite = b.mSprite;
}
// デストラクタ
Bullet::~Bullet()
{
   printf("Bullet デストラクタ\n");
        delete mSprite;
   //printf("アドレス: %x\n",mSprite);
   mSprite = nullptr;
}
```
```
```cpp
#include "../Header/Sprite.hpp"
#include "../Header/Shader.hpp"
#include "../Header/Game.hpp"
#include "../Header/Texture.hpp"
#include "../Header/VertexData.hpp"
// 数学ライブラリ
#include "glm/ext.hpp"
#include "glm/glm.hpp"
// OpenCV
#include <opencv2/core.hpp>
class Game;
/*################################################################################################################
* 画像 描画クラス
################################################################################################################*/
//コンストラクタ
/*
* Game クラス
* テクスチャ パス
* 描画する画像の寸法
*/
Sprite::Sprite(class Game* g, const char* FileName) : Transform_2D(g)
{
   shader = new Shader(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag");
   Owner = g;//Gameクラス
   
   Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0));   //トランスフォームを初期化
   //テクスチャを設定   
   glGenTextures(1, &TextureID);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   float width = 0, height = 0;   //画像の寸法
   int channels = 0;               //画像のチャンネル数
   byte* data = LoadTexture(FileName,width,height,channels);   //テクスチャを取得
   
   mPicSize.x = width;
   mPicSize.y = height;
   //printf("widht: %f\n", width);
   //printf("height: %f\n", height);
   if (data != NULL)
   {
       if (channels == 3)
       {
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)width, (GLsizei)height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
       }
       else if (channels == 4)
       {
           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
       }
   }
   else {
       std::cerr << "Unable to load texture: " << FileName << std::endl;
   }
   
//   mSize = end - start;   //画像のサイズを取得
//   printf("width: %.2f\n", mSize.x);
//   printf("height: %.2f\n",mSize.y);
   /*
   vertex[0] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f,   0,0 };
   vertex[1] = VertexAttribute_2D{ -width / 2.0f,-height / 2.0f,   0,1 };
   vertex[2] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f,   1,1 };
   vertex[3] = VertexAttribute_2D{ -width / 2.0f,height / 2.0f,   0,0 };
   vertex[4] = VertexAttribute_2D{ width / 2.0f,-height / 2.0f,   1,1 };
   vertex[5] = VertexAttribute_2D{ width / 2.0f,height / 2.0f,   1,0 };
   */
   /*
   *
   // 頂点情報を設定
   vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * uvWidth,start.y * uvHeight };
   vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f,   start.x * uvWidth,end.y * uvHeight };
   vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * uvWidth,end.y * uvHeight };
   vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,   start.x * uvWidth,start.y * uvHeight };
   vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,   end.x * uvWidth,end.y * uvHeight };
   vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f,       end.x * uvWidth,start.y * uvHeight };
   */
   //VAO
   //ミニマップを設定
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
   glGenerateMipmap(GL_TEXTURE_2D);
   //異方性フィルタリングを設定
   GLfloat largest;
   glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest);
   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest);
   delete data;
   data = nullptr;
}
//描画
void Sprite::DrawGraph(glm::vec2 pos, glm::vec2 start, glm::vec2 end)
{
   Transform_2D::UpdateTransform();       //トランスフォームを更新
   Transform_2D::setTransform_Move(pos);   //移動
   shader->Enable();   //シェーダーを有効にする
   shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix());
   shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix());
   glm::vec2 mSize;   
   mSize = end - start;   //画像のサイズを取得
//   printf("mSize.x %f\n", mSize.x);
//`   printf("start.x. x%f\n", end.x);
   // 頂点情報を設定
   vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,       start.x / mPicSize.x  ,start.y / mPicSize.y };
//   printf("%f\n", start.y / mSize.y);
   vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f,   start.x / mPicSize.x  ,end.y / mPicSize.y };
   vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,       end.x / mPicSize.x    ,end.y / mPicSize.y };
   vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f,       start.x / mPicSize.x ,start.y / mPicSize.y };
   vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f,       end.x / mPicSize.x   ,end.y / mPicSize.y };
   vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f,       end.x / mPicSize.x   ,start.y / mPicSize.y };
   //VAO
   glGenVertexArrays(1, &VAO);
   glBindVertexArray(VAO);
   //VBO
   glGenBuffers(1, &VBO);
   glBindBuffer(GL_ARRAY_BUFFER, VBO);
   glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW);
   //頂点座標
   glEnableVertexAttribArray(0);
   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL);
   //UV座標
   glEnableVertexAttribArray(1);
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2));
   
   glBindVertexArray(VAO);
   glBindTexture(GL_TEXTURE_2D, TextureID);
   glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex));   
   // バッファを解放
   glDeleteBuffers(1,&VAO);
   glDeleteVertexArrays(1,&VAO);
   glBindVertexArray(0);
   glBindTexture(GL_TEXTURE_2D, 0);
}
// 画像サイズを取得
glm::vec2 Sprite::getSize()
{
   return mPicSize;
}
```
  • C++

    8565 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

5 文章を修正

退会済みユーザー

退会済みユーザー

2021/01/27 17:22  投稿

std::vector<> .erase()メソッドでデストラクタが呼ばれてる居るのにも関わらずメモリリークしてしまう原因が知りたい。
提示コードのPlayerクラスのUpdate()関数部ですがif()文の攻撃コメント部ですが。ここでpush_backしてその下のfor文で全部削除してデストラクタのprintf()が表示されてしっかりと廃棄されているはずなのですがなぜメモリリークしてしまうのでしょうか?またコピーコンストラクタもしっかり定義されておりデストラクタもしっかりdelete mSprite;と書いて居るのですがなぜでしょうか?
場所はBullet クラスのnew している部分で片方をコメントアウトしてもリークするので両方が原因と思うのですがどうすればいいのでしょうか?  
![イメージ説明](7fa4a55fd4706f3c1a3025ab7d9c5576.jpeg)
環境 Windows 10 64 bit
```cpp
#include "../../Header/Game/Player.hpp"
// コンストラクタ
Player::Player(class Game* g,const char* fileName ) : Actor_2D()
{
   Owner = g;   //Game クラス
   mSprite = new Sprite(Owner,fileName);   // スプライトクラス
   mInput = new Input_Key(Owner);           // キー入力クラス
   mSpeed = SPEED;                           // 移動速度
   mVector = glm::vec2(0,1);               // 方向               
   
   mKeyCode = Key_Code::Up;
   // RIGHT
   mSpriteNum.at(0).at(0).at(0).x = 0;
   mSpriteNum.at(0).at(0).at(0).y = 0;
   mSpriteNum.at(0).at(0).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(0).x = 0;
   mSpriteNum.at(0).at(1).at(0).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).y = CELL * 2 - 1;
   // DOWN
   mSpriteNum.at(1).at(0).at(0).x = CELL;
   mSpriteNum.at(1).at(0).at(0).y = 1;
   mSpriteNum.at(1).at(0).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(1).at(1).at(0).x = CELL - 0;
   mSpriteNum.at(1).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(1).at(1).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(1).at(1).y = CELL * 2 - 1;
   // UP
   mSpriteNum.at(2).at(0).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(0).at(0).y = 1;
   mSpriteNum.at(2).at(0).at(1).x = CELL * 3;
   mSpriteNum.at(2).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(2).at(1).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(2).at(1).at(1).x = CELL * 3 - 1;
   mSpriteNum.at(2).at(1).at(1).y = CELL * 2 - 1;
   //   LEFT
   mSpriteNum.at(3).at(0).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(0).at(0).y = 1;
   mSpriteNum.at(3).at(0).at(1).x = CELL * 4;
   mSpriteNum.at(3).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(3).at(1).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(3).at(1).at(1).x = CELL * 4 - 1;
   mSpriteNum.at(3).at(1).at(1).y = CELL * 2 - 1;
}
// 計算
void Player::Update()
{
   // キー入力
   mSpeed = SPEED;
   if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true)
   {
       mVector.x = -1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Left;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true)
   {
       mVector.x = 1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Right;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_UP) == true)
   {
       mVector.x = 0.0f;
       mVector.y = 1.0f;
       mKeyCode = Key_Code::Up;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true)
   {
       mVector.x = 0.0f;
       mVector.y = -1.0f;
       mKeyCode = Key_Code::Down;
   }   
   else {
       mSpeed = 0;
   }
   // 攻撃
   if (mInput->KeyDownHold(GLFW_KEY_SPACE) == true)
   {
       bullet.push_back(Bullet(Owner, mPosition, mVector));
   }
   
   // 弾 更新
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       itr = bullet.erase(itr);
   }
   mPosition += mVector * mSpeed;   //実移動
}
// 描画
void Player::Draw()
{   
   mSprite->DrawGraph(mPosition, mSpriteNum.at((int)mKeyCode).at(1).at(0), mSpriteNum.at((int)mKeyCode).at(1).at(1));
}
// デストラクタ
Player::~Player()
{
}
```
```cpp
#include "../../Header/Game/Bullet.hpp"
#include "../../Header/Sprite.hpp"
// コンストラクタ
Bullet::Bullet(class Game* g,glm::vec2 pos,glm::vec2 vec) : Actor_2D()
{
   Owner = g;   //Game クラス
   mPosition = pos;   //座標
   mVector = vec;       //方向
   speed = 10;           //速度
   mSprite = new Sprite(g,"Assets/Bullet.png");   // スプライトクラス
}
// 計算
void Bullet::Update()
{
   mPosition.x += mVector.x * speed;
   mPosition.y += mVector.y * speed;
//   printf("mPosition.x: %f\n", mPosition.x);
//   printf("mPosition.y: %f\n",mPosition.y);
}
// 描画
void Bullet::Draw()
{
   glm::vec2 size = mSprite->getSize();
   mSprite->DrawGraph(mPosition,glm::vec2(0,1),glm::vec2(size.x,size.y));
}
glm::vec2 Bullet::getPosition()
{
   return mPosition;
}
// コピーコンストラクタ
Bullet::Bullet(const Bullet &b)
{
   printf("Bullet コピーコンストラクタ\n");
   
   mPosition = b.mPosition;
   mVector = b.mVector;
   speed = b.speed;
   Owner = b.Owner;
   
   mSprite = new Sprite(b.Owner, "Assets/Bullet.png");
   //mSprite = b.mSprite;
}
// デストラクタ
Bullet::~Bullet()
{
   printf("Bullet デストラクタ\n");
        delete mSprite;
   //printf("アドレス: %x\n",mSprite);
   mSprite = nullptr;
}
```
  • C++

    8565 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

4 提示画像を追加

退会済みユーザー

退会済みユーザー

2021/01/27 16:07  投稿

std::vector<> .erase()メソッドでデストラクタが呼ばれてる居るのにも関わらずメモリリークしてしまう原因が知りたい。
提示コードのPlayerクラスのUpdate()関数部ですがif()文の攻撃コメント部ですが。ここでpush_backしてその下のfor文で全部削除してデストラクタのprintf()が表示されてしっかりと廃棄されているはずなのですがなぜメモリリークしてしまうのでしょうか?またコピーコンストラクタもしっかり定義されておりデストラクタもしっかりdelete mSprite;と書いて居るのですがなぜでしょうか?
![イメージ説明](7fa4a55fd4706f3c1a3025ab7d9c5576.jpeg)
環境 Windows 10 64 bit
```cpp
#include "../../Header/Game/Player.hpp"
// コンストラクタ
Player::Player(class Game* g,const char* fileName ) : Actor_2D()
{
   Owner = g;   //Game クラス
   mSprite = new Sprite(Owner,fileName);   // スプライトクラス
   mInput = new Input_Key(Owner);           // キー入力クラス
   mSpeed = SPEED;                           // 移動速度
   mVector = glm::vec2(0,1);               // 方向               
   
   mKeyCode = Key_Code::Up;
   // RIGHT
   mSpriteNum.at(0).at(0).at(0).x = 0;
   mSpriteNum.at(0).at(0).at(0).y = 0;
   mSpriteNum.at(0).at(0).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(0).x = 0;
   mSpriteNum.at(0).at(1).at(0).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).y = CELL * 2 - 1;
   // DOWN
   mSpriteNum.at(1).at(0).at(0).x = CELL;
   mSpriteNum.at(1).at(0).at(0).y = 1;
   mSpriteNum.at(1).at(0).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(1).at(1).at(0).x = CELL - 0;
   mSpriteNum.at(1).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(1).at(1).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(1).at(1).y = CELL * 2 - 1;
   // UP
   mSpriteNum.at(2).at(0).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(0).at(0).y = 1;
   mSpriteNum.at(2).at(0).at(1).x = CELL * 3;
   mSpriteNum.at(2).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(2).at(1).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(2).at(1).at(1).x = CELL * 3 - 1;
   mSpriteNum.at(2).at(1).at(1).y = CELL * 2 - 1;
   //   LEFT
   mSpriteNum.at(3).at(0).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(0).at(0).y = 1;
   mSpriteNum.at(3).at(0).at(1).x = CELL * 4;
   mSpriteNum.at(3).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(3).at(1).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(3).at(1).at(1).x = CELL * 4 - 1;
   mSpriteNum.at(3).at(1).at(1).y = CELL * 2 - 1;
}
// 計算
void Player::Update()
{
   // キー入力
   mSpeed = SPEED;
   if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true)
   {
       mVector.x = -1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Left;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true)
   {
       mVector.x = 1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Right;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_UP) == true)
   {
       mVector.x = 0.0f;
       mVector.y = 1.0f;
       mKeyCode = Key_Code::Up;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true)
   {
       mVector.x = 0.0f;
       mVector.y = -1.0f;
       mKeyCode = Key_Code::Down;
   }   
   else {
       mSpeed = 0;
   }
   // 攻撃
   if (mInput->KeyDownHold(GLFW_KEY_SPACE) == true)
   {
       bullet.push_back(Bullet(Owner, mPosition, mVector));
   }
   
   // 弾 更新
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       itr = bullet.erase(itr);
   }
   mPosition += mVector * mSpeed;   //実移動
}
// 描画
void Player::Draw()
{   
   mSprite->DrawGraph(mPosition, mSpriteNum.at((int)mKeyCode).at(1).at(0), mSpriteNum.at((int)mKeyCode).at(1).at(1));
}
// デストラクタ
Player::~Player()
{
}
```
```cpp
#include "../../Header/Game/Bullet.hpp"
#include "../../Header/Sprite.hpp"
// コンストラクタ
Bullet::Bullet(class Game* g,glm::vec2 pos,glm::vec2 vec) : Actor_2D()
{
   Owner = g;   //Game クラス
   mPosition = pos;   //座標
   mVector = vec;       //方向
   speed = 10;           //速度
   mSprite = new Sprite(g,"Assets/Bullet.png");   // スプライトクラス
}
// 計算
void Bullet::Update()
{
   mPosition.x += mVector.x * speed;
   mPosition.y += mVector.y * speed;
//   printf("mPosition.x: %f\n", mPosition.x);
//   printf("mPosition.y: %f\n",mPosition.y);
}
// 描画
void Bullet::Draw()
{
   glm::vec2 size = mSprite->getSize();
   mSprite->DrawGraph(mPosition,glm::vec2(0,1),glm::vec2(size.x,size.y));
}
glm::vec2 Bullet::getPosition()
{
   return mPosition;
}
// コピーコンストラクタ
Bullet::Bullet(const Bullet &b)
{
   printf("Bullet コピーコンストラクタ\n");
   
   mPosition = b.mPosition;
   mVector = b.mVector;
   speed = b.speed;
   Owner = b.Owner;
   
   mSprite = new Sprite(b.Owner, "Assets/Bullet.png");
   //mSprite = b.mSprite;
}
// デストラクタ
Bullet::~Bullet()
{
   printf("Bullet デストラクタ\n");
        delete mSprite;
   //printf("アドレス: %x\n",mSprite);
   mSprite = nullptr;
}
```
  • C++

    8565 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

3 文章とタイトルを大幅に変更しました。

退会済みユーザー

退会済みユーザー

2021/01/27 15:41  投稿

デスストラクタでアクセスエラーが発生する原因が知りたい。
std::vector<> .erase()メソッドでデストラクタが呼ばれてる居るのにも関わらずメモリリークしてしまう原因が知りたい。
提示コードの////コメント内部のコードですがなぜてアクセスエラーが出るのでしょうか?
Player クラスの攻撃コメント部でpush_backして居るのですがどこが悪いのでしょうか?どうしてもわかりません。。しっかかりコピーコンストラクタを用意しているのですがなぜでしょうか?
Github: https://github.com/Shigurechan/OpenGL
提示コードのPlayerクラスのUpdate()関数部ですがif()文の攻撃コメント部ですが。ここでpush_backしてその下のfor文で全部削除してデストラクタのprintf()が表示されてしっかりと廃棄されているはずなのですがなぜメモリリークしてしまうのでしょうか?またコピーコンストラクタもしっかり定義されておりデストラクタもしっかりdelete mSprite;と書いて居るのですがなぜでしょうか?
環境 Windows 10 64 bit
```cpp
#include "../../Header/Game/Player.hpp"
 
 
// コンストラクタ
Player::Player(class Game* g,const char* fileName ) : Actor_2D()
{
   Owner = g;   //Game クラス
   mSprite = new Sprite(Owner,fileName);   // スプライトクラス
   mInput = new Input_Key(Owner);           // キー入力クラス
   mSpeed = SPEED;                           // 移動速度
   mVector = glm::vec2(0,1);               // 方向               
   
   mKeyCode = Key_Code::Up;
   // RIGHT
   mSpriteNum.at(0).at(0).at(0).x = 0;
   mSpriteNum.at(0).at(0).at(0).y = 0;
   mSpriteNum.at(0).at(0).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(0).x = 0;
   mSpriteNum.at(0).at(1).at(0).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).y = CELL * 2 - 1;
   // DOWN
   mSpriteNum.at(1).at(0).at(0).x = CELL;
   mSpriteNum.at(1).at(0).at(0).y = 1;
   mSpriteNum.at(1).at(0).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(1).at(1).at(0).x = CELL - 0;
   mSpriteNum.at(1).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(1).at(1).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(1).at(1).y = CELL * 2 - 1;
   // UP
   mSpriteNum.at(2).at(0).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(0).at(0).y = 1;
   mSpriteNum.at(2).at(0).at(1).x = CELL * 3;
   mSpriteNum.at(2).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(2).at(1).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(2).at(1).at(1).x = CELL * 3 - 1;
   mSpriteNum.at(2).at(1).at(1).y = CELL * 2 - 1;
   //   LEFT
   mSpriteNum.at(3).at(0).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(0).at(0).y = 1;
   mSpriteNum.at(3).at(0).at(1).x = CELL * 4;
   mSpriteNum.at(3).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(3).at(1).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(3).at(1).at(1).x = CELL * 4 - 1;
   mSpriteNum.at(3).at(1).at(1).y = CELL * 2 - 1;
}
// 計算
void Player::Update()
{
   // キー入力
   mSpeed = SPEED;
   if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true)
   {
       mVector.x = -1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Left;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true)
   {
       mVector.x = 1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Right;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_UP) == true)
   {
       mVector.x = 0.0f;
       mVector.y = 1.0f;
       mKeyCode = Key_Code::Up;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true)
   {
       mVector.x = 0.0f;
       mVector.y = -1.0f;
       mKeyCode = Key_Code::Down;
   }   
   else {
       mSpeed = 0;
   }
   // 攻撃
   if (mInput->KeyDown(GLFW_KEY_SPACE) == true)
   {
   //   Bullet b(Owner, mPosition, mVector);
   if (mInput->KeyDownHold(GLFW_KEY_SPACE) == true)
   {
       bullet.push_back(Bullet(Owner, mPosition, mVector));
   }
   
   // 弾 更新
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       if (itr->getPosition().x > Owner->getWindowSize().x)
       {
           printf("あああ\n");
   
           itr = bullet.erase(itr);
       }
       else {
           printf("いいいい\n");
           itr->Update();
           itr++;
       }
   }
       itr = bullet.erase(itr);
   }
   mPosition += mVector * mSpeed;   //実移動
}
// 描画
void Player::Draw()
{
   
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       itr->Draw();
       itr++;
   }
   
{   
   mSprite->DrawGraph(mPosition, mSpriteNum.at((int)mKeyCode).at(1).at(0), mSpriteNum.at((int)mKeyCode).at(1).at(1));
}
// デストラクタ
Player::~Player()
{
}
```
```cpp
#include "../../Header/Game/Bullet.hpp"
#include "../../Header/Sprite.hpp"
// コンストラクタ
Bullet::Bullet(class Game* g,glm::vec2 pos,glm::vec2 vec) : Actor_2D()
{
   Owner = g;   //Game クラス
   mPosition = pos;   //座標
   mVector = vec;       //方向
   speed = 10;           //速度
   mSprite = new Sprite(g,"Assets/Bullet.png");   // スプライトクラス
}
// 計算
void Bullet::Update()
{
   mPosition.x += mVector.x * speed;
   mPosition.y += mVector.y * speed;
//   printf("mPosition.x: %f\n", mPosition.x);
//   printf("mPosition.y: %f\n",mPosition.y);
}
// 描画
void Bullet::Draw()
{
   glm::vec2 size = mSprite->getSize();
   mSprite->DrawGraph(mPosition,glm::vec2(0,1),glm::vec2(size.x,size.y));
}
glm::vec2 Bullet::getPosition()
{
   return mPosition;
}
////////////////////////////////////////////////////////////////
//
// コピーコンストラクタ
Bullet::Bullet(const Bullet &b)
{
   printf("Bullet コピーコンストラクタ\n");
   
   mPosition = b.mPosition;
   mVector = b.mVector;
   speed = b.speed;
   mSprite = new Sprite(Owner,"Assets/Bullet.png");
   Owner = b.Owner;
   
   mSprite = new Sprite(b.Owner, "Assets/Bullet.png");
   //mSprite = b.mSprite;
}
// デストラクタ
Bullet::~Bullet()
{
   printf("Bullet デストラクタ\n");
   delete mSprite;
        delete mSprite;
   //printf("アドレス: %x\n",mSprite);
   mSprite = nullptr;
}
////////////////////////////////////////////////////////////////
```
```
  • C++

    8565 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2 文章を修正

退会済みユーザー

退会済みユーザー

2021/01/27 14:21  投稿

デスストラクタでアクセスエラーが発生する原因が知りたい。
提示コードの////コメント内部のコードですがなぜてアクセスエラーが出るのでしょうか?
Player クラスの攻撃コメント部でpush_backして居るのですがどこが悪いのでしょうか?どうしてもわかりません。。しっかかりコピーコンストラクタを用意しているのですがなぜでしょうか?
Github: https://github.com/Shigurechan/OpenGL
```cpp
#include "../../Header/Game/Player.hpp"
// コンストラクタ
Player::Player(class Game* g,const char* fileName ) : Actor_2D()
{
   Owner = g;   //Game クラス
   mSprite = new Sprite(Owner,fileName);   // スプライトクラス
   mInput = new Input_Key(Owner);           // キー入力クラス
   mSpeed = SPEED;                           // 移動速度
   mVector = glm::vec2(0,1);               // 方向               
   
   mKeyCode = Key_Code::Up;
   // RIGHT
   mSpriteNum.at(0).at(0).at(0).x = 0;
   mSpriteNum.at(0).at(0).at(0).y = 0;
   mSpriteNum.at(0).at(0).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(0).x = 0;
   mSpriteNum.at(0).at(1).at(0).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).y = CELL * 2 - 1;
   // DOWN
   mSpriteNum.at(1).at(0).at(0).x = CELL;
   mSpriteNum.at(1).at(0).at(0).y = 1;
   mSpriteNum.at(1).at(0).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(1).at(1).at(0).x = CELL - 0;
   mSpriteNum.at(1).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(1).at(1).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(1).at(1).y = CELL * 2 - 1;
   // UP
   mSpriteNum.at(2).at(0).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(0).at(0).y = 1;
   mSpriteNum.at(2).at(0).at(1).x = CELL * 3;
   mSpriteNum.at(2).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(2).at(1).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(2).at(1).at(1).x = CELL * 3 - 1;
   mSpriteNum.at(2).at(1).at(1).y = CELL * 2 - 1;
   //   LEFT
   mSpriteNum.at(3).at(0).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(0).at(0).y = 1;
   mSpriteNum.at(3).at(0).at(1).x = CELL * 4;
   mSpriteNum.at(3).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(3).at(1).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(3).at(1).at(1).x = CELL * 4 - 1;
   mSpriteNum.at(3).at(1).at(1).y = CELL * 2 - 1;
}
// 計算
void Player::Update()
{
   // キー入力
   mSpeed = SPEED;
   if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true)
   {
       mVector.x = -1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Left;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true)
   {
       mVector.x = 1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Right;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_UP) == true)
   {
       mVector.x = 0.0f;
       mVector.y = 1.0f;
       mKeyCode = Key_Code::Up;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true)
   {
       mVector.x = 0.0f;
       mVector.y = -1.0f;
       mKeyCode = Key_Code::Down;
   }   
   else {
       mSpeed = 0;
   }
   // 攻撃
   if (mInput->KeyDown(GLFW_KEY_SPACE) == true)
   {
   //   Bullet b(Owner, mPosition, mVector);
       bullet.push_back(Bullet(Owner, mPosition, mVector));
   }
   // 弾 更新
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       if (itr->getPosition().x > Owner->getWindowSize().x)
       {
           printf("あああ\n");
   
           itr = bullet.erase(itr);
       }
       else {
           printf("いいいい\n");
           itr->Update();
           itr++;
       }
   }
   mPosition += mVector * mSpeed;   //実移動
}
// 描画
void Player::Draw()
{
   
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       itr->Draw();
       itr++;
   }
   
   mSprite->DrawGraph(mPosition, mSpriteNum.at((int)mKeyCode).at(1).at(0), mSpriteNum.at((int)mKeyCode).at(1).at(1));
}
// デストラクタ
Player::~Player()
{
}
```
```cpp
#include "../../Header/Game/Bullet.hpp"
#include "../../Header/Sprite.hpp"
// コンストラクタ
Bullet::Bullet(class Game* g,glm::vec2 pos,glm::vec2 vec) : Actor_2D()
{
   Owner = g;   //Game クラス
   mPosition = pos;   //座標
   mVector = vec;       //方向
   speed = 10;           //速度
   mSprite = new Sprite(g,"Assets/Bullet.png");   // スプライトクラス
}
// 計算
void Bullet::Update()
{
   mPosition.x += mVector.x * speed;
   mPosition.y += mVector.y * speed;
//   printf("mPosition.x: %f\n", mPosition.x);
//   printf("mPosition.y: %f\n",mPosition.y);
}
// 描画
void Bullet::Draw()
{
   glm::vec2 size = mSprite->getSize();
   mSprite->DrawGraph(mPosition,glm::vec2(0,1),glm::vec2(size.x,size.y));
}
glm::vec2 Bullet::getPosition()
{
   return mPosition;
}
////////////////////////////////////////////////////////////////
//
Bullet::Bullet(const Bullet &b)
{
   printf("Bullet コピーコンストラクタ\n");
   
   mPosition = b.mPosition;
   mVector = b.mVector;
   speed = b.speed;
   mSprite = new Sprite(Owner,"Assets/Bullet.png");
}
// デストラクタ
Bullet::~Bullet()
{
   printf("Bullet デストラクタ\n");
   delete mSprite;
   mSprite = nullptr;
}
////////////////////////////////////////////////////////////////
```
  • C++

    8565 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1 文章を修正

退会済みユーザー

退会済みユーザー

2021/01/27 13:29  投稿

提示コードの////コメント内部のコードですがなぜてアクセスエラーが出るのでしょうか?
Player クラスの攻撃コメント部でpush_backして居るのですがどこが悪いのでしょうか?どうしてもわかりません。。しっかかりコピーコンストラクタを用意しているのですがなぜでしょうか?
```cpp
#include "../../Header/Game/Player.hpp"
// コンストラクタ
Player::Player(class Game* g,const char* fileName ) : Actor_2D()
{
   Owner = g;   //Game クラス
   mSprite = new Sprite(Owner,fileName);   // スプライトクラス
   mInput = new Input_Key(Owner);           // キー入力クラス
   mSpeed = SPEED;                           // 移動速度
   mVector = glm::vec2(0,1);               // 方向               
   
   mKeyCode = Key_Code::Up;
   // RIGHT
   mSpriteNum.at(0).at(0).at(0).x = 0;
   mSpriteNum.at(0).at(0).at(0).y = 0;
   mSpriteNum.at(0).at(0).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(0).x = 0;
   mSpriteNum.at(0).at(1).at(0).y = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).x = CELL - 1;
   mSpriteNum.at(0).at(1).at(1).y = CELL * 2 - 1;
   // DOWN
   mSpriteNum.at(1).at(0).at(0).x = CELL;
   mSpriteNum.at(1).at(0).at(0).y = 1;
   mSpriteNum.at(1).at(0).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(1).at(1).at(0).x = CELL - 0;
   mSpriteNum.at(1).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(1).at(1).at(1).x = CELL * 2 - 1;
   mSpriteNum.at(1).at(1).at(1).y = CELL * 2 - 1;
   // UP
   mSpriteNum.at(2).at(0).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(0).at(0).y = 1;
   mSpriteNum.at(2).at(0).at(1).x = CELL * 3;
   mSpriteNum.at(2).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(2).at(1).at(0).x = CELL * 2 + 1;
   mSpriteNum.at(2).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(2).at(1).at(1).x = CELL * 3 - 1;
   mSpriteNum.at(2).at(1).at(1).y = CELL * 2 - 1;
   //   LEFT
   mSpriteNum.at(3).at(0).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(0).at(0).y = 1;
   mSpriteNum.at(3).at(0).at(1).x = CELL * 4;
   mSpriteNum.at(3).at(0).at(1).y = CELL - 1;
   mSpriteNum.at(3).at(1).at(0).x = CELL * 3 + 1;
   mSpriteNum.at(3).at(1).at(0).y = CELL + 1;
   mSpriteNum.at(3).at(1).at(1).x = CELL * 4 - 1;
   mSpriteNum.at(3).at(1).at(1).y = CELL * 2 - 1;
}
// 計算
void Player::Update()
{
   // キー入力
   mSpeed = SPEED;
   if (mInput->KeyDownHold(GLFW_KEY_LEFT) == true)
   {
       mVector.x = -1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Left;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_RIGHT) == true)
   {
       mVector.x = 1.0f;
       mVector.y = 0.0f;
       mKeyCode = Key_Code::Right;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_UP) == true)
   {
       mVector.x = 0.0f;
       mVector.y = 1.0f;
       mKeyCode = Key_Code::Up;
   }
   else if (mInput->KeyDownHold(GLFW_KEY_DOWN) == true)
   {
       mVector.x = 0.0f;
       mVector.y = -1.0f;
       mKeyCode = Key_Code::Down;
   }   
   else {
       mSpeed = 0;
   }
   // 攻撃
   if (mInput->KeyDown(GLFW_KEY_SPACE) == true)
   {
   //   Bullet b(Owner, mPosition, mVector);
       bullet.push_back(Bullet(Owner, mPosition, mVector));
   }
   // 弾 更新
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       if (itr->getPosition().x > Owner->getWindowSize().x)
       {
           printf("あああ\n");
   
           itr = bullet.erase(itr);
       }
       else {
           printf("いいいい\n");
           itr->Update();
           itr++;
       }
   }
   mPosition += mVector * mSpeed;   //実移動
}
// 描画
void Player::Draw()
{
   
   for (std::vector<Bullet>::iterator itr = bullet.begin(); itr != bullet.end(); )
   {
       itr->Draw();
       itr++;
   }
   
   mSprite->DrawGraph(mPosition, mSpriteNum.at((int)mKeyCode).at(1).at(0), mSpriteNum.at((int)mKeyCode).at(1).at(1));
}
// デストラクタ
Player::~Player()
{
}
```
```cpp
#include "../../Header/Game/Bullet.hpp"
#include "../../Header/Sprite.hpp"
// コンストラクタ
Bullet::Bullet(class Game* g,glm::vec2 pos,glm::vec2 vec) : Actor_2D()
{
   Owner = g;   //Game クラス
   mPosition = pos;   //座標
   mVector = vec;       //方向
   speed = 10;           //速度
   mSprite = new Sprite(g,"Assets/Bullet.png");   // スプライトクラス
}
// 計算
void Bullet::Update()
{
   mPosition.x += mVector.x * speed;
   mPosition.y += mVector.y * speed;
//   printf("mPosition.x: %f\n", mPosition.x);
//   printf("mPosition.y: %f\n",mPosition.y);
}
// 描画
void Bullet::Draw()
{
   glm::vec2 size = mSprite->getSize();
   mSprite->DrawGraph(mPosition,glm::vec2(0,1),glm::vec2(size.x,size.y));
}
glm::vec2 Bullet::getPosition()
{
   return mPosition;
}
////////////////////////////////////////////////////////////////
//
Bullet::Bullet(const Bullet &b)
{
   printf("Bullet コピーコンストラクタ\n");
   
   mPosition = b.mPosition;
   mVector = b.mVector;
   speed = b.speed;
   mSprite = new Sprite(Owner,"Assets/Bullet.png");
}
//////////////////////////////////////////////////////////////
// デストラクタ
Bullet::~Bullet()
{
   printf("Bullet デストラクタ\n");
   delete mSprite;
   mSprite = nullptr;
}
////////////////////////////////////////////////////////////////
```
  • C++

    8565 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る