UJMLサンプル027:スプリットエフェクト the maximum-frame-rate method(2006/02/05)
既に紹介した「UJMLサンプル024:スプリットエフェクト」を「the maximum-frame-rate method」で書き換えたUJMLサンプルだ。指定msec以内に処理を完了するように実装している。前回紹介した「UJMLサンプル024:スプリットエフェクト」と異なり、どんな非力なデバイスでも処理が指定時間内に終わるようになっている。
※動作サンプルを公開したが、期待通りに動作しないので直さなければ。前回のブラインドエフェクトと動作は同じなのでそちらを見てもらえたらと思う。
---コード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ujml PUBLIC "-//UIEVOLUTION//DTD UJML 1.5//EN"
"http://www.uievolution.com/dtd/ujml-1.5.dtd" [
<!ENTITY MSEC_DELAY "100">
<!ENTITY MSEC_TOTAL "1000"><!-- 何msec以内に完了するかを設定 -->
]>
<!-- http://uiengineda.blogs.com スピリットエフェクト(上下から中央に向かって隠れた部分が小さくなる)"the maximum-frame-rate method"版 -->
<ujml>
<application>
<state-variables>
<state-var name="sBox" type="boolean"/>
<state-var name="sTick" type="boolean"/>
<state-var name="sScreenBox" type="boolean" size="2"/>
</state-variables>
<variables>
<var name="mScrWidth" type="int" />
<var name="mScrHeight" type="int" />
<var name="mPosX" type="int" />
<var name="mPosY" type="int" />
<var name="mWidth" type="int"/>
<var name="mHeight" type="int"/>
<var name="mScreenBoxHeight" type="int"/>
<var name="mStartTime" type="int" />
</variables>
<functions>
<function name="processTick" type="void">
<variables>
<var name="mElapsedTime" type="int" />
</variables>
<script>
mElapsedTime = _msec()-mStartTime;
if (_lt(mElapsedTime, &MSEC_TOTAL;)) {
<!-- 徐々に箱のサイズを小さくする。 -->
<!-- 高さを減らす -->
mScreenBoxHeight = mHeight - mHeight * mElapsedTime / &MSEC_TOTAL;;
<!-- ステート変数切り替えて再描画 -->
sScreenBox[0] = false;
sScreenBox[0] = true;
sScreenBox[1] = false;
sScreenBox[1] = true;
<!-- サイズ変更の再処理 -->
sTick = false;
sTick = true;
} else {
<!-- 充分小さくなったら箱を消す -->
sScreenBox[0] = false;
sScreenBox[1] = false;
}
</script>
</function>
</functions>
<script>
<!-- スクリーンのサイズを調べる -->
mScrWidth = _getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;);
mScrHeight = _getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;);
<!-- 幅 スクリーンの半分 -->
mWidth = mScrWidth / 2;
<!-- 高さ -->
mHeight = mScrHeight / 2;
mScreenBoxHeight = mHeight;
<!-- 中心に配置 -->
mPosX = (mScrWidth / 2) - (mWidth / 2);
mPosY = (mScrHeight / 2) - (mHeight / 2);
mStartTime = _msec();
sBox = true;
sTick = true;
</script>
<states>
<state var="sBox">
<transition value="true">
<display>
<box>
<x><eval>mPosX</eval></x>
<y><eval>mPosY</eval></y>
<width><eval>mWidth</eval></width>
<height><eval>mHeight</eval></height>
<fg>&_COLOR_BLUE;</fg>
<bg>&_COLOR_BLUE;</bg>
</box>
</display>
</transition>
</state>
<state var="sTick">
<transition value="true">
<delay>&MSEC_DELAY;</delay>
<script>processTick();</script>
</transition>
</state>
<!-- 中央に向かってだんだん小さくなる白い箱 -->
<state var="sScreenBox" index="*">
<transition value="true">
<display>
<box>
<x><eval>mPosX</eval></x>
<y><eval>(mScrHeight / 2) - (mScreenBoxHeight / 2)</eval></y>
<width><eval>mWidth</eval></width>
<height><eval>mScreenBoxHeight</eval></height>
<fg>&_COLOR_WHITE;</fg>
<bg>&_COLOR_WHITE;</bg>
</box>
</display>
</transition>
</state>
</states>
</application>
</ujml>
コメント