質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

Q&A

解決済

1回答

1708閲覧

当たり判定でサイズが変わると範囲がズレてしまう原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

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

0グッド

0クリップ

投稿2021/02/09 04:21

提示画像ですが当たり判定がズレてしまう原因がどうしてもわかりません。当たり判定の範囲が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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

blockオブジェクトにサイズを設定する部分が見当たりませんが、の周辺部分を見直してみてはいかがでしょうか?

下記のCELL/2はテクスチャのサイズ指定で、オブジェクトのサイズ指定ではないかと思われます。

block = std::make_unique<Block>(e, ObjectType::Block, block_sprite,
TextureUV{ glm::vec2(0,0),glm::vec2(CELL /2 ,CELL / 2 ) }, //UV
glm::ivec2(SCREEN_WIDTH / 2, -SCREEN_HEIGHT / 2),//座標
col);

投稿2021/02/13 01:22

Serbonis

総合スコア586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問