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
ちなみに、こういう書き方って、今はあまり主流じゃないのだろうな、とも思うのですけど。
[ ツッコむ ]
以上です。


