効果アニメ再生関数について

投稿者:            mini mosmoss 投稿日:2016/10/02 00:54

2017/4/16バージョンの混在を統一して、一本化した

RPGエディタなどで非戦闘時に演出として効果アニメを再生するための関数、
効果アニメ再生関数です
一部うまくいかないところもありますので、注意書きも付いています

以下のスクリプトを、開始スクリプトにコピペしてください
#効果アニメ再生関数ver1.2(RPGエディタ用)
#スプライト縮小に対応するためのスプライト設定関数
def setSpriteRect2(img,imgw,imgh,x0,y0,w0,h0,x1,y1,w1,h1)
  w2=imgw/512
  h2=imgh/384
  if w2<=1&&h2<=1
    setSpriteRect(img,x0,y0,w0,h0,x1,y1,w1,h1)
  elsif w2>h2
    setSpriteRect(img,x0/w2,y0/w2,w0/w2,h0/w2,x1,y1,w1*w2,h1*w2)
  else
    setSpriteRect(img,x0/h2,y0/h2,w0/h2,h0/h2,x1,y1,w1*h2,h1*h2)
  end
end

#効果アニメ再生関数ver1.2本編(RPGエディタ用)
def anime(id,imgw,imgh,w,h,koma,pt,play_no,speed,x,y, se)
#画像id,画像全体の横幅、画像全体の縦幅、一コマの横幅、一コマの縦幅、一行のコマ数、パターン数、パターン再生回数、再生スピード、効果アニメ表示位置x座標、効果アニメ表示位置y座標、効果音
speed=speed*1000
#使いやすそうな速さが千の単位なので調整

if play_no==0
#指定再生回数がゼロのとき再生しない
else

#キャンパスがビジブル状態になっているか否かの判定
#ビジブルでない場合、ビジブル状態にする
#RPGエディタで必要な確認
  if getCanvasVisible()
  else
     setCanvasVisible(true)
  end

#ここからスプライト設定
#スプライト生成
img_name="img"
    #画像ハンドル名はimgにしてみました   #お好みで変えてください
    setVariable(img_name, createSprite(id))   
    setSpriteRect2(getVariable(img_name),imgw,imgh,       0, 0, w, h, 0, 0, w, h)
    setSpriteZOrder(getVariable(img_name), 10) #zオーダーはとりあえず10
    setSpritePosition(getVariable(img_name), x, y) #効果アニメ再生位置 

#スプライトの描画
#スプライト変更
 def setAnimeSprite(img_name,no,w,h,x,y,imgw,imgh,koma)
#スプライト画像のハンドル名、スプライト番号、一コマあたりの横幅、一コマあたりの縦幅、表示位置のx座標、表示位置のy座標、スプライト画像全体の横幅、スプライト画像全体の縦幅、スプライト画像の一行あたりのコマ数
#no(スプライト番号)というのは、スプライト画像の何番目のコマを表示するか、というもの
#スプライト画像の左上から右下へ向かって、1から始まる番号を振っている、0以下にすると何も表示しない

    get_x = 0;    get_y = 0;    get_w = w;   get_h = h
    set_x = 0;    set_y = 0;    set_w = w;   set_h = h

a=floor(no/koma) #行数
b=no-(a*koma) #余

if no<=0
        get_w = 0;    get_h = 0
        set_w = 0;    set_h = 0
elsif no<=koma
        get_x = w*(no-1)
else

  case b
    when 0
        get_x=w*(koma-1)
        get_y=h*(a-1)
    else
        get_x=w*(b-1)
        get_y=h*a
  end
end #if no<=0

setSpriteRect2(getVariable(img_name),imgw,imgh,get_x, get_y, get_w, get_h, set_x, set_y, set_w, set_h)

#スプライトの描画
    drawCanvas()
end #def setAnimeSprite

#ここから再生開始
if se #効果音が設定されていれば再生
playSound(se)
else
end

