エフェクトを段階的にする
これまで、ページやアイコンにいろいろエフェクトをかけてきました。
既存エフェクトの中には、「アイコンが集まって」→「グルグル回って」→「アイコンが切り替わって」→「定位置に戻る」というものがあります。
これまで紹介したやり方では、完結しないエフェクトです。
これは、エフェクトの開始から終了までをいくつかの段階に分け、それぞれでエフェクトを作り込んでいます。
ここでは、幾つかの段階に分けて、違うエフェクトを組合わせてみます。
考え方
当サイトのサンプルは、開始から終了までのタイミングを、percentで管理しています。
ですので、このpercentを上手く利用して、段階的なエフェクトを与えることを考えます。
では、どのようにpercentを分ければ良いのでしょうか。
簡単な方法は、if文を使う方法です。
例えば・・・
1:percentが0.3未満なら回転させる
2:percentが0.5未満なら回転を止める
3:そうでなければ縮小して消える
こんな感じでやれば、何とかできそうですね。
サンプル
とりあえず、先ほどの例をプログラミングしてみました。
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 )
これで、傾いたままのページを維持することができます。
とりあえず、ここまでの修正を確認します。
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の範囲になります。
では、修正を確認します。
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)
これで、見えなくなる程の拡大から縮小されて登場してくれるはずです。
では、今回の修正を確認します。
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:動作の切り替えはスムーズに繋げる
当サイトの更新状況を、アラートで表示するかどうかの設定をします。
保存する