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

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

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

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

Q&A

解決済

1回答

985閲覧

2Dゲーム ジャンプ処理 実行するたびに処理が変わる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/01/30 16:07

編集2020/01/30 16:14

ジャンプして地面に着くときにバグるときとちゃんと地面に着くときが実行するたびに違っている原因が知りたいです。またジャンプして左右に移動したときだけバグる時がありあます。バグるとは提示画像のように下につっつていしまう。
イメージ説明

game.cpp部 /*キー入力*/ void Game::input(){ /////////////文字数の関係でenumによる入力部を割愛 p->Move(key,action); } const char* str = "Log.txt"; std::ofstream ofs(str); /*当たり判定処理 関数*/ void Game::Collision_Update() { Position *Result = NULL; float offset_x = 0; float offset_y = 0; /*移動方向によって異なる*/ if(p->speed->x > 0)//右 { offset_x = ((p->CELL) + p->speed->x ); }else if (p->speed->x < 0)//左 { float t = (p->CELL) * - 1;//符号を逆にするマイナス offset_x = (t + p->speed->x); // ofs<<offset_x<<std::endl; }else{ offset_x = 0; } //if(action == keyState::Jump) if(p->speed->y < 0) { offset_y = - ((p->CELL - 1 ) - p->speed->y ); //}else if (action == keyState::Down) }else if (p->speed->y > 0) {/*落下*/ offset_y = ((p->CELL) + p->speed->y); //ofs<<offset_y <<std::endl; } /* Y 軸 */ // Position* now_y_left = new Position(p->pos->x, p->pos->y + ((p->CELL / 2) - 1)); // Position* future_y_left = new Position(p->pos->x, p->pos->y + ((p->CELL / 2) - 2) + offset_y); // Position* now_y_right = new Position(p->pos->x + (p->CELL - 1), p->pos->y + ((p->CELL / 2) - 1)); // Position* future_y_right = new Position(p->pos->x + (p->CELL - 1), p->pos->y + ((p->CELL / 2) - 2) + offset_y); //ofs << "future_x_up: " << future_x_up.x << std::endl; // ofs << "future_x_down: " << future_x_down.x << std::endl; bool NoCol_x = true; bool NoCol_y = true; /**********************************************当たり判定***********************************************************************/ for (int y = 0; y < 100; y++) { for (int x = 0;x < 100; x++) { if (m->isMap(Position((float)x,(float)y)) == true) { float Fix_x_up = -1; float Fix_x_down = -1; float Fix_y_left = -1; float Fix_y_right = -1; /* X 軸 */ Position now_x_up(p->pos->x + ((p->CELL / 2) - 1), p->pos->y); Position future_x_up((p->pos->x + ((p->CELL / 2) - 1)) + offset_x, p->pos->y); Position now_x_down(p->pos->x + ((p->CELL / 2) - 1), (p->pos->y + (p->CELL - 1))); Position future_x_down((p->pos->x + ((p->CELL / 2) - 1)) + offset_x, (p->pos->y + (p->CELL - 1))); /*=================空中に居る時で 左右に"動いているとき"=================*/ //if (p->isGround == false && p->isJump == true) if(true) { // ofs << "Collisition " << std::endl; DrawFormatString(400, 400, GetColor(255, 255, 255), "Collisition",true); int r = cross_pos(&Result, now_x_up, future_x_up, Position((x * p->CELL) + ( (p->CELL / 2) - 1),y * p->CELL), Position((x * p->CELL) + ((p->CELL / 2) - 1), ((y + 1) * p->CELL) - 1 )); if( r != 0) { NoCol_x = false; DrawFormatString(400, 400, GetColor(255, 255, 255), "now_x_up", true); if(p->speed->x > 0){ Fix_x_up = Result->x - ( (p->CELL - 1) + (p->CELL /2) ); //ix_x_up = now_x_up.x; }else if(p->speed->x < 0) { Fix_x_up = Result->x + (p->CELL / 2) + 1; //Fix_x_up = now_x_up.x; } delete(Result); Result = NULL; } if(p->isGround == false){ r = cross_pos(&Result, now_x_down, future_x_down, Position( (x * p->CELL) + ((p->CELL / 2) - 1), y * p->CELL), Position((x * p->CELL) + ((p->CELL / 2) - 1), ((y + 1) * p->CELL) - 1)); if (r != 0) { NoCol_x = false; DrawFormatString(400, 500, GetColor(255, 255, 255), "now_x_down", true); if (p->speed->x > 0) { Fix_x_down = Result->x - ((p->CELL - 1) + (p->CELL / 2)); //Fix_x_down = now_x_down.x; }else if (p->speed->x < 0) { Fix_x_down = Result->x + (p->CELL / 2) + 1; //Fix_x_down = now_x_down.x; } delete(Result); Result = NULL; } } /*X 補正*/ if (Fix_x_up != -1 || Fix_x_down != -1) { if (p->speed->x > 0)/*右*/ { if (Fix_x_up == -1) { p->pos->x = Fix_x_down; } else if(Fix_x_down == -1) { p->pos->x = Fix_x_up; } else { if (Fix_x_up < Fix_x_down) { p->pos->x = Fix_x_up; } else { p->pos->x = Fix_x_down; } } } else if (p->speed->x < 0)/*左*/ { if (Fix_x_up == -1) { p->pos->x = Fix_x_down; } else if (Fix_x_down == -1) { p->pos->x = Fix_x_up; } else { if (Fix_x_up < Fix_x_down) { p->pos->x = Fix_x_down; } else { p->pos->x = Fix_x_up; } } } } /*********************************************** Y軸 *************************************************************************************/ /* Y 軸 値設定*/ Position now_y_left(p->pos->x, p->pos->y + ((p->CELL / 2) - 1)); Position future_y_left(p->pos->x, p->pos->y + ((p->CELL / 2) - 1 ) + offset_y); Position now_y_right(p->pos->x + (p->CELL - 1), p->pos->y + ((p->CELL / 2) - 1)); Position future_y_right(p->pos->x + (p->CELL - 1), p->pos->y + ((p->CELL / 2) - 1 ) + offset_y); ofs << future_y_left.y << std::endl; ofs << future_y_right.y << std::endl; r = cross_pos(&Result,now_y_left,future_y_left, Position( (x * p->CELL), (y * p->CELL) + ((p->CELL / 2) - 1)),Position((x * p->CELL) + (p->CELL - 1), (y * p->CELL) + ((p->CELL / 2) ) - 1 )); if(r != 0) { NoCol_y = false; DrawFormatString(350, 600, GetColor(255, 255, 255), "now_y_left", true); ofs<<"y_col left"<<std::endl; /*落下*/ if (p->speed->y > 0) { Fix_y_left = (Result->y - ((p->CELL) + ((p->CELL / 2)) - 1)); //ofs << Fix_y_left->y << std::endl; // p->speed->y = 0; p->isGround = true; p->isJump = false; } /*ジャンプ*/ else if (p->speed->y < 0) { //p->speed->y = 0; Fix_y_left = Result->y + ((p->CELL / 2) + 1); // ofs<<Fix_y_left<<std::endl; } delete(Result); Result = NULL; } r = cross_pos(&Result, now_y_right, future_y_right, Position((x * p->CELL), (y * p->CELL) + ((p->CELL / 2) - 1)), Position((x * p->CELL) + (p->CELL - 1), (y * p->CELL) + ((p->CELL / 2) - 1))); if (r != 0) { ofs << "y_col right" << std::endl; NoCol_y = false; DrawFormatString(350, 300, GetColor(255, 255, 255), "now_y_right", true); /*ジャンプ*/ if(p->speed->y < 0) { Fix_y_right = Result->y - ( (p->CELL) + ( (p->CELL / 2) - 1)); ofs << Fix_y_right << std::endl; // p->speed->y = 0; /*落下*/ }else if (p->speed->y > 0) { // p->speed->y = 0; Fix_y_right = Result->y + ((p->CELL / 2) - 1); p->isGround = true; p->isJump = false; // ofs << Fix_y_right->y << std::endl; } } /* Y 補正 */ if(Fix_y_left != -1 || Fix_y_right != -1) { /*落下*/ if(p->speed->y > 0){ if(Fix_y_left == -1) { p->pos->y = Fix_y_right; }else if(Fix_y_right == -1) { p->pos->y = Fix_y_left; }else{ if(Fix_y_left < Fix_y_right) { p->pos->y = Fix_y_left; }else{ p->pos->y = Fix_y_right; } } /*ジャンプ */ }else if (p->speed->y < 0) { p->speed->y = 0; if (Fix_y_left == -1) { p->pos->y = Fix_y_right; } else if (Fix_y_right == -1) { p->pos->y = Fix_y_left; } else { if (Fix_y_left < Fix_y_right) { p->pos->y = Fix_y_right; } else { p->pos->y = Fix_y_left; } } } } } } } } if(NoCol_x == true) { float xx = p->speed->x; p->pos->x += xx; } if (NoCol_y == true) { float yy = p->speed->y; p->pos->y += yy; } } /****************************************************************************************************************************/ ///////////////////////////////////////////////////////////Move()関数部 void Player::Move(keyState key,keyState action) { if (key == keyState::Left) { Direction->x = -1; speed->x = m * Direction->x; } else if(key == keyState::Right) { Direction->x = 1; speed->x = m * Direction->x; } else if (key == keyState::Invalid) { Direction->x = 0; speed->x = 0; } //const float jd = 100; if (action == keyState::Jump && isGround == true && isJump == false) { ofs2<<"isJump"<<std::endl; isGround = false; isJump = true; speed->y = -20.0f; } if(isGround == false) { t = 0.6; g = 2.5; vo = 0.4; float tt = speed->y + vo * t + 0.5 * g * t * t; if(tt < 30) { speed->y = speed->y + vo * t + 0.5 * g * t * t; } }else{ speed->y = 0; } ////////////////////////////////////////////////////////////////// //ofs2<< "speed->x: " << speed->x << std::endl; //ofs2<<"speed->y: "<<speed->y<<std::endl; ////////////////////////////////////////////////////////////////// }

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

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

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

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

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

guest

回答1

0

ベストアンサー

あまり深くは読んでませんが、地面の上にいるかどうかをフラグで持つのは間違いの元のような気がします。

地面の上にいる、言い換えると「今キャラクタがいる座標のすぐ下が障害物である」かどうかを、必要なときに判定するようにした方がすっきりするでしょう。

※例えば床が途中で切れているとき、ジャンプしなくても空中にいる状態が発生しますよね?

投稿2020/02/03 01:25

tacsheaven

総合スコア13703

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問