UJMLサンプル025:ブラインドエフェクト the maximum-frame-rate method(2006/02/04)
既に紹介している「ブラインドエフェクト」を「the maximum-frame-rate method」で書き換えたUJMLサンプルだ。指定msec以内に処理を完了するように実装している。どんな非力なデバイスでも処理が指定時間内に終わるようになっているのだ。残りの2つも書き換えつつアップロードしていきたい。
※動作サンプルを公開したが、期待通りに動作しないので直さなければ。前回のブラインドエフェクトと動作は同じなのでそちらを見てもらえたらと思う。
---コード
<?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 NUM_OF_BLINDS "5"><!-- ブラインドの数 -->
<!ENTITY MSEC_TOTAL "2000"><!-- 何msec以内に完了するかを設定 -->
<!ENTITY MSEC_DELAY "100">
]>
<!-- http://uiengineda.blogs.com ブラインド効果 どんな非力なデバイスでもMSEC_TOTAL以内に処理を終わるようにしている "the maximum-frame-rate method" -->
<ujml>
<application>
<state-variables>
<state-var name="sBox" type="boolean"/>
<state-var name="sTick" type="boolean"/>
<state-var name="sBlind" type="boolean" size="&NUM_OF_BLINDS;"/>
</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="mBlindHeight" type="int"/>
<var name="mTickCount" type="int"/>
<var name="mStartTime" type="int" />
</variables>
<functions>
<function name="processTick" type="void">
<variables>
<var name="mElapsedTime" type="int" />
<var name="i" type="int"/>
</variables>
<script>
sTick = false;
mElapsedTime = _msec()-mStartTime;
if (_lt(mElapsedTime, &MSEC_TOTAL;)) {
<!-- ブラインドの高さを減らす -->
mBlindHeight = (mHeight / &NUM_OF_BLINDS;) * mElapsedTime / &MSEC_TOTAL;;
<!-- ステート変数切り替えて再描画 -->
i = 0;
while(i &_LT; &NUM_OF_BLINDS;){
sBlind[i]=false;
sBlind[i]=true;
i++;
}
<!-- サイズ変更の再処理 -->
sTick = false;
sTick = true;
} else {
<!-- 充分小さくなったら箱を消す -->
while(i &_LT; &NUM_OF_BLINDS;){
sBlind[i]=false;
i++;
}
}
</script>
</function>
</functions>
<script>
<!-- スクリーンのサイズを調べる -->
mScrWidth = _getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;);
mScrHeight = _getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;);
<!-- 幅 スクリーンの半分 -->
mWidth = mScrWidth / 2;
<!-- 高さ -->
mHeight = mScrHeight / 2;
mBlindHeight = mHeight / &NUM_OF_BLINDS;;<!-- ブライド一個の高さ -->
<!-- 中心に配置 -->
mPosX = (mScrWidth / 2) - (mWidth / 2);
mPosY = (mScrHeight / 2) - (mHeight / 2);
mTickCount = 0;
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="sBlind" index="*">
<transition value="true">
<display>
<box>
<x><eval>mPosX</eval></x>
<y><eval>mPosY+mHeight / &NUM_OF_BLINDS; * _state_index(0)</eval></y>
<width><eval>mWidth</eval></width>
<height><eval>mBlindHeight</eval></height>
<fg>&_COLOR_WHITE;</fg>
<bg>&_COLOR_WHITE;</bg>
</box>
</display>
</transition>
</state>
</states>
</application>
</ujml>
コメント