play=0
count=0
frame=1
setAnimeSprite(img_name,frame,w,h,x,y,imgw,imgh,koma)
loop=true
   while loop

      count=count+1
       if count >= speed #スピードを考慮しつつ再生
          count=0
          frame=frame+1
          setAnimeSprite(img_name,frame,w,h,x,y,imgw,imgh,koma) #描画
       end
      
       if frame-1>=pt #一セット再生するごとにカウント
       frame=0
       play=play+1
         if play>=play_no #設定した再生数を満たしたらループ終了
           setAnimeSprite(img_name,frame,w,h,x,y,imgw,imgh,koma) #効果アニメを消す
           loop=false
         end #if
       end #if

   end #while loop
end #if play_no==0
end #def anime


実際の使用例(各イベントエディタ内には次のように書きます)
#anime(id,imgw, imgh,w,h,koma,pt,play_no,speed,x,y, se)
#画像id,画像全体の横幅、画像全体の縦幅、一コマの横幅、一コマの縦幅、一行あたりのコマ数、パターン数、パターン再生回数、再生スピード、効果アニメ表示位置x座標、効果アニメ表示位置y座標、効果音id

anime(312387,256,64,32,32,8,16,1,10,150,150) #効果音は設定していないので書くのを省略しています


以下のサンプルゲームで黄色い花を調べると近くに
mochi3kan様の作った光アニメが再生されます
光アニメで白背景なので環境によっては見にくいかと思います
その場合はお近くの雪だるまに話しかけて画面を暗くしてご覧下さい




各引数の説明です

<画像id>
この関数では一枚絵を使用します
効果アニメ素材のidをここに書いても再生できずエラーになります
効果アニメ画像を一枚絵として再アップロードして一枚絵のidを使用します

なお、この関数の核であるスプライト/拡張画像操作の仕組みに興味を持たれた方は
関数リファレンス・wikiと合わせて次の記事を読むといいかもしれません
aoihikawaさんの「Rmakeで自由なゲームを作ろう」の講座のスプライトの部分(第01~03話)
rurun9さんのつくってみようシリーズのスプライトの部分http://page.rmake.jp/wikis/49/
cfm_さんのスプライトの説明http://page.rmake.jp/wikis/399

<画像全体の横幅、縦幅>
RPGエディタでは画面サイズより大きい画像を使用すると自動的に画面サイズに収まるよう
縮小されてしまうという仕様があります
そのため、画像全体の横幅と縦幅のデータを取って縮小されたものをもう一度拡大するという作業を行っています

<一コマの横幅、一コマの縦幅>
この関数ではアニメ画像の一コマが正方形でなくても使用できます
この関数用の効果アニメ画像を自作する際には自由度が高くなります
ただし、すべてのコマを同じ大きさにすることと
後述のように、画像全体の大きさには気をつけて下さい

<一行あたりのコマ数・パターン数>
使用する効果アニメ画像が何パターンから成っているのかを設定します

例1:1行3コマ10パターン
123
456
789
10

例2:1行1コマ6パターン







例3:1行10コマ30パターン

12345678910
11121314151617181920
21222324252627282930

こんな感じにある程度の自由なコマの並びに1つの関数で対応しています
ただし一コマの大きさは全て同じでないと正常に再生されません

<パターン再生回数>
1パターンを何回再生するかを設定します
設定した回数分の再生が終了するまで他のことができませんので注意してください

<再生スピード>
再生するスピードを設定します
1だと普通で10だと結構遅いです
1より速く再生したい場合は0.8の様に小数点を使ってください

<効果アニメ表示位置x座標、効果アニメ表示位置y座標>
効果アニメを画面上のどの位置で再生するかを設定します
xとyの座標ですが、
例えばRPGエディタの場合は画面サイズが512*384ですので
xは512、yは384以上の数値にしてしまうと画面からフレームアウトします
RPGエディタで使うイベントの座標とは違う体系の数値なので
混同しないように気をつけてください

<効果音id>
マップに登録してある効果音をアニメの再生と同時に再生することができます
もし効果音を使わない場合は、数値を何も書かないことで省略できます


