提示画像ですが上右に移動するしながら壁にぶつかるとめり込み量の少ない方の軸へめり込み量を修正するコードです。
提示コードの///の部でめりこみ量の少ない方をif文で分岐して修正するのですが提示画像のように一番上まで行くと提示画像のように下に修正されてしまいます。このバグはどうやって修正すればいいのでしょうか?
考えた事
bool型変数になんかのときといった条件を考えて保存する。
ベクトルを使って交点の座標に修正する。(別の案)
cpp
1 2//補正量をのを得る 3glm::vec2 BoxCollision::getFixValue(glm::vec2 player_min, glm::vec2 player_max, glm::vec2 block_min, glm::vec2 block_max) 4{ 5 //X軸の補正量 6 float xA = player_max.x - block_min.x; 7 float xB = block_max.x - player_min.x; 8 float x; 9 float y; 10 11 if (xA < xB) 12 { 13 x = xA; 14 } 15 else 16 { 17 x = xB; 18 } 19 20 //Y軸の補正量 21 float yA = player_max.y - block_min.y; 22 float yB = block_max.y - player_min.y; 23 24 if (yA < yB) 25 { 26 y = yA; 27 } 28 else 29 { 30 y = yB; 31 } 32 33 glm::vec2 pos; 34 pos.x = x; 35 pos.y = y; 36 37 38 return pos; 39} 40//交差判定 41void BoxCollision::Intersect(BoxCollision& col) 42{ 43 44// printf("%f\n",getVector().y); 45 46 47 if ((col.getMax().x > box.mMin->x && box.mMax->x > col.getMin().x) 48 && (col.getMax().y > box.mMin->y && box.mMax->y > col.getMin().y)) 49 { 50 setCol(true); //当たり判定を設定 51 setColTag(col.getMyTag()); //タグを取得 52 col.setColTag(getMyTag()); //タグを設定 53 54 glm::ivec2 size = getMax() - getMin(); //サイズ 55 56 glm::vec2 fix = getFixValue(getMin(), getMax(), col.getMin(), col.getMax()); //めりこみ量 57 printf("X: %.2f\n", fix.x); 58 printf("y: %.2f\n", fix.y); 59 60 if (getVector().x > 0 && getVector().y == 0) 61 { 62 glm::vec2 p; 63 p.x = col.getMin().x - size.x; 64 p.y = getMin().y; 65 66 setMinValue(p); 67 }else if (getVector().x < 0 && getVector().y == 0) 68 { 69 glm::vec2 p; 70 p.x = col.getMax().x; 71 p.y = getMin().y; 72 73 setMinValue(p); 74 75 } 76 else if (getVector().y < 0 && getVector().x == 0) 77 { 78 glm::vec2 p; 79 p.y = col.getMax().y; 80 p.x = getMin().x; 81 82 setMinValue(p); 83 } 84 else if (getVector().y > 0 && getVector().x == 0) 85 { 86 printf("あああ\n"); 87 glm::vec2 p; 88 p.y = col.getMin().y - size.y; 89 p.x = getMin().x; 90 91 setMinValue(p); 92 } 93 else if (getVector().x > 0 && getVector().y < 0) 94 { 95 96////////////////////////////////////////////////////////////////////////////////////////// 97 if ((fix.x < fix.y)) 98 { 99 100 printf("ああああ\n"); 101 glm::vec2 p; 102 p.x = col.getMin().x - size.x; 103 p.y = getMin().y; 104 105 setMinValue(p); 106 107 } 108 else { 109 printf("うううううう\n"); 110 111 glm::vec2 p; 112 p.x = getMin().x; 113 p.y = col.getMax().y; 114 115 setMinValue(p); 116 117 } 118//////////////////////////////////////////////////////////////////////////////////////// 119 } 120 121 122 123 124 125 } 126 else 127 { 128 //交差していない 129 setCol(false); 130 setColTag(Tag::Invalid); 131 col.setColTag(Tag::Invalid); 132 } 133 134} 135
文章を修正しました。
文章とタイトルを修正しました。
その「補正量が少ない方がどうの」とかいう話の出所らしき場所で議論した方がよくないですかね?
https://ja.stackoverflow.com/questions/74674
マルチポスト先で出た案を輸入されても困る.
というか,元々の内容と全く異なる形に質問内容を変更するのはやめましょう.
話が丸ごと変更されたため,
既存の回答群とそれらに付随するコメント群は完全に何の話をしているのか不明なものと化しました.
すいませんでした。新たに質問を作成するのも良くないと思いました
回答3件
あなたの回答
tips
プレビュー