mieki256's diary



2013/12/04(水) [n年前の日記]

#4 [dxruby][game] DXRubyでインチキ多関節を試してみる

DXRuby Advent Calendar という企画の話を聞いて、自分が書けそうなネタなんてあるのかなと悩んでしまったわけですが。Ruby や DXRuby については初心者なので書けないとしても、アクションゲームのソレなら書けるのかな…と思えてきたり。

とりあえず、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値をy座標に足してみた


全然動かないのもつまんないですわな…。根元に与える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値の角度を毎フレーム変えてみる


イイ感じの動きになってきましたけど…根元がグングンと上下に動いちゃうのが気に入らない…。根元から、先っぽまで、少しずつ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

明日も何か書いてみよう…。練習練習…。

以上です。

過去ログ表示

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