以下注意事項です

注意事項

<RPGエディタでこの関数を使用する場合>

RPGエディタでは画面に対して大きすぎる画像を自動で縮小してしまう仕様があります
この仕様は効果アニメ再生関数にも影響を及ぼします
具体的には、効果アニメ画像として使う一枚絵全体の大きさが
画面サイズ(512*384)を超えれば超えるほど、画質が荒くなってしまいます

(例えば一コマ128*128、16パターンのアニメ画像の場合、
スプライト元の画像の大きさは1024*256ですが、
これを自動時に512*384の画面サイズに収まるように
(この例の場合512*128に)縮小してしまい、
その後でこの関数が、もう一度元のサイズに拡大するため解像度が落ちてしまう)

参考:cfm_さんのブログ記事「巨大な画像のスプライトの表示

画像全体の横幅が512px以内、かつ画像全体の縦幅が384px以内
については通常の解像度で再生できます

<ノベルエディタでこの関数を使いたい場合>

サウンドノベルを作っている場合など、
メインループを使ったゲーム作りではないけどノベルエディタで
アニメ再生関数を使いたいという時は、
def anime 内と def setAnimeSprite 内の、 setSpriteRect2 を
通常のsetSpriteRectに書き換えれば使えます(引数からimg_w,img_hを削除するのを忘れずに)
setSpriteRect2をdef文で定義してる部分の関数も要りませんので削除してくださってオーケーです




<その他の注意点>
現バージョンでは、画像の大きさが画面サイズを超えて大きければ大きいほど
再生時のサイズも実際の一コマの大きさより大きく引き伸ばされて表示されてしまいます
原因はよくわかっていません
現象を確認したい方は
サンプルゲームの開始位置から階段を上ったところの両側にある木を
左右それぞれ調べて効果アニメを確認してください
左はver1.1の関数で再生した1920*240の画像で
右はver1.2の関数で再生した960*480の画像です

ですので、なるべく画像の質を落としたくない場合は
幅512:縦384の比率になるべく近い形で、一枚絵の縦横比を調整するといいでしょう

<今後のバージョンアップの可能性>
・上記の、サイズが実際のサイズと違う問題を解決する
・再生アニメの大きさを設定できる
・アニメーションが再生されながら簡単な軌道で移動する
・2つ以上のアニメーションを同時に再生する

上のような改良は、したいなとは思うものの予定は立っていません…

コメントする

コメントするには、ログインする必要があります。

コメント一覧

         mini mifa(投稿日:2016/10/09 14:41, 履歴)
こんにちは、すごい!動いた!!

サンプルゲームの効果だけでも、かなり表現の幅が広がると思います。
とにかく大変そうな、作業ですね。おつかれさまでした。
ゲームに組み込んでみたいなぁ。できるのかなぁ。
            mini mosmoss(投稿日:2016/10/09 17:34, 履歴)
mifaさんこんにちは(^ω^っ)3
基本のスクリプトは、aoihikawaさんがノベルゲーム用に教えてくれていることの
RPGエディタ移植なので私でも1時間くらいでできるのですが、
RPGエディタでのスプライトの仕様が難しいため多少手こずってます。
素材を公開するときはイベントにコピペする用の関数もつけたりして
あまり深く考えずに使えるようにしておきたいですね

効果アニメ素材の公開(ぴぽやさんのエフェクト素材の再配布)は、
来週の平日の仕事にしようと思ってます
            mini mosmoss(投稿日:2016/10/06 00:39, 履歴)
関数を更新しました
ver1.1(記事上部に記載)
画像サイズの制限がなくなり
大きいサイズのアニメを再生可能になった
引数に画像全体の横幅と縦幅が追加

ver1.2(記事下部に記載)
1.1と同じ機能を持ちながら、
パターン数に制限がなくなり、
横8枚縦2列の並び方に限らずに効果アニメを再生できるようになった
例:一行3コマ、縦10列、28パターンなど
引数に、一行あたりのコマ数が追加された

