2013/12/06(金) [n年前の日記]
#4 [dxruby][game] DXRubyで等速度運動と加減速運動を試してみる
今回も、DXRubyを使って、そっち関係の記事を…。いや、もう DXRuby は関係なくて、ただの昔話ばかり書いてる気もしますが…。それはさておき。
昨日の記事で時間ギリギリだったので、今日は少し軽い話にしとこうかなと。…や、昨日のソレは、ソースは1時間ぐらいで書けたのですけど、blenderでモデル作るだけで半日かかっちゃって…。あんなヘボ画像でも、ボディ部分のモデルは3回作り直してたり…。ホントは超兄貴みたいな画像にしたかったんですけど、これが全然そんなレベルにはならず…。モデリングを仕事にしてる人達、絵描きさん達はやっぱりスゴイと再認識ですよ…。
さて本題。自分、何かしらを動かす時に、好きな動きというか、好きな書き方があるのです。そのあたりを紹介してみようかなと。
例えば。メニュー画面で十字キーを押すと、各項目に向かってカーソルが動いていく、といった処理を書かなきゃいけない場合。さて、カーソルに、どういう動きをさせますかね?
真っ先に思いつくのは、等速度運動ですかね。等速度、つまり、速度が一定の動きです。こんな感じの動きかなと。
たしかにコレでも仕様は満たせますが。自分はどうも、物足りなさを感じてしまって…。
そこで、加減速運動(?)をさせることが多いのです。
ちなみに。以前、DXRuby を使って _Anime PV Easy Maker ZERO てのを書いたんですけど。メニューがヒュンヒュンと動くあたりは、全部こういう書き方をしています。お気に入りなんです。この動き。
ただ、この書き方、ちょっと問題があって。
コレ、いつまで経っても、目標座標に到達してくれないのですよ…。なんだかちょっと、 _「アキレスと亀」 みたいな状態ですから。いや、この場合、亀は止まってますけど。
なので、「一定距離まで近づいたら、強制的に、現在座標を目標座標で上書きする」という処理が必要になりまして。
まあ、こういう動きが自分は好きでよく使ってます。てなだけの話でした。
一応ソースと画像も置いときます。Public Domainってことで。
_movetest.zip
ちなみに、こういう書き方って、今はあまり主流じゃないのだろうな、とも思うのですけど。
昨日の記事で時間ギリギリだったので、今日は少し軽い話にしとこうかなと。…や、昨日のソレは、ソースは1時間ぐらいで書けたのですけど、blenderでモデル作るだけで半日かかっちゃって…。あんなヘボ画像でも、ボディ部分のモデルは3回作り直してたり…。ホントは超兄貴みたいな画像にしたかったんですけど、これが全然そんなレベルにはならず…。モデリングを仕事にしてる人達、絵描きさん達はやっぱりスゴイと再認識ですよ…。
さて本題。自分、何かしらを動かす時に、好きな動きというか、好きな書き方があるのです。そのあたりを紹介してみようかなと。
例えば。メニュー画面で十字キーを押すと、各項目に向かってカーソルが動いていく、といった処理を書かなきゃいけない場合。さて、カーソルに、どういう動きをさせますかね?
真っ先に思いつくのは、等速度運動ですかね。等速度、つまり、速度が一定の動きです。こんな感じの動きかなと。
# 動きのテスト。等速度運動 require 'dxruby' font = Font.new(24) img = Image.load("ufo.png") CNTMAX = 60 cnt = 0 x = 0 # 現在座標 y = 0 tx = 0 # 目標座標 ty = 0 dx = 0 # 速度 dy = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) if cnt % CNTMAX == 0 # 1秒ごとに現在座標と目標座礁を初期化 x = 0 y = 0 tx = Window.width ty = Window.height dx = (tx - x).to_f / CNTMAX dy = (ty - y).to_f / CNTMAX end # 等速度運動 x += dx y += dy # 目標座標に到達したらメッセージを描画 if x == tx and y == ty Window.drawFont(32, 32, "到達", font) end Window.draw(x - img.width / 2, y - img.height / 2, img) cnt += 1 end
たしかにコレでも仕様は満たせますが。自分はどうも、物足りなさを感じてしまって…。
そこで、加減速運動(?)をさせることが多いのです。
# 動きのテスト。加減速 require 'dxruby' font = Font.new(24) img = Image.load("ufo.png") CNTMAX = 60 cnt = 0 x = 0 # 現在座標 y = 0 tx = 0 # 目標座標 ty = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) if cnt % CNTMAX == 0 # 1秒ごとに現在座標と目標座礁を初期化 x = 0 y = 0 tx = Window.width ty = Window.height end # 加減速運動 x += (tx - x) * 0.2 y += (ty - y) * 0.2 # 目標座標に到達したらメッセージを描画 if x == tx and y == ty Window.drawFont(32, 32, "到達", font) end Window.draw(x - img.width / 2, y - img.height / 2, img) cnt += 1 end現在座標と目標座標の差を1/nにして、現在座標に足すという処理です。等速度運動より、なんかちょっぴりカッコイイ感じがしませんか? 自分だけかな? また、ソースを見れば分かりますけど、速度を管理しなくて済むあたりも、ちょっとだけ美味しくて。
ちなみに。以前、DXRuby を使って _Anime PV Easy Maker ZERO てのを書いたんですけど。メニューがヒュンヒュンと動くあたりは、全部こういう書き方をしています。お気に入りなんです。この動き。
ただ、この書き方、ちょっと問題があって。
コレ、いつまで経っても、目標座標に到達してくれないのですよ…。なんだかちょっと、 _「アキレスと亀」 みたいな状態ですから。いや、この場合、亀は止まってますけど。
なので、「一定距離まで近づいたら、強制的に、現在座標を目標座標で上書きする」という処理が必要になりまして。
# 動きのテスト。加減速。目標座標に近づいたら現在座標を設定する版 require 'dxruby' font = Font.new(24) img = Image.load("ufo.png") CNTMAX = 60 cnt = 0 x = 0 # 現在座標 y = 0 tx = 0 # 目標座標 ty = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) if cnt % CNTMAX == 0 # 1秒ごとに現在座標と目標座礁を初期化 x = 0 y = 0 tx = Window.width ty = Window.height end # 加減速運動 x += (tx - x) * 0.2 y += (ty - y) * 0.2 # 目標座標に近づいたら現在座標を設定する x = tx if (tx - x).abs < 0.5 y = ty if (ty - y).abs < 0.5 # 目標座標に到達したらメッセージを描画 if x == tx and y == ty Window.drawFont(32, 32, "到達", font) end Window.draw(x - img.width / 2, y - img.height / 2, img) cnt += 1 end現在座標を変更した直後に、ちょっと条件判定してますよね。こうしないと、目標座標に到達してくれない。このへんが、ちょっともにゃもにゃした気分に…。
まあ、こういう動きが自分は好きでよく使ってます。てなだけの話でした。
一応ソースと画像も置いときます。Public Domainってことで。
_movetest.zip
ちなみに、こういう書き方って、今はあまり主流じゃないのだろうな、とも思うのですけど。
[ ツッコむ ]
以上です。