現状 [ 使い方はプレイヤークラス等のこのCollisionクラス変数を作ってプレイヤーの座標の変数のアドレスを変数に設定して
player->mCollision(enemy->mCollision);とすることで当たり判定の判定を隠してシンプルに位置を修正できます。 ]
問題 「 例えばenemy をベクターにした場合コピーコンストラクタでコピーされるためエネミー座標のアドレスを格納している変数が無効なアドレスになっています。現状これをUpdate();関数で毎フレーム設定することで修正しますがあまりい修正方法とは思えません。 」
やりたいこと「 どうすれば実装を隠した状態でやつコピーコンストラクタが動いても正常に座標を修正出来るのか知りたい。 」
Github: https://github.com/Shigurechan/Dungeon_Game/tree/43ddb23595d0b3498279c1b5c2acc2028521333b
cpp
1 //背景を初期化 2 for (int y = 0; y < STAGE_SIZE_HEIGHT; y++) 3 { 4 for (int x = 0; x < STAGE_SIZE_WIDTH; x++) 5 { 6 byte b = backStageBin.at(y * STAGE_SIZE_WIDTH + x); 7 //printf("%x\n",b); 8 switch (b) 9 { 10 //wall 11 case (int)BinType::Wall: 12 { 13 //std::cout << "あああ" << std::endl; 14 backStage->push_back(MapObject(windowContext, glm::vec2(x * CELL, y * CELL), uvSize.at((int)b), MapObject::ObjectType::Wall)); 15 backStage->back().setPosition(glm::vec2(x * CELL, y * CELL)); 16 } 17 break; 18 19 20 // 21 case (int)BinType::Ground_a: 22 { 23 //std::cout << "あああ" << std::endl; 24 backStage->push_back(MapObject(windowContext, glm::vec2(x * CELL, y * CELL), uvSize.at((int)b), MapObject::ObjectType::Ground)); 25 backStage->back().setPosition(glm::vec2(x * CELL, y * CELL)); 26 27 } 28 break; 29 30 31 // 32 case (int)BinType::Ground_b: 33 { 34 //std::cout << "あああ" << std::endl; 35 backStage->push_back(MapObject(windowContext, glm::vec2(x * CELL, y * CELL), uvSize.at((int)b), MapObject::ObjectType::Ground)); 36 backStage->back().setPosition(glm::vec2(x * CELL, y * CELL)); 37 38 } 39 break; 40 } 41 } 42 } 43
cpp
1#include "Collision.hpp" 2 3//コンストラクタ 4Collision::Collision(glm::vec2 s, bool frag) 5{ 6 size = s; 7 position = NULL; 8 isTrigger = frag; 9 speed = glm::vec2(0,0); 10 11} 12 13//判定を移動 14void Collision::setPosition(glm::vec2 *pos) 15{ 16 position = pos; 17} 18 19//判定サイズを変更 20void Collision::setSize(glm::vec2 s) 21{ 22 size = s; 23} 24 25//トリガータイプを変更 26void Collision::TriggerType(bool frag) 27{ 28 isTrigger = frag; 29} 30 31 32//当たり判定 33bool Collision::Intersect(std::shared_ptr<Collision> col) 34{ 35 36 //std::cout << col.getSize().x << std::endl; 37 //std::cout <<"ああああ: "<< col->getPosition().x << std::endl; 38 39 if (((col->getPosition().x + col->getSize().x) > position->x) && (col->getPosition().x < (position->x + size.x)) && 40 ((col->getPosition().y + col->getSize().y) > position->y) && (col->getPosition().y < (position->y + size.y))) 41 { 42 std::cout << "Collision !" << std::endl; 43 44 if (col->getTriggerType() == false) 45 { 46 glm::vec2 pos = *position + glm::vec2(CELL / 2, CELL / 2); //自分 47 glm::vec2 opponent = col->getPosition() + glm::vec2(CELL / 2, CELL / 2); //相手 48 49 const float vecX = pos.x - opponent.x; //負の値なら自分が左側 50 const float vecY = pos.y - opponent.y; //正の値なら自分が下側 51 52 //めり込み量の大きい方を補正する 53 if (std::abs(vecX) < std::abs(vecY)) 54 { 55 if (vecY > 0) 56 { 57 position->y = col->getPosition().y + col->getSize().y; 58 } 59 else if (vecY < 0) 60 { 61 position->y = col->getPosition().y - size.y; 62 } 63 } 64 else 65 { 66 if (vecX > 0) 67 { 68 position->x = col->getPosition().x + col->getSize().x; 69 } 70 else if (vecX < 0) 71 { 72 position->x = col->getPosition().x - size.x; 73 } 74 } 75 76 return true; 77 } 78 else 79 { 80 return true; 81 } 82 } 83 else { 84 return false; 85 } 86} 87 88 89//座標を取得 90glm::vec2 Collision::getPosition() 91{ 92 return *position; 93} 94 95//サイズを取得 96glm::vec2 Collision::getSize() 97{ 98 return size; 99} 100 101//トリガータイプを取得 102bool Collision::getTriggerType() 103{ 104 return isTrigger; 105} 106 107//移動速度設定 108void Collision::setSpeed(glm::vec2 s) 109{ 110 speed = s; 111} 112 113//移動速度取得 114glm::vec2 Collision::getSpeed() 115{ 116 return speed; 117} 118 119 120 121//デストラクタ 122Collision::~Collision() 123{ 124 125} 126
文章を修正しました。
> 現状 []
> 問題 「」
> やりたいこと「」
上記のように括弧書きするぐらいなら、改行で区切るかMarkdownを使って書いてください