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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

2499閲覧

自由落下の数式でジャンプと重力落下を実現したい。

退会済みユーザー

退会済みユーザー

総合スコア0

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2020/01/18 07:00

////////////コメント部のコード。上昇と重力落下は再現できましたが、ジャンプしたときに(上昇)した時に上に行く力がなくなったら下がり始めるという処理を作れないのですがどうすればいいのでしょうか?

/*Yの符号を逆にする関数*/ float rev_y(float t) { return t * -1.0f; } float nowforce = 0;//一時変数 float force = -18;//初速 float f = 3.0f;//引く数 float gmax = 10;//落下最大速度 #define KEY_FRAME_G 2 const float inital_po = -7; //float PO = inital_po; //float PO = -7; float PO = -7; /*等速直線運動のY 落下*/ void gravity_force() { /* マイナスの時落下 プラスの時 ジャンプ(上昇) */ #define G 6.3234//重力 #define T 0.7//時間 //#define PO 2.5//初速 /////////////////////////////////////////////////////////////////////////////////////////////////////// /*ジャンプできる条件*/ if (isJump == true && isGround == true) { isGround = false; // move->y = 30; PO = 20; DrawFormatString(300, 300, GetColor(255, 255, 255), "ジャンプしました。"); } /*重力落下できる条件*/ if(isGround == false){ float y = move->y + PO * T + 0.5 * G + T * T; DrawFormatString(300, 300, GetColor(255, 255, 255), "空中です。"); move->y = y; //ofs << "y: " << move->y << std::endl; ofs <<"y: "<< y <<std::endl; }else if(isGround == true){ DrawFormatString(300, 300, GetColor(255, 255, 255), "地面です。"); move->y = 0; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// /*キー入力*/ void key_Update() { //if (keyboard(KEY_INPUT_LEFT) == 1)//← if (keyboard(KEY_INPUT_LEFT) > 0)//← { Direction->x = -1; *State = key::Left; } else if (keyboard(KEY_INPUT_RIGHT) > 0)//→ //else if (keyboard(KEY_INPUT_RIGHT) == 1)//→ { Direction->x = 1; *State = key::Right; } else { Direction->x = 0; *State = key::Invalid; } /*gravity_force()にて処理*/ if (keyboard(KEY_INPUT_SPACE) == 1)//ジャンプ { Direction->y = 1; *State_y = key::Jump; }else//何も押していない時つまり重力落下 { Direction->y = -1; *State_y = key::Invalid; } } /*移動処理*/ void Move() { if (*State == key::Left) { move->x = Direction->x * (CELL); }else if (*State == key::Right) { move->x = Direction->x * (CELL); } else if (*State == key::Invalid)//左右に動いてないとき { // Direction->x = 0; move->x = 0; } /*ジャンプ*/ if(*State_y == key::Jump) { isJump = true; }else if(*State_y == key::Invalid){//重力落下 } /*ジャンプ入力*/ gravity_force(); } /*セル検索 衝突時: true */ bool Find_Cell(Position *p) { int px = (int)p->x / CELL; int py = (int)p->y / CELL; /*0じゃないとき*/ if(map[py][px] != 0) { return true; }else{ return false; } } /* std::optional<Position> cross_pos(Position a, Position b, Position c, Position d) { //tc = (x1 - x2) * (y3 - y1) + (y1 - y2)* (x1 - x3); float tc = (a.x - b.x) * (c.y - a.y) + (a.y - b.y) * (a.x - c.x); //td = (x1 - x2) * (y4 - y1) + (y1 - y2)* (x1 - x4); float td = (a.x - b.x) * (d.y - a.y) + (a.y - b.y) * (a.x - d.x); //ta = (x3 - x4) * (y1 - y3) + (y3 - y4) * (x3 - x1) float ta = (c.x - d.x) * (a.y - c.y) + (c.y - d.y) * (c.x - a.x); //tb = (x3 - x4) * (y2 - y3) + (y3 - y4) * (x3 - x2) float tb = (c.x - d.x) * (b.y - c.y) + (c.y - d.y) * (c.x - b.x); return std::nullopt; } */ /*マップを探索してブロックの場所の座標を返す。*/ bool Find_Map(int x, int y) { if(map[y][x] != 0) { return true; }else{ return false; } } /*-----------------------------------衝突座標を返す関数-----------------------------------------*/ /*---------------------------------------------------当たり判定----------------------------------------------------------------*/ void Collision_Update() { // std::unique_ptr<Position> xPlayer_up, xPlayer_down; // std::unique_ptr<Position> yPlayer_left, yPlayer_right; //move->y = -20; /*補正座標を保存*/ Position *xPlayer_up, *xPlayer_down; Position *yPlayer_left, *yPlayer_right; xPlayer_up = NULL; xPlayer_down = NULL; yPlayer_left = NULL; yPlayer_right = NULL; bool xR ,xL; xR = xL = false; Position now_x[2];//今いる座標 Position now_y[2];//今いる座標 Position future_x[2];//移動先 座標 Position future_y[2];//移動先 座標 /*---------------- X 軸----------------------------*/ /*誤差修正*/ int offset = 0; if(Direction ->x > 0){ offset = (CELL); }else{ offset = 0; } now_x[0].x = pos->x + offset; now_x[0].y = pos->y - ((CELL / 2)); now_x[1].x = pos->x + offset; now_x[1].y = pos->y + ((CELL / 2) - 1); /*---------------- Y 軸----------------------------*/ now_y[0].x = pos->x - (CELL / 2); now_y[0].y = pos->y + (CELL / 2); now_y[1].x = pos->x + (CELL / 2); now_y[1].y = pos->y + (CELL / 2); /*未来座標配列に現在座標をコピーする*/ /*---------------- X 軸----------------------------*/ future_x[0].x = now_x[0].x + (move->x) + (((CELL / 2) - 1) * Direction->x); future_x[0].y = now_x[0].y + move->y; future_x[1].x = now_x[1].x + (move->x) + (((CELL / 2) - 1) * Direction->x); future_x[1].y = now_x[1].y + move->y; /*---------------- Y 軸----------------------------*/ future_y[0].x = now_y[0].x + move->x; future_y[0].y = now_y[0].y + move->y * Direction->y; future_y[1].x = now_y[1].x + move->x; future_y[1].y = now_y[1].y + move->y * Direction->y; Position *p = NULL; for(int y = 0; y < 100; y++){ for(int x = 0;x < 100; x++){ if(Find_Map(x,y) == true){ /*-----------------------------X 軸---------------------------------*/ int r = cross_pos(&p,now_x[0], future_x[0], Position((x + 1) * CELL, y * CELL),Position(((x + 1) * CELL), ((y + 1) * CELL))); if(r != 0) { /*上側*/ // DrawFormatString(200,120,GetColor(255,255,255),"x col [0] %d",r); xPlayer_up = p; } p = NULL; r = cross_pos(&p,now_x[1], future_x[1], Position((x + 1) * CELL, y * CELL),Position(((x + 1) * CELL), ((y + 1) * CELL))); if ( r != 0) { /*下側*/ // DrawFormatString(200,100,GetColor(255,255,255),"x col [1]: %d",r); xPlayer_down = p; } /*-----------------------------Y 軸---------------------------------*/ r = cross_pos(&p, now_y[0], future_y[0], Position(x * CELL, y * CELL),Position( (x + 1) * CELL , (y * CELL) )); if (r != 0) { // DrawFormatString(120,100,GetColor(255,255,255),"y col[0] %d",r); // ofs << "left"<<std::endl; yPlayer_left = p; } p = NULL; r = cross_pos(&p, now_y[1], future_y[1], Position( x * CELL, y * CELL),Position( (x + 1) * CELL, (y * CELL))); if ( r != 0) { // DrawFormatString(100,120,GetColor(255,255,255),"y col[1] %d",r); // ofs << "right"<<std::endl; yPlayer_right = p; } } } } // ofs << pos->y <<std::endl; /*--------------------------X 軸補正--------------------------*/ /*当たっていないとき*/ if (xPlayer_down == NULL && xPlayer_up == NULL) { // ofs << "X補正" << std::endl; pos->x += move->x;// * direction済み } /*上下両方当たっている時*/ if ( (xPlayer_down != NULL) && (xPlayer_up != NULL) ) { /* Right */ if (Direction->x > 0) { if (xPlayer_up->x >= xPlayer_down->x) { pos->x = xPlayer_down->x - (CELL + CELL / 2); } else { pos->x = xPlayer_up->x - (CELL+ CELL / 2); } } /* Left */ if (Direction->x < 0) { if (xPlayer_up->x <= xPlayer_down->x) { //pos->x = xPlayer_down->x + (CELL); pos->x = xPlayer_down->x + (CELL / 2) + 1; } else{ pos->x = xPlayer_up->x + (CELL / 2) + 1; //pos->x = xPlayer_up->x + (CELL); } } }else{ } /*上側*/ if (xPlayer_up != NULL && xPlayer_down == NULL) { if (Direction->x > 0) { pos->x = xPlayer_up->x; } if (Direction->x < 0) { pos->x = xPlayer_up->x; } } /*--------------------------Y 軸補正--------------------------*/ if (yPlayer_left == NULL && yPlayer_right == NULL) { //ofs << "Y補正" << std::endl; isGround = false; //pos->y += rev_y(move->y); //pos->y += rev_y(move->y); pos->y += move->y * Direction->y; }else if ((yPlayer_left != NULL) && (yPlayer_right != NULL)) { isGround = true; if (Direction->y > 0) { if (yPlayer_left->y >= yPlayer_right->y) { //pos->y = yPlayer_left->y + (CELL + (CELL / 2)); pos->y = yPlayer_left->y - (CELL / 2); //pos->y += - (CELL / 2); } else { //pos->y = yPlayer_right->y + (CELL + (CELL / 2)); pos->y = yPlayer_right->y - (CELL / 2); //pos->y += - (CELL / 2); } } /*落下 反転処理をしているので - 1の時は落下中*/ if (Direction->y < 0) { if (yPlayer_left->y <= yPlayer_right->y) { pos->y = yPlayer_left->y - (CELL / 2); //pos->y = yPlayer_left->y - (CELL / 2); //pos->y += - (CELL / 2); } else { pos->y = yPlayer_right->y - (CELL / 2); //pos->y = yPlayer_right->y - (CELL / 2); //pos->y += - (CELL / 2); //pos->x = xPlayer_up->x + (CELL); } } }else if( yPlayer_left == NULL && yPlayer_right != NULL) { pos->y = yPlayer_right->y - (CELL / 2); //pos->y += - (CELL / 2); isGround = true; } else if (yPlayer_left != NULL && yPlayer_right == NULL) { pos->y = yPlayer_left->y - (CELL / 2); // pos->y += - (CELL / 2); isGround = true; } delete(xPlayer_up); delete(xPlayer_down); delete(yPlayer_left); delete(yPlayer_right); } /*-----------------------------

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下サイトの解説は参考にならないでしょうか。

参考:

ゲームプログラミングの館 > 27. ジャンプの考え方1(物理)
https://dixq.net/g/30.html

プログラム学習 > マリオをジャンプさせる(プログラミングでマリオを作る第13回)
https://xn--qcka9i7azcwa9bz223dvr6c.jp/2018/01/20/%E3%83%9E%E3%83%AA%E3%82%AA%E3%82%92%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97%E3%81%95%E3%81%9B%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E3%83%9E%E3%83%AA%E3%82%AA/

投稿2020/01/19 04:26

nskydiving

総合スコア6500

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問