提示画像ですが当たり判定がズレてしまう原因がどうしてもわかりません。当たり判定の範囲がCELL,CELLの時は正常に当たり判定出来るのですが
CELL / 2のときになると当たり判定がズレてしまいます。これはどうすればいいのでしょうか?
プレイヤーとブロックと当たり判定のコードを確認しましたが大きさが変わっただけおかしくなる原因がわかりません。
画面左上が0,0になるように描画原点を修正しています。
CELLL 64
プレヤーCELL,CELL
ブロック CELL /2 , CELL / 2
cpp
1#include "../../Header/Game/Scene.hpp" 2#include <array> 3 4 5Scene::Scene(Entry * e) 6{ 7 Owner = e; 8 9 std::shared_ptr<TextureData> player_sprite = LoadTexture("Assets/Player.png"); 10 std::shared_ptr<TextureData> block_sprite = LoadTexture("Assets/Block.png"); 11 12 13 14 15 16 //当たり判定 17 Box_Collision_2D col; 18 col.setEnable(true); 19 col.setPosition(glm::ivec2(SCREEN_WIDTH / 2, -SCREEN_HEIGHT / 2)); //座標 20 col.setSize(glm::ivec2(CELL / 2 , CELL / 2 )); //当たり判定範囲 21 22 23 24 25 26 block = std::make_unique<Block>(e, ObjectType::Block, block_sprite, 27 TextureUV{ glm::vec2(0,0),glm::vec2(CELL /2 ,CELL / 2 ) }, //UV 28 glm::ivec2(SCREEN_WIDTH / 2, -SCREEN_HEIGHT / 2),//座標 29 col); 30 31 stage = std::make_unique<Stage>(e); 32 player = std::make_unique<Player>(e,ObjectType::Player,player_sprite); 33} 34 35void Scene::Update() 36{ 37// stage->Update(); 38 player->Update(); 39 40 block->Update(); 41 if (Intersect_Rect_2D(player->mCol,block->mCol) == true) 42 { 43 player->Fix(block->mCol.getPosition(),ObjectType::Brick); 44 printf("当たり ! \n"); 45 } 46 47 48 49 50} 51 52void Scene::Draw() 53{ 54 55// stage->Draw(); 56 player->Draw(); 57 58 block->Draw(); 59 60 61} 62 63Scene::~Scene() 64{ 65 66} 67
cpp
1 2// 矩形同士の交差判定 3bool Intersect_Rect_2D(Box_Collision_2D& a,Box_Collision_2D& b) 4{ 5 if (a.getEnable() == true && b.getEnable() == true) 6 { 7 /* 8 printf("a.x %d\n", a.getSize().x); 9 printf("a.y %d\n", a.getSize().y); 10 printf("\n\n"); 11 printf("b.x %d\n", b.getSize().x); 12 printf("b.y %d\n", b.getSize().y); 13 */ 14 15 16 17 // 矩形の衝突判定 18 if (((a.getPosition().x + a.getSize().x > b.getPosition().x) && (a.getPosition().x < b.getPosition().x + b.getSize().x)) 19 && ((a.getPosition().y + a.getSize().y > b.getPosition().y) && (a.getPosition().y < b.getPosition().y + b.getSize().y))) 20 { 21 return true; 22 } 23 else 24 { 25 return false; 26 } 27 } 28 else 29 { 30 return false; 31 } 32} 33
cpp
1#include "../../Header/Game/Player.hpp" 2 3//コンストラクタ 4Player::Player(Entry* e, ObjectType type,std::shared_ptr<TextureData> data) : Actor_2D() 5{ 6 Owner = e; //Entry クラス 7 8 mPosition = glm::ivec2(SCREEN_WIDTH /2 - 200 , -SCREEN_HEIGHT / 2 ); //初期座標 9 mVector = glm::ivec2(0,1); //向き 10 //mUV = uv; //UV座標 11 mSpeed = SPEED; //移動速度 12 mSpeedpos = glm::ivec2(0,0); //移動座標 13 14 //当たり判定 15 mCol.setEnable(true); //有効 16 mCol.setSize(glm::ivec2(CELL,CELL)); //当たり判定のサイズ 17 18 mInputKey = std::make_unique<Input>(Owner); //キー入力 19 mSprite = std::make_unique<Sprite>(Owner,data); //スプライト 20 21} 22 23 24// めり込みを修正 25void Player::Fix(glm::ivec2 pos,ObjectType type) 26{ 27 28 printf("レンガと衝突 ! \n"); 29 if (mVector == glm::ivec2(1, 0)) 30 { 31 mPosition.x = pos.x - CELL; 32 } 33 else if (mVector == glm::ivec2(-1, 0)) 34 { 35 mPosition.x = pos.x + CELL; 36 } 37 else if (mVector == glm::ivec2(0, 1)) 38 { 39 mPosition.y = pos.y - CELL; 40 } 41 else if (mVector == glm::ivec2(0, -1)) 42 { 43 mPosition.y = pos.y + CELL; 44 } 45}
cpp
1#include "../Header/Sprite.hpp" 2#include "../Header/Shader.hpp" 3#include "../Header/Entry.hpp" 4#include "../Header/LoadTexture.hpp" 5#include "../Header/VertexData.hpp" 6 7// 数学ライブラリ 8#include "glm/ext.hpp" 9#include "glm/glm.hpp" 10 11 12#include <vector> 13 14// OpenCV 15#include <opencv2/core.hpp> 16 17/*################################################################################################################ 18* 画像 描画クラス 19################################################################################################################*/ 20 21//コンストラクタ 22/* 23* Entry クラス 24* テクスチャ パス 25* 描画する画像の寸法 26*/ 27Sprite::Sprite(class Entry* g, std::shared_ptr<TextureData> sp ) : Transform_2D(g) 28{ 29 //shader = new Shader(g, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 30 shader = std::make_shared<class Shader>(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 31 32 Owner = g;//Entryクラス 33 34 Transform_2D::setTransfrom(glm::vec2(1,1),0,glm::vec2(0,0)); //トランスフォームを初期化 35 36 //テクスチャを設定 37 glGenTextures(1, &TextureID); 38 glBindTexture(GL_TEXTURE_2D, TextureID); 39 40 //画像の大きさ 41 mPicSize.x = (float)sp->mSize.x; 42 mPicSize.y = (float)sp->mSize.y; 43 44 45// printf("%d\n",sp->mData->size()); 46 47 48 if (sp->mData->data() != NULL) 49 { 50 if (sp->channels == 3) 51 { 52 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGB, GL_UNSIGNED_BYTE, sp->mData->data()); 53 printf("aa\n"); 54 55 } 56 else if (sp->channels == 4) 57 { 58 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)sp->mSize.x, (GLsizei)sp->mSize.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sp->mData->data()); 59 } 60 } 61 else { 62 std::cerr << "Unable to load texture: " <<std::endl; 63 } 64 65 66 //ミニマップを設定 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 69 glGenerateMipmap(GL_TEXTURE_2D); 70 71 //異方性フィルタリングを設定 72 GLfloat largest; 73 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest); 74 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest); 75 76 77 78 79 //VAO 80 glGenVertexArrays(1, &VAO); 81 glBindVertexArray(VAO); 82 83 //VBO 84 glGenBuffers(1, &VBO); 85 glBindBuffer(GL_ARRAY_BUFFER, VBO); 86 glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW); 87 88 89 90} 91 92//描画 93void Sprite::DrawGraph(glm::ivec2 pos, glm::vec2 start, glm::vec2 end) 94{ 95 96 glm::vec2 mSize; 97 98 mSize = end - start; //描画範囲を取得 99 100 if (mSize.x > mPicSize.x) 101 { 102 mSize.x = mPicSize.x; 103 } 104 105 if (mSize.y > mPicSize.y) 106 { 107 mSize.y = mPicSize.y; 108 } 109 110 //左上が原点になるように修正 111 pos.x = (-SCREEN_WIDTH / 2) + (pos.x); 112 pos.y = (SCREEN_HEIGHT / 2) + (pos.y); 113 114 Transform_2D::UpdateTransform(); //トランスフォームを更新 115 Transform_2D::setTransform_Move(pos); //移動 116 117 shader->Enable(); //シェーダーを有効にする 118 shader->SetFloatUniform_3m("uViewMatrix", getViewMatrix()); 119 shader->SetFloatUniform_3m("uWorldMatrix", getWorldMatrix()); 120 121 122// printf("mSize.x %f\n", mSize.x); 123//` printf("start.x. x%f\n", end.x); 124 125 /* // 描画座標の中心に画像を描画 126 vertex[0] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y }; 127 vertex[1] = VertexAttribute_2D{ -mSize.x / 2.0f,-mSize.y / 2.0f, start.x / mPicSize.x ,end.y / mPicSize.y }; 128 vertex[2] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y }; 129 vertex[3] = VertexAttribute_2D{ -mSize.x / 2.0f,mSize.y / 2.0f, start.x / mPicSize.x ,start.y / mPicSize.y }; 130 vertex[4] = VertexAttribute_2D{ mSize.x / 2.0f,-mSize.y / 2.0f, end.x / mPicSize.x ,end.y / mPicSize.y }; 131 vertex[5] = VertexAttribute_2D{ mSize.x / 2.0f,mSize.y / 2.0f, end.x / mPicSize.x ,start.y / mPicSize.y }; 132 */ 133 134 135 //左上が原点 136 vertex[0] = VertexAttribute_2D{ 0,0, start.x / mPicSize.x ,start.y / mPicSize.y }; 137 vertex[1] = VertexAttribute_2D{ 0,-mSize.y, start.x / mPicSize.x ,end.y / mPicSize.y }; 138 vertex[2] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y }; 139 140 vertex[3] = VertexAttribute_2D{ 0 ,0, start.x / mPicSize.x ,start.y / mPicSize.y }; 141 vertex[4] = VertexAttribute_2D{ mSize.x,-mSize.y, end.x / mPicSize.x ,end.y / mPicSize.y }; 142 vertex[5] = VertexAttribute_2D{ mSize.x, 0, end.x / mPicSize.x ,start.y / mPicSize.y }; 143 144 145 146 147 //VAO 148 glBindVertexArray(VAO); 149 150 //VBO 151 glBindBuffer(GL_ARRAY_BUFFER, VBO); 152 glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(VertexAttribute_2D), vertex, GL_STATIC_DRAW); 153 154 155 //頂点座標 156 glEnableVertexAttribArray(0); 157 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), NULL); 158 159 //UV座標 160 glEnableVertexAttribArray(1); 161 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexAttribute_2D), (void*)(sizeof(float) * 2)); 162 163 glBindVertexArray(VAO); 164 glBindTexture(GL_TEXTURE_2D, TextureID); 165 glDrawArrays(GL_TRIANGLES, 0, (GLsizei)std::size(vertex)); 166 167} 168 169 170 171// 画像サイズを取得 172glm::vec2 Sprite::getSize() 173{ 174 return mPicSize; 175} 176 177 178 179// デストラクタ 180Sprite::Sprite(const Sprite & sp) : Transform_2D(sp.Owner) 181{ 182 //printf("あああああ\n"); 183 //shader = new Shader(sp.Owner, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 184 shader = std::make_shared<Shader>(sp.Owner, "Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 185 Owner = sp.Owner;//Entryクラス 186 mPicSize.x = sp.mPicSize.x; 187 mPicSize.y = sp.mPicSize.y; 188// printf("aaa\n"); 189 190} 191 192 193// デストラクタ 194Sprite::~Sprite() 195{ 196// printf("Sprite delete\n"); 197 198 // バッファを解放 199 glDeleteBuffers(1, &VAO); 200 glDeleteVertexArrays(1, &VAO); 201 202 glBindVertexArray(0); 203 glBindTexture(GL_TEXTURE_2D, 0); 204 205 206 //delete shader; 207 //shader = nullptr; 208 glDeleteTextures(1,&TextureID); 209 210} 211
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。