エフェクトを段階的にする

これまで、ページやアイコンにいろいろエフェクトをかけてきました。
既存エフェクトの中には、「アイコンが集まって」→「グルグル回って」→「アイコンが切り替わって」→「定位置に戻る」というものがあります。
これまで紹介したやり方では、完結しないエフェクトです。
これは、エフェクトの開始から終了までをいくつかの段階に分け、それぞれでエフェクトを作り込んでいます。

ここでは、幾つかの段階に分けて、違うエフェクトを組合わせてみます。


考え方

当サイトのサンプルは、開始から終了までのタイミングを、percentで管理しています。
ですので、このpercentを上手く利用して、段階的なエフェクトを与えることを考えます。

では、どのようにpercentを分ければ良いのでしょうか。
簡単な方法は、if文を使う方法です。
例えば・・・
1:percentが0.3未満なら回転させる
2:percentが0.5未満なら回転を止める
3:そうでなければ縮小して消える

こんな感じでやれば、何とかできそうですね。

サンプル

とりあえず、先ほどの例をプログラミングしてみました。

return ( page, offset, screen_width, screen_height)
 local percent = offset/page.width
 local angle = percent*math.pi*2

 page:translate( offset )

 if( percent < 0.3 ) then
  page:rotate( -angle )
 elseif( percent < 0.5 ) then
  page:rotate( -0.3*math.pi*2 )
 else
  page:scale( 1-percent )
 end
end

effect26_1

おそらくバグだらけなのでしょうけど、1つ1つ解説します。


if( percent < 0.3 ) then page:rotate( -angle )

percentが0.3未満のときは、ページを回転させます。


elseif( percent < 0.5 ) then

elseがありますので、「percentが0.3以上0.5未満のとき」という条件になります。


page:rotate( -0.3*math.pi*2 )

回転を止めるような指定はありませんので、回転している途中の状態をキープするやり方になります。
今回は、0.3まで回して止めるので、0.3のときの固定角度を指定します。


else

この場合は、「percentが0.5以上のとき」という条件になります。


page:scale( 1-percent )

最後は消えるだけですので、拡大率が0で終わるように、1-percentを指定します。

では、実際に動作させてみましょう。

3段階のエフェクト

エフェクトが3段階になっていることはお分かり頂けると思います。
ただ、いくつか気になるところがありますので、以下にまとめます。
・2ページ目がいきなり入ってくる
・2ページ目がずっと表示されている
・縮小がいきなり始まる

少しずつ、修正していきます。

修正1

とりあえず、2ページ目がジャマですので、1ページ目の修正が終わるまで、消えててもらいましょう。
そのために、以下を追加します。

if( percent < 0 ) then page:alpha(0)

2ページ目は、offsetが負数ですので、percentも負数です。
offsetの値で判断しても問題ないのですが、当サイトではpercentでの管理に統一します。

そして、1ページ目の最大の問題は、percentが0.5になってからの縮小です。
傾いていたはずのページが消え、傾いていない小さなページが縮小されていくのです。
これは、percentが0.5前後で全く違う動作となっているため、きちんと動いていると言えばそうなのですが、求める動きではありません。
では、傾いたページがそのまま縮小されるようにするには、どうすれば良いのでしょうか?

ここで、1つ気をつけることがあります
それは、「動作は意図的に継続させなければならない」ということです。
percentが0.3で切り替わる時も同様なのですが、0.3のときの回転角度を指定することで回転を止めましたよね。
実は、回転角度の指定を止めたら、回転が止まるのではなく、回転自体が解除されるので、止めておきたい回転角度を指定しておいたのです。
これが、「意図的に・・・」ということで、縮小時も傾きを意図的に保つ必要があったのです。
そこで、0.5以降に、以下の1行を追加します。

page:rotate( -0.3*math.pi*2 )

これで、傾いたままのページを維持することができます。

とりあえず、ここまでの修正を確認します。

return ( page, offset, screen_width, screen_height)
 local percent = offset/page.width
 local angle = percent*math.pi*2

 page:translate( offset )

 if( percent < 0 ) then
  page.alpha = 0

 elseif( percent < 0.3 ) then
  page:rotate( -angle )
 elseif( percent < 0.5 ) then
  page:rotate( -0.3*math.pi*2 )
 else
  page:rotate( -0.3*math.pi*2 )
  page:scale( 1-percent )
 end