注意点
現バージョンでは、画像の大きさが画面サイズを超えて大きければ大きいほど
再生時のサイズも実際の一コマの大きさより大きく引き伸ばされて表示されてしまう
原因はよくわかっていない
現象を確認したい人は
サンプルゲームの開始位置から階段を上ったところの両側にある木を
左右それぞれ調べてみてください
左はver1.1の関数で再生した1920*240の画像
右はver1.2の関数で再生した960*480の画像
            mini ネコム(投稿日:2016/10/02 16:31, 履歴)
こいつ...動くぞ!(効果アニメ

これは色々な用途で使えそうですね、
丁度RPGを作っていたので早速使わせて頂きます!
            mini mosmoss(投稿日:2016/10/02 17:38, 履歴)
普段使っているマップ座標と違い、表示中の画面のピクセル座標を使うので
使いにくいところもあるかと思います

使ってみて、ここがわかりにくいぞ、というところがありましたら
バルス!とこちらに書いていただけると嬉しいです

使いやすいように直せるかはわからず
「さんざん苦労してこれっぽっちさ…」という結果になるかもしれませんが

後から使おうかな〜と見に来た人が
「見ろ…!この関数はゴミのようだ…!」
などと参考にできるかと思われます(;ω;)
            mini ネコム(投稿日:2016/10/02 18:04, 履歴)
早速使って見たのですが、
一つ気になる事がありまして、質問させていただきます。

anime(一枚絵id, 32, 32, 8, 1, 1, 160, 170, 効果音id)

上記の設定で使用してみたところ、
何故かアニメーションが二回再生されてるように感じます。

また、パターン再生回数の引数を0にして試しても同様でした。

もし、こちらの設定ミスでしたら申し訳ないです。
            mini mosmoss(投稿日:2016/10/02 18:20, 履歴)
報告ありがとうございます(^^)
了解しました。
現在サンプルゲームで使用中の素材の場合は、
再生回数が反映されていますが、ご指摘の通りに、
再生回数ゼロと1は同様に1回再生になっています。
ゼロはゼロ回にした方がいいと思いますので後で修正します。

色々なサイズ、パターン数で確認していないので
頂いた情報を試すついでに他にも幾つか試してみます。
夜に関数を更新する際に、経過報告をします(^^)

お忙しいところ、詳細なご報告を頂きありがとうございました(^ω^っ)3
            mini mosmoss(投稿日:2016/10/02 19:15, 履歴)
試しながら発見したんですが、
1234
5678
上のように8枚を配置していると
anime(一枚絵id, 32, 32, 8, 1, 1, 160, 170, 効果音id)を読んだ時に
1234を二回繰り返すモーションになります
ご報告頂いた内容は1~8を2回くり返すということでしたので
まだ原因には至っておりませんが、近いとこまでいっているのかも
12345678
上のように8枚を配置した場合には、
お寄せいただいた、関数のコピペ
anime(一枚絵id, 32, 32, 8, 1, 1, 160, 170, 効果音id) で正常に作動しました

まだこの関数について把握できてないところがあるようで
我ながら心配です(~ω~;)
それと0回再生ができるように関数を改善できました!(^ω^)
ありがとうございます(^ω^っ)3
            mini ネコム(投稿日:2016/10/02 20:16, 履歴)
忙しい中、ありがとうございます。

こちらで設定していた画像は
12345678
このような配置でしたので、おそらく正常なはずです...

それと、現在確認したところ、mosmossさんのおっしゃる様に
1234x2回再生されているようです。

もしかすると、画像ファイルのサイズが関係していたり
しているかもしれません。(スクリプトを見てないので詳しくはわからないです)

            mini mosmoss(投稿日:2016/10/02 20:24, 履歴)
わぁ、重ねて報告いただき、新情報もありがとうございます!
いろいろ試してみてはいるんですが、進展もアイデアもなく行き詰まり気味です(+ω+)
もし差し支えないようでしたら、ご利用されている素材をメッセージで送っていただけますか?
ネタバレ防止などもありますので画像サイズだけでも構いません

今思いついたんですが、自分で試した時は、
16パターンの画像で8パターン再生していました
256*32の横一列の画像はまだ試してませんでしたのでやってみますね
しばらくお待ち下さい
            mini mosmoss(投稿日:2016/10/02 20:47, 履歴)
32の正方形のコマを横に8枚並べた256*32の素材でも
1~8の一回再生でした(xωx)進展なくてゴメンなさい
いいバグ情報ありがとうございます、直したいっ(xωxっ)3
            mini ネコム(投稿日:2016/10/03 12:47, 履歴)
何度も試行錯誤して頂き申し訳ないです。

今、mosmossさんの仰る画像サイズ 256*32で
試したところ、正常な動作をしました。
おそらくこちらの画像サイズの問題でした..すみません。

ちなみに自分が設定していた画像サイズは768*192です。

武器やアイテムにつける効果アニメでは画像サイズは
関係なく、設定が合っていれば読み込んでくれていたので、
まさかサイズが関係してるとは知りませんでした...

今回は誤った不具合報告をしてしまい、申し訳ありませんでした。
            mini mosmoss(投稿日:2016/10/03 22:35, 履歴)
ありがとうございます!なるほど!
まさかサイズが関係してるとは思いませんよね
RPGエディタのスプライトに関する設定は
少し変わっていてあんまり直感的ではありません
もともとはユーザーの使いやすさを考慮して作られた仕様なのですが
その後アップデートを重ねて機能を拡張したために
マイナスの面が目立つようになってしまったようです
今回の件は、
武器やアイテムにつける効果アニメの画像サイズに制約がない一方で
RPGエディタの一枚絵には画面サイズ(横512か縦384)を超えると
自動的に縮小がかかってしまうという仕様があるにもかかわらず
「効果アニメ画像をそのまま一枚絵としてアップロードする」
「一コマ64*64のアニメまでは大丈夫」
といった私の説明のせいでネコムさんに余計なお時間を使わせてしまった、
というのが真相のようです
(通常の効果アニメが、規定を満たしていればサイズ(余白)が大きくても大丈夫
ということも知らなかったので、勉強になりました^ω^)
大変ご迷惑をおかけしました(_ _)

これは関数を作ってる側は気付きにくくて使う側は陥りやすいところなので
原因がわかってよかったです
説明文などを工夫すると同時に、
これからRPGエディタで使える関数を作る時のチェック項目にも入れておきます
また、RPGエディタに関するスプライトのこの仕様についても改めて要望を出しておきます
(装備コストなどが高ければ実装は難しいでしょうが)
それと、これから改善予定のバージョンでは
画像サイズに制限なく使えるようになります
(画面サイズを超えるとだんだん画像が荒くなっていきますが)
ネコムさん、改めまして、今回はいろいろ教えていただいてありがとうございました(^ω^)
Material 303531 2 mini mochi3kan(投稿日:2016/10/02 12:56, 履歴)
こんにちは、これすごいですね!
大きいアニメが再生できるようになったら
単調になりがちなRPGもぐっと盛り上がりそうですね。
            mini mosmoss(投稿日:2016/10/02 13:14, 履歴)
ありがとうございます〜!
透過前景を暗めにするとmochi3kanさまのアニメ画像の綺麗さが出ていい感じです

再生する位置の座標が、イベントの座標と違うところと
引数が結構多くなっちゃうところが
割と使いにくい&とっつきにくいと思いますが
ちょっとツクールに近い演出ができるかもしれません

cfm_さんのブログ記事を思い出したので
大きい画像も再生できるようになりましたが
(後で関数を更新します)画質が荒くなります
それがどの程度ひどくなるのかはちょっと実験してみます

あとは複数のアニメーションを同時に再生、
再生させながら移動させる、などもできるかもしれません
どの程度手軽に使える形にできるかはちょっとわかりませんが