トピック

超初歩的な感じがする()

長年(一年程度)出来ないプログラム…そう、横スクロールアクションゲームにはほぼ必須のキャラクターのジャンプ。 どんなに頑張っても空に飛んで行ったりするんだぁぁぁぁぁぁ! 教えてくれぇぇぇぇ()
14そうだね
プレイ済み
返信[1]
親投稿
HaRu fuma41000baru
自分も気になるのでライス
3そうだね
未プレイ
返信[2]
親投稿
こめのこす。
2そうだね
プレイ済み
返信[3]
親投稿
だにえる haru2016nen
まず、「重力」から作る のがいいんじゃないかな
1そうだね
プレイ済み
返信[4]
親投稿
しろ sshiro1shiro
1年あればSYS/GAME3JUMPの重力を解析できたかもね。
1そうだね
プレイ済み
返信[5]
親投稿
HRT-86_にでら mijuharuto
Y座標がn以下なら地面のSPかBGのY座標に到達するまでY座標を加算する とか考えた
1そうだね
プレイ済み
返信[6]
親投稿
Mc mc014483
自由落下の距離(m)=4.8(m)*秒(s)^2だっけ。4.8は不安なのでggってください。あと重力加速度もいる気がします。物理を思い出すか習うかせねば。 何ドットを1mにするかによってリアルさが大きく変わります。注意してくださいね。
1そうだね
プレイ済み
返信[7]
親投稿
say sayer.exe
重力と着地フラグを用いれば簡単? 毎ループ重力が働いてて落ちるとする(G=G+1) 落下先が地面だったら、着地フラグ(CF)を立て、落下してなかったことにする(G=0) ジャンプボタンを押したとき かつ CFが立ってたら重力に逆らう(G=-適当な数値)←「上に落下している」と考えたら合点いくはず 実際の落下処理(Y=Y+G:CF=0)をする ☆着地フラグを下ろしているのは「(Gの値がどうであれ)落下しているから」 だいたいこんな感じ ただ、たぶんこの処理ではふんわりと着地するような気がします
1そうだね
プレイ済み
返信[8]
親投稿
say sayer.exe
書いてみたけど、なんか違うなぁ…
1そうだね
プレイ済み
返信[9]
親投稿
BlackSoft BlackSoft.mkII3g
そういう方のために作ったようなサンプルです。 【E2E323R4】 物理を習うまではちょっと感覚が掴みづらいと思いますが、あなたほどのプログラミング経験値があれば容易に理解できると思います。 一番のポイントは、パラメータを 位置(Y座標)、Y方向の速度、Y方向の加速度 に分けて持つこと。 Mcさんの言うように、 自由落下の距離(m)=0.5*重力加速度*秒(s)^2 ※重力加速度=9.80665 なんですが、「加速度」とは「毎秒の速度の増加量」なので、この意味の通りにプログラムを組んでやれば加速を表現できます。 あとは、動かしながら数値を調整していけばOKです。
1そうだね
プレイ済み
返信[10]
親投稿
加速度っていう概念が分かるかどうかがカギなのかなぁ…? 鉄道好きだからか遅くとも中2には加速度を理解してたけどね。
1そうだね
プレイ済み
返信[11]
親投稿
BlackSoft BlackSoft.mkII3g
高校の数学、物理までを習得すると、ゲーム作りの武器がかなり増えますよね。 例えば、複素数の概念は回転に使えたり。 ちなみに、昔は数I,IIの巻末にBASICの章があったけど、今はどうなんだろう…? 習った記憶はないけど、センターではもちろん得点源(笑)
1そうだね
プレイ済み
返信[12]
親投稿
たかChi takashi_o
サンプルのジャンプ君を覗いても理解が追いつかなかったんですよね…重力加速度… マリオみたくジャンプさせるのは大変なんですねえ…
0そうだね
プレイ済み
返信[13]
親投稿
ΖΕΧ ZEX256
ジャンプしたかっただけで加速度要らなかったのでは
3そうだね
プレイ済み
返信[14]
親投稿
InDoor TheInDoor12
加速度を知らなくても、 「ジャンプすると次第に速度が減少していき、ある一点でマイナスになり、落下する」 ということを知っていればジャンプの軌道は再現できます。 うごメモを少しでも触ったことのある人なら理解しやすいはず。 物理から先に入ると、厳密に位置を求めてしまったりしてむしろわかりずらいかも…
4そうだね
プレイ済み
返信[15]
親投稿
そうですね。アクションゲームにはジャンプが切っても切れ(るっちゃ切れる)ない関係ですね。 私は、キャラクターに重力を与えてみると良いと思います。 具体的には、キャラクター座標X,YのYに変数AYを加算します。 例えば、Aボタンを押してジャンプしたとき、Yの値は減っていきます(昇天します)。 そこでAYの登場です。 AY=AY+0.2 これで重力加速度がでてきます。 Y=Y+AYこうすることで上に逝かずに下に落ちます。 このままだと画面外に堕ちるのでいかないようにしてあげれば良いと思います。 説明下手糞ですいません
2そうだね
プレイ済み
返信[16]
親投稿
ナツキ natukin1978
「スーパーマリオ ジャンプ 実装」でググって見つけたページを参考に書いてみた。【2E35W3E】 Bボタンでイチゴがジャンプします。 一応、十字キーの左右で移動もできます。ジャンプ中の左右の移動を制限したり、やるべき事は沢山ありそうです。 見つけたページによると、前回の座標を保存しておいて座標を計算するやり方だそうです。
2そうだね
プレイ済み
返信[17]
親投稿
これが一番簡単だと思われます
1そうだね
プレイ済み
返信[18]
親投稿
ジャンプ中は移動が制限されます。十字ボタンで移動、aボタンでジャンプ、bボタンでダッシュです。
0そうだね
プレイ済み
返信[19]
親投稿
うわっ、いっぱい来た…ありがたい。 一個一個試してみよう٩( 'ω' )و
4そうだね
プレイ済み
返信[20]
親投稿
だにえる haru2016nen
「お絵かき投稿」に 簡単なサンプル載せときました。
2そうだね
プレイ済み
返信[21]
親投稿
おちゃめ ochame_nako
物理シミュレーションではなくゲームであればジャンプなんて適当で何ら問題はありません。 最初は上方向に移動してある地点で下方向に移動するようにすればジャンプです。 Y座標を1ずつ減らして設定したジャンプの最高地点までジャンプしたらY座標を1ずつ増やしてもジャンプです。 それではカクカクなって嫌というのであればカクカクしない方法にすれば良いです。 ジャンプの軌跡に相応しい関数を使ってジャンプを作れば良いです。 例えば三角関数ならばそれっぽくなりそうなので試しに作ってみたので参考にしてみてください。 三角関数を使うメリットはジャンプの最高到達点と1回のジャンプにかかる時間を簡単に決められるということです。 リスト中の99がジャンプ時の最高時の高さ(99ドット分ジャンプ)で60が時間(1回のジャンプが60フレーム)
1そうだね
プレイ済み
返信[22]
親投稿
おちゃめ ochame_nako
「三角関数等によるジャンプっぽいもの」では自分が考えるジャンプにはならないというのであればその時になって物理的な式を考えてやれば問題ありません。 考えるのは速度(1フレームあたりの移動量)とは別に加速度(1フレームあたりの移動量を増減するもの)があるということです。 基本的に速度というのは力が加わっている間は変化します。 ジャンプの場合は一瞬大きな力が上向きにかかります。 その後は力がかからないかというと無重力空間ではそうなりますが、重力があると常に下向きに力がかかった状態になっています。(下向きの力がないと無重力でのジャンプになってしまい宇宙の彼方へと飛んでいってしまう)
0そうだね
プレイ済み
返信[23]
親投稿
おちゃめ ochame_nako
要するに1回上向きに大きな速度変化があってからそれ以外は下向きに力が加わった状態にすれば良いのです。 プチコン3号の画面座標は上に行くほど小さい値であるためY方向の速度をYV、縦方向の加速度をYAとするとVYの値は最初の一瞬だけYA=-6くらいの値を入れたら良いのですが速度VYは最初は0なので(平地においてジャンプしてない時には上下方向には動いてないため)一瞬しか使わない変数を用意する必要はなくVY=-6(ジャンプした瞬間に上方向の速度がついた状態にする)のようにすれば良いのです。 あとは重力による影響を考えてジャンプ中はVY=VY+0.2とかにすれば良いのです。(もちろん、AY=0.2:VY=VY+AY でもOK)
0そうだね
プレイ済み
返信[24]
親投稿
おちゃめ ochame_nako
ジャンプで注意すべき点は「ジャンプボタン入力判定」と「着地判定」です。 上記、三角関数によるジャンプを見ての通りAボタンでジャンプするならばジャンプはAボタンを押した瞬間に行う必要がありますが、それだとジャンプ中にAボタンをジャンプすれば延々とジャンプが可能です。無限ジャンプが可能なゲームならばこれで問題ありませんが、「空中ジャンプはできない」という設定ならばジャンプを開始したらジャンプフラグに1を入れます。ジャンプフラグが0の時のみジャンプ可能にすれば空中ジャンプを無くすことが簡単にできます。
0そうだね
プレイ済み
返信[25]
親投稿
おちゃめ ochame_nako
次に着地判定ですが、地面が平地であれば座標で行うのが簡単です。 ただし、ジャンプの速度も加速度も整数値で速度が加速度の倍数になっている場合を除き正確に元の場所に到達することはありません。 したがって、ジャンプする前がY=224だったとしてもIF Y==224 THEN 着地処理 なんてことをしてしまうと条件を満たさないのでY>=224とするのがベターでしょう。 もちろん地面に埋まったままでは問題なので着地したらY=224としておくのが良いですね。 着地をした時にジャンプフラグを0にすれば再びジャンプが可能になります。
0そうだね
プレイ済み
返信[26]
親投稿
おちゃめ ochame_nako
正確な物理演算に拘るとジャンプ中に十字ボタンを離した際に左右移動が無くなるのもおかしくなってしまいます。 ありえないくらい超強力な空中ブレーキシステムを搭載ということになるためです。(逆噴射だと反対方向に加速するため一瞬だけ移動を相殺できる何らかの力が働いている必要がある) つまり、ゲームである以上は正確な物理計算の式に拘る必要は全くありません。(空中ジャンプもそもそも物理的にはあり得ない) ジャンプの仕方は無数にあるのですが、自分が「こんなジャンプがいいな」というのができていればそれが正解です。(SIN関数によるジャンプもジャンプなんてどんなやり方でもOKというただの一例にすぎない)
0そうだね
プレイ済み
返信[27]
親投稿
たかChi takashi_o
ジャンプ一つとっても千差万別というか十人十色というか… 折角たくさん例が出たので、一つずつ試してみては?(見ながら入力するのは面倒そうだ が) 自分も試してみましたが(たばすこさん 式、ナツキさん式、ダニエルさん式、おちゃめさん式)、どれも若干感触が違いますね。 ダニエルさん式、たばすこさん式あたりが割とふんわり感かも。
1そうだね
プレイ済み
返信[28]
親投稿
おちゃめ ochame_nako
補足です。 Y方向の初速や重力加速度の決め方がよく分からないというのであれば実際にいろいろな値を試してみて自分がベターだと思うものを選択すれば良いだけなのですが、計算で決めることも可能です。 速度と加速度を使った一般的なジャンプの場合、1回のジャンプにかかる時間はY方向の初速の数値を重力加速度の数値で割ったものの2倍です。 初速が6、重力加速度が0.2ならば6÷0.2×2=60フレームとなります。きちんと割り切れない場合や元の高さに戻らない場合は変わりますが、概算としては十分使えると思います。 ジャンプの高さも概算値であれば初速の2乗÷重力加速度÷2で簡単に求まります。 初速-6、重力加速度が0.2ならば、(-6)×(-6)÷0.2÷2=90ドットなり、およそ90ドットの高さジャンプできます。 したがって、何ブロック分ジャンプさせたいとかあれば簡単に決まります。
0そうだね
プレイ済み
返信[29]
親投稿
おちゃめ ochame_nako
ジャンプの高さには拘りがなくイメージ優先でいくならばふんわりとしたジャンプならば重力加速度を小さくして初速も同じ割合だけ小さめにすれば同じ時間のジャンプでもふわふわした感じになります。 VYの初速が-6、重力加速度が0.2だとしたらこれを-3、0.1のようにすればふわふわするということです。-1.5と0.05のようにすればさらにふわふわします。 シャキッとしたジャンプならば同じ割合で数値を大きくすれば良いです。(重力加速度の大きさでふわふわ感が変わる) 割合を変えれば上記のように1回のジャンプに掛かる時間が変化します。 同じ高さまでジャンプしてふわふわした感じを出すには重力加速度を2分の1にしたら初速をSQR(2)分の1にすると良いです。 ジャンプを自在にコントロールできるとゲームを作るのも楽しくなるのでぜひいろいろ試してみてください。
0そうだね
プレイ済み