end

effect26_1_2

修正箇所が分かるように、追加や修正部分を赤くしておきました。

修正済みエフェクト1

2ページ目が消えて、確認しやすくなりました。
縮小時も傾きが維持されています。

修正2

ここでは、縮小部分を修正します。
縮小が急に始まってしまう問題ですね。

どうして急に始まるのか、原因を探るために、切り替わりの前後で、拡大率を確認しましょう。
切り替わるタイミングは、percentが0.5の時です。
それまでは、拡大率を指定していませんので、デフォルトの1となります。
拡大が始まる瞬間の拡大率は、1-percentで表されていますので、0.5となります。
1-percentで拡大されるのは、percentが0.5〜1の時ですので、拡大率は0.5〜0となります。
縮小して消えてもらいたいので、拡大率が0で終わるのは思惑通りです。
しかし、0.5から始まるため、急に縮小されてしまったんですね。

ここでも、気をつけることがありました。
それは、「動作の切り替えはスムーズに繋げる」ということです。
拡大率が1から0.5になったので、「急に」としか受け取りようがないのです。
工夫をして、拡大率を1から始まるようにしなければなりませんね。

percentの変化は、0.5〜1です。
この変化に伴って、1〜0になるようにしたいと思います。
何とか、計算式で表現したいですね。
単純に2倍すると、1〜2となり、スタートはスムーズになりますが、縮小してくれません。
ここで、1つの考え方を導入します。
percentが0〜1であれば、1-percentで表現できます。
percentが0.5〜1でも、0〜1になるように変換したいので、以下のようなイメージで考えます。

0.5を0にするために、percentから0.5を引きます。
そして、percentの範囲である0.5で割ります。
したがって、修正する計算式は以下の通りです。

1 - (percent-0.5)/0.5

これで、0〜1の範囲になります。

では、修正を確認します。

return ( page, offset, screen_width, screen_height)
 local percent = offset/page.width
 local angle = percent*math.pi*2

 page:translate( offset )

 if( percent < 0 ) then
  page.alpha = 0
 elseif( percent < 0.3 ) then
  page:rotate( -angle )
 elseif( percent < 0.5 ) then
  page:rotate( -0.3*math.pi*2 )
 else
  page:rotate( -0.3*math.pi*2 )
  page:scale( 1 - (percent-0.5)/0.5 )
 end
end

effect26_1_3

動作も確認しましょう。

修正済みエフェクト2

拡大率が1〜0になったので、動作の切り替えがスムーズになりました。

修正3

1ページ目の修正が完了しましたので、2ページ目に取り掛かりましょう。
といっても、センスがないので、エフェクトのアイデアが浮かびません・・・
1ページ目が縮小して消えていったので、単純に、2ページ目も縮小して登場してもらいましょう。
登場に関しては、「ページ拡大のいろいろ」で紹介した拡大を流用します。

修正箇所は、消えてもらっていた部分で、ここを拡大指定にします。
具体的には、以下の通りです。

page:scale(1+percent^2*20)

これで、見えなくなる程の拡大から縮小されて登場してくれるはずです。

では、今回の修正を確認します。

return ( page, offset, screen_width, screen_height)
 local percent = offset/page.width
 local angle = percent*math.pi*2

 page:translate( offset )

 if( percent < 0 ) then
  page:scale(1+percent^2*20)
 elseif( percent < 0.3 ) then
  page:rotate( -angle )
 elseif( percent < 0.5 ) then
  page:rotate( -0.3*math.pi*2 )
 else
  page:rotate( -0.3*math.pi*2 )
  page:scale( 1 - (percent-0.5)/0.5 )
 end
end

effect26_1_4

動作も確認しましょう。

修正済みエフェクト3

すべてが繋がりましたね。

まとめ

タイミングでエフェクトを切り替えることができますが、注意することもありました。
この先、教訓になるほどの注意事項かと思いますので、ここでもう一度確認しておきます。

1:動作は意図的に継続させなければならない
2:動作の切り替えはスムーズに繋げる



当サイトの更新状況を、アラートで表示するかどうかの設定をします。


保存する

その機能で月額1500円もするのですか??
その機能なら年額1500円で手に入りますよ!

当サイトもこちらのレンタルサーバーを利用しています。

Copyright (C) 2007 Bokechans.net All Rights Reserved.