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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C++

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

Q&A

解決済

2回答

1825閲覧

ベクトルを使っためり込み処理でx,y同時にめり込んだ時の例外処理を作りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/08/25 17:54

dxlibです。ベクトルを使ってめり込みを回避したいんですが真横に当たった時にブロックのめり込みそれをx軸を戻した時に同時にy軸も動いてしまい真横の上のブロックに上がってしまうバグの対処方がわかりません別途例外処理のようなものを作ればいいの思うんですがどうすればいいのかわかりませんちなみに左から右に行く処理を作っています。yだけxだけならなんとなく完成したのでそのですが

/*全方位の当たり判定 return セル番号を返す*/ std::optional<Position> Map::Collision::player_col(const Position *pos,const Position *move) { int px2 = pos->get_x() + move->get_x(); int py2 = pos->get_y() + move->get_y(); static bool isground = false; int px = pos->get_x(); int py = pos->get_y(); int add_x = move->get_x(); int add_y = (int)move->get_y(); // ofs << "move->get_x(): " << move->get_x()<<"\n"; // ofs << "move->get_y(): " << move->get_y() << "\n"; int corr_x = 0; int corr_y = 0; // ofs <<"aaa"<< px << "\n"; for (int y = 0; y < MAP_HEIGHT; y++) { for (int x = 0; x < MAP_WIDTH; x++) { if (get_mapCell(x, y) == (int)mapChip::eBrick || get_mapCell(x, y) == (int)mapChip::eQuestion) { if ( (pos->get_x() <= (x * CELL) && (pos->get_x() + CELL + add_x) >= (x * CELL) || pos->get_x() >= (x * CELL) && pos->get_x() <= (x * CELL) + CELL) && (pos->get_y() <= (y * CELL) && (pos->get_y() + CELL + add_y) >= (y * CELL) || pos->get_y() >= (y * CELL) && pos->get_y() <= (y * CELL) + CELL ) ) { if ((pos->get_x() <= (x * CELL) && pos->get_x() + CELL + add_x >= (x * CELL))) { ofs << "x補正" << std::endl; px = (x * CELL) - CELL; } ofs << "playe_col isground: " << isground << std::endl; if ( (move->get_y() < 0) ) { ofs << "ground "<< std::endl; isground = true; py = ((y * CELL) - CELL ); } std::optional<Position> p = Position(px, py); return p.value();//セルを返す // return true; } } //pos->get_x() <= (x * CELL) && pos->get_x() + CELL >= (x * CELL) } } return std::nullopt; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

以前にも書きましたが、以下のコードが問題です
なぜこんなループがあるのか、まずはその見直しから始めてください
このループを適切な形に変えるだけで、ブロックの上に上がってしまうことは避けられます

for (int y = 0; y < MAP_HEIGHT; y++) { for (int x = 0; x < MAP_WIDTH; x++) {

投稿2019/08/26 05:20

izmktr

総合スコア2856

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

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

fana

2019/08/26 05:42

本当ですか? 判定範囲の広さを増減させようが,当たった(当たるとわかった)際の処理を適切なものにしない限りは何も解決しないと思うのですが. (提示コードだけでは,今現在どうやって座標を補正しているのかも全くわかりませんし)
guest

0

斜め方向に移動する状況が極めて稀だということでなければ,好き勝手に移動すれば「x,y同時にめり込む」のが一般的なのであって,
それを例外的な事態だと考えること自体が,やっていることにそぐわないと思います.
(どちらかと言えば,横方向あるいは縦方向の所望移動量が0という状態の方が頻度が少ないのではないでしょうか)

同じような内容の質問が乱立(?)しているように見受けるので,
私の考える処理方法に関しては,他の質問に書きました.

投稿2019/08/26 03:02

fana

総合スコア11652

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問