UJMLサンプル023:ボックスエフェクト(2006/02/04)
前回の「ブラインドエフェクト」の続きで、ボックスエフェクトのサンプルを紹介する。
UIEngineは「UIだけをクライアントに実装する」というコンセプトで設計されている。いかにさくさく動くものを作るか?を考えてなんぼである、というわけだ。作り手としては一点に集中できてなんだか肩の荷が下りたというか、とても幸せな気分だ。いつか流れるように動く、そんなものを作りたいものである。
動作サンプル
※動作にはJAVA Runtimeが必要
---コード
<?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_FRAME "100">
]>
<!-- http://uiengineda.blogs.com ボックスエフェクト(中央に向かって隠れた部分が小さくなる) -->
<ujml>
<application>
<state-variables>
<state-var name="sBox" type="boolean"/>
<state-var name="sTick" type="boolean"/>
<state-var name="sScreenBox" type="boolean"/>
</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="mScreenBoxWidth" type="int"/>
<var name="mScreenBoxHeight" type="int"/>
<var name="mTickCount" type="int"/>
</variables>
<functions>
<function name="processTick" type="void">
<variables>
<var name="i" type="int"/>
</variables>
<script>
mTickCount++;
<!-- 徐々に箱のサイズを小さくする。上下から閉じる感じ -->
if (mScreenBoxHeight-mTickCount*2 &_GT; 0 ){
<!-- 高さを減らす -->
mScreenBoxWidth = mScreenBoxWidth - mTickCount * 2;
mScreenBoxHeight = mScreenBoxHeight - mTickCount * 2;
<!-- ステート変数切り替えて再描画 -->
i = 0;
sScreenBox = false;
sScreenBox = true;
<!-- サイズ変更の再処理 -->
sTick = false;
sTick = true;
}else{
<!-- 充分小さくなったら箱を消す -->
sScreenBox = false;
}
</script>
</function>
</functions>
<script>
<!-- スクリーンのサイズを調べる -->
mScrWidth = _getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;);
mScrHeight = _getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;);
<!-- 幅 スクリーンの半分 -->
mWidth = mScrWidth / 2;
<!-- 高さ -->
mHeight = mScrHeight / 2;
mScreenBoxWidth = mWidth;
mScreenBoxHeight = mHeight;
<!-- 中心に配置 -->
mPosX = (mScrWidth / 2) - (mWidth / 2);
mPosY = (mScrHeight / 2) - (mHeight / 2);
mTickCount = 0;
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_FRAME;</delay>
<script>processTick();</script>
</transition>
</state>
<!-- 中央に向かってだんだん小さくなる白い箱 -->
<state var="sScreenBox" >
<transition value="true">
<display>
<box>
<x><eval>(mScrWidth / 2) - (mScreenBoxWidth / 2)</eval></x>
<y><eval>(mScrHeight / 2) - (mScreenBoxHeight / 2)</eval></y>
<width><eval>mScreenBoxWidth</eval></width>
<height><eval>mScreenBoxHeight</eval></height>
<fg>&_COLOR_WHITE;</fg>
<bg>&_COLOR_WHITE;</bg>
</box>
</display>
</transition>
</state>
</states>
</application>
</ujml>
コメント