2013/12/04(水) [n年前の日記]
#4 [dxruby][game] DXRubyでインチキ多関節を試してみる
DXRuby Advent Calendar という企画の話を聞いて、自分が書けそうなネタなんてあるのかなと悩んでしまったわけですが。Ruby や DXRuby については初心者なので書けないとしても、アクションゲームのソレなら書けるのかな…と思えてきたり。
とりあえず、DXRuby Advent Calendar 云々とは全然関係なく、そういうのをちょこちょこ書いて、その手の記事を書く練習をしてみようかなと。
ということで。ふと思いついたネタとして、インチキ多関節とかどうだろうと。見た目は多関節キャラっぽいけど、内部処理は多関節なの? なんか違うんじゃないの? でも、見た目がソレっぽいから別にコレでもいいか、みたいなソレ。
もちろん、使用言語・使用ライブラリは、Ruby + DXRuby を使います。
まず、根っこから先っぽまで、複数のスプライトを使って、一直線に繋ぐことを試してみましょうかね…。
このままだと見た目がつまんないですよね。各関節?のy座標に、sin値を足して、少し形を変えてみましょうか。
全然動かないのもつまんないですわな…。根元に与えるsin値の角度をずらしてみましょう。1フレーム毎に、10度ずつ足してみることにします。
イイ感じの動きになってきましたけど…根元がグングンと上下に動いちゃうのが気に入らない…。根元から、先っぽまで、少しずつsin値の幅を変化させていくことにしましょうか。
うむ。なんとなく、コイツをムチで倒してやりたい気分になってきたぞ。後はムチ男を作るだけ。なんちてぽっくん。
とまあ、こんな感じに、たったコレだけのスクリプトソースを書くだけで、サクサクと動きを試せてしまうところが、DXRuby のいいところじゃないかなと自分は思っているのでした。気軽に実験できるあたりが、実にイイ感じです。
ソースと画像は、ここに置いときますね。Public Domainってことで。
_inchiki_takansetsu.zip
明日も何か書いてみよう…。練習練習…。
とりあえず、DXRuby Advent Calendar 云々とは全然関係なく、そういうのをちょこちょこ書いて、その手の記事を書く練習をしてみようかなと。
ということで。ふと思いついたネタとして、インチキ多関節とかどうだろうと。見た目は多関節キャラっぽいけど、内部処理は多関節なの? なんか違うんじゃないの? でも、見た目がソレっぽいから別にコレでもいいか、みたいなソレ。
もちろん、使用言語・使用ライブラリは、Ruby + DXRuby を使います。
まず、根っこから先っぽまで、複数のスプライトを使って、一直線に繋ぐことを試してみましょうかね…。
# インチキ多関節その1 # 根元と先っぽを等間隔で繋いでみる require 'dxruby' img = Image.load("ufo.png") Window.loop do break if Input.keyPush?(K_ESCAPE) # 根元 bx = 0 by = Window.height / 2 # 先っぽ。マウスカーソル座標を取得 tx = Input.mousePosX ty = Input.mousePosY nmax = 32 # 32個のスプライトで繋ぐ dw = tx - bx dh = ty - by nmax.times do |i| x = bx + (dw * i / nmax) - img.width / 2 y = by + (dh * i / nmax) - img.height / 2 Window.draw(x, y, img) end end
このままだと見た目がつまんないですよね。各関節?のy座標に、sin値を足して、少し形を変えてみましょうか。
# インチキ多関節その2 # 各関節のy座標に、sin値を足してみる require 'dxruby' img = Image.load("ufo.png") Window.loop do break if Input.keyPush?(K_ESCAPE) # 根元 bx = 0 by = Window.height / 2 # 先っぽ tx = Input.mousePosX ty = Input.mousePosY nmax = 32 dw = tx - bx dh = ty - by deg = 0 # sin値に掛ける値。sin値は -1.0〜1.0 の値なのでそのままだと小さ過ぎる h = 100 nmax.times do |i| x = bx + (dw * i / nmax) - img.width / 2 y = by + (dh * i / nmax) - img.height / 2 y += h * Math.sin(deg * Math::PI / 180.0) # sin値を足してる Window.draw(x, y, img) deg += 30 end end
全然動かないのもつまんないですわな…。根元に与えるsin値の角度をずらしてみましょう。1フレーム毎に、10度ずつ足してみることにします。
# インチキ多関節その3 # 根元に加えるsin値の角度を毎フレームずらしてみる require 'dxruby' img = Image.load("ufo.png") # 根元に加えるsin値の角度 startdeg = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) # 根元 bx = 0 by = Window.height / 2 # 先っぽ tx = Input.mousePosX ty = Input.mousePosY nmax = 32 dw = tx - bx dh = ty - by deg = startdeg h = 100 nmax.times do |i| x = bx + (dw * i / nmax) - img.width / 2 y = by + (dh * i / nmax) - img.height / 2 y += h * Math.sin(deg * Math::PI / 180.0) Window.draw(x, y, img) deg += 15 end startdeg += 10 # 根元の角度を毎フレーム増やす end
イイ感じの動きになってきましたけど…根元がグングンと上下に動いちゃうのが気に入らない…。根元から、先っぽまで、少しずつsin値の幅を変化させていくことにしましょうか。
# インチキ多関節その4 # 各関節に加えるsin値の幅を変えてみる require 'dxruby' img = Image.load("ufo.png") startdeg = 0 Window.loop do break if Input.keyPush?(K_ESCAPE) # 根元 bx = 0 by = Window.height / 2 # 先っぽ tx = Input.mousePosX ty = Input.mousePosY nmax = 32 dw = tx - bx dh = ty - by deg = startdeg h = 100 nmax.times do |i| x = bx + (dw * i / nmax) - img.width / 2 y = by + (dh * i / nmax) - img.height / 2 hh = h * i / nmax # 幅を少しずつ大きくしていく y += hh * Math.sin(deg * Math::PI / 180.0) Window.draw(x, y, img) deg += 15 end startdeg += 10 end
うむ。なんとなく、コイツをムチで倒してやりたい気分になってきたぞ。後はムチ男を作るだけ。なんちてぽっくん。
とまあ、こんな感じに、たったコレだけのスクリプトソースを書くだけで、サクサクと動きを試せてしまうところが、DXRuby のいいところじゃないかなと自分は思っているのでした。気軽に実験できるあたりが、実にイイ感じです。
ソースと画像は、ここに置いときますね。Public Domainってことで。
_inchiki_takansetsu.zip
明日も何か書いてみよう…。練習練習…。
[ ツッコむ ]
以上です。