2013/12/15(日) [n年前の日記]
#3 [dxruby][game] DXRubyでペガサス流星拳
聖闘士星矢Ωの感想記事を書いているうちに、「その、ペガサス流星拳の表現って、DXRubyで試せないのかな?」と思えてきまして。
1秒間に100発打てるということは、アニメは1秒間24コマだから、100/24 = 4.166...。1コマにつき、約4発、パンチを描けばいいのですかね?
まあ、ちゃんとした絵で描かれてたら、カッコよく見えるのかもしれないか。それと、今ならCGが使えるから、例えば流星みたいなパーティクルも一緒に飛ばして、とかやれたりするのかも。もしかしたら、自分がぼんやり見ていて気づかなかっただけで、星矢Ωの中でも、既にそういう工夫を施したカットがあったのかもしれませんな…。
とりあえず、画像とソースを置いときます。Public Domain ってことで。
_ryuuseiken.zip
妙なことを思いついたら、すぐに試せるあたりが、DXRuby のいいところですな。もちろん、こういうのは、Ruby/SDL でも PyGame でも HSP でも Processing でも、何使ってもいいんですけど。Windows上で動かしたときに爆速描画な点と、使い方が簡単な点が、DXRuby のいいところ、とも思います。
1秒間に100発打てるということは、アニメは1秒間24コマだから、100/24 = 4.166...。1コマにつき、約4発、パンチを描けばいいのですかね?
# ペガサス流星拳 require 'dxruby' bodyimg0 = Image.load("body1.png") bodyimg1 = Image.load("body2.png") punchimg = Image.load("punch.png") # パンチを出す中心位置 punch_bx, punch_by = 210, 300 cnt = 0 framerate = 24 Window.fps = framerate # 24FPSに設定 Window.loop do break if Input.keyPush?(K_ESCAPE) if cnt < framerate Window.draw(0, 0, bodyimg0) else Window.draw(0, 0, bodyimg1) # 1秒間で100発ということは、 # 1/24秒なら、約4発 4.times do |i| c = (cnt - framerate + 8.0).to_f / framerate.to_f x = punch_bx + (rand(400) - 200) * c - punchimg.width / 2 y = punch_by + (rand(200) - 100) * c - punchimg.height / 2 scale = 1.0 + (1.5 * (cnt - framerate).to_f / framerate.to_f) * rand() angle = rand(45) - 22.5 Window.drawEx(x, y, punchimg, :angle => angle, :scalex => scale, :scaley => scale) end end cnt += 1 cnt = 0 if cnt > framerate * 2 endGIFアニメにした段階でフレームレートが怪しいことになってますけど。こんな感じだった…のかな…。うーん。記憶の中にあったソレより、全然ショボイ…。どうやら、かなり脳内美化をしちゃってたような気がしてきました。
まあ、ちゃんとした絵で描かれてたら、カッコよく見えるのかもしれないか。それと、今ならCGが使えるから、例えば流星みたいなパーティクルも一緒に飛ばして、とかやれたりするのかも。もしかしたら、自分がぼんやり見ていて気づかなかっただけで、星矢Ωの中でも、既にそういう工夫を施したカットがあったのかもしれませんな…。
とりあえず、画像とソースを置いときます。Public Domain ってことで。
_ryuuseiken.zip
妙なことを思いついたら、すぐに試せるあたりが、DXRuby のいいところですな。もちろん、こういうのは、Ruby/SDL でも PyGame でも HSP でも Processing でも、何使ってもいいんですけど。Windows上で動かしたときに爆速描画な点と、使い方が簡単な点が、DXRuby のいいところ、とも思います。
[ ツッコむ ]
以上です。