mieki256's diary



2013/12/06(金) [n年前の日記]

#4 [dxruby][game] DXRubyで等速度運動と加減速運動を試してみる

今回も、DXRubyを使って、そっち関係の記事を…。いや、もう DXRuby は関係なくて、ただの昔話ばかり書いてる気もしますが…。それはさておき。

昨日の記事で時間ギリギリだったので、今日は少し軽い話にしとこうかなと。…や、昨日のソレは、ソースは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

ちなみに、こういう書き方って、今はあまり主流じゃないのだろうな、とも思うのですけど。

以上です。

過去ログ表示

Prev - 2013/12 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project