8年前プログラミングを勉強している大学生です。『龍神録プログラミングの館』に載っている「龍神録」をDLさせていただき、それを基に2Dの横スクロールのゲームを作成しています。今回、スーパーマ〇オのようなジャンプを組み込みたいと思い様々な方法を試してみましたが上手くいかず、この掲示板にやってきました。※20章の内容から派生してプログラムを書き換えています。ch.y+=3;}予想ではこれで、upの入力に対して上に進みその後FIELD_Yの初期位置(478)に戻ってくる、と考えました(ちゃんとしたジャンプではないですが)。実行後、すぐに下へ落ちて行ってしまいました。これにジャンプのプログラムを組み込むにはどうしたらいいのでしょうか。ご返答をお願いします。私自身はマリオのジャンプ(前回の座標を参照)を使わないのですが、一応こちらのサイト様で式が乗ってます。http://d.hatena.ne.jp/Gemma/20080517/1211010942とりあえずif(FIDLD_Y==478)が、地面判定として仮定させていただきます。//でもFIDLD_Yって変数?そして新しい変数、y_old(yと同じ型)を仮定させていただきます。y_oldは、前回の座標です。y_temp=ch.y;//今の座標を保存ch.y+=(ch.y-ch.y_old)-F;//ジャンプの移動修正ch.y_old=y_temp;//保存した座標を過去のものとして保存}とりあえず参照サイトのを改良いたしました。参考程度にはなるかと思います。仕組みが分からなければ、どこが分からないのか書き込んでいただければ、解説します。//////さらに修正。478)とif文で判定している意味が分かりません。ch.y+=3;の部分が処理されているのだと思います。以下にジャンプの処理についての考え方を書いてみますね。参考にしてみてください1上キーが入力されているかどうか判定する2入力されていた場合ジャンプが可能かどうか判定する要は地面に足を着いているかどうかですね。3ジャンプが可能ならばジャンプさせる移動量の変数を用意して、最初は大きく上に移動させ(地面を蹴った瞬間が一番上方向へのエネルギーが大きいからですね)(重力によって)徐々に上方向へのベクトルを小さくし最終的に下方向への移動量にさせる(もちろん下へ移動を始めてからも下への加速は続く訳ですが)というのが一般的だと思います。場合によっては下への移動量に制限を掛けたりしますけどね。物理の話になるのでややこしくなりますが、この辺りも参考になる・・・かもしれません。丁寧に解説・指摘をしていただき感謝申し上げます。>パコネコ様ご返答ありがとうございます。FIELD_Yは定数でした。キャラクターの初期位置の定義としてdefine.cppにすでに書いており、単純な勘違いでした。if文の中では変数の変化に対応して処理を行うということですね。Fというのはサイト様にあった「その瞬間の力」を定義した、ということですよね?そしてコード:ch.y+=(ch.y-ch.y_old)-F;//ジャンプの移動修正この文を説明していただけないでしょうか?お願いします。>jay様ご返答ありがとうございます。その文は間違いでした。本来define.cppにて定数の定義をされていたFIELD_Yを変数扱いで書いてしまいました。ジャンプの処理についての考え方、も提示していただきありがとうございます。そのまま実行すると2の基準がないことになってしまい、上入力を入れるとそのまま上昇を続けるということになりますからね。初期位置に現れず、右下の画面外にいると思われます。返信させていただきます。ch.y+=(ch.y-ch.y_old)-F;//ジャンプの移動修正の説明ですが、(ch.y-ch.y_old)から説明させていただきます。これは現在の座標から前回の座標分を引いた値、つまり前回からの移動した値を意味します。コレにより前回の移動量分移動させる事ができます。次にFですが、ボタンを押した瞬間は「10」となりその後、地面に当たるまでは「−1」となります。前回の移動量分-Fをしてみましょう。前回の移動量は元々は0です。前回の移動量-10となります。よって、0-10により、-10となります。この式は、ch.yに足すためのものなので、足しましょう。y+=-10;によりy-10です。yの値が減るという事は上に上がります。次に、上に上がったという事は地面とのあたり判定は外れているという事になります。(頭打つようなとこだと微妙ですが...)なので、次はF=-1としましょう。前回からの移動量は-10ですので、y+=(-10)-(-1);となります。y+=-10+1=-9です。次はyの値から9引いてあげましょう。前回減った値が10で今回が9です。このまま計算を続けるとどんどん増えて行きます。->0->1->2->3)あの式についてはこんな感じで良いと思います。分からない点がありましたらまた質問してください。考えられる点をいくつか上げさせていただきます。*ch.y_oldの初期化し忘れ。(まぁoldの値の更新を移動時のみではなく毎回にしたら楽なんですけどね。上と一番下に書かなきゃ行けなくなるからな...説明しづらいのでまとめてますが...)*当たり判定が間違っているため堕ち続ける。(ちなみに当たり判定を行うときは普通は当たった位置に戻してあげる処理が合った方がいいです。)いったいどのくらいのサイズの子なのかはワカリマセンが、当たり判定が地面のみなら、コード:if(地面のy座標ー物体の大きさ<物体のy座標){物体のy座標=地面のy座標ー物体の大きさ;}があると便利かと思います。長文になってしまいましたが、こんな感じではないかと思います。ch.y_old=ch.y_temp;//保存した座標を過去のものとして保存}コレの解説をさせていただきます。いっても先ほどの投稿のときに、コード:ch.y+=(ch.y-ch.y_old)-F;//ジャンプの移動修正については説明させていただいたので省略させていただきす。if(F!=0)ですが、そのまんまです。Fが0以外なら処理を行います。地面に面しているときはFは0になります。地面に面しているときにジャンプボタンを押すと、Fは10になります。(10というよりも、定数と言った方がいいかも...)そして逆に地面に面してないときは-1となります。地面に面してないときか、ボタンを押したときに処理を行います。(消そうと思えば消せますけどね...)次はifの中身です。残りの1行目と3行目に付いてですが、これは、移動を行うとyの値が書き換えられてしまうため、一旦バックアップを取っているだけです。移動が終わった後にバックアップのデータを過去のものとして保存してます。とただそんだけですw分からない所があれば質問を書いといていただければ、解答いたします。ミクプラは自由にリンクできます。