« UJMLサンプル006:だんだん大きくなる箱 | メイン | UJMLサンプル008:上下からつぶれて消える箱 »

UJMLサンプル007:中心からだんだん大きくなる箱(2006/02/02)

Samples_003_boxeffect2前回の「だんだん大きくなる箱」の応用版で、中心から大きくなる箱のサンプルだ。このように応用すれば、リストから選択したものの内容を表示するときや、ゲームキャラクターの噴出しの表示に使える。

ポイント:
・箱の左上の角の位置の算出
 X:「スクリーン幅の半分(中央)」-「箱の幅の半分」
 Y:「スクリーン高さの半分(中央)」-「箱の高さの半分」

ところで、インサイドUJML中にも書いてあるが、この方法は「 the fixed-timer method」と呼ばれ、簡単に実装できるがあまり望ましくない方法らしい。もうひとつの「the maximum-frame-rate method」と呼ばれるものが望ましいようだ。後者の方がよりスムーズに動くと解説されている。

---コード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ujml PUBLIC "-//UIEVOLUTION//DTD UJML 1.2//EN" "../ujml.dtd" [
    <!ENTITY MSEC_FRAME "50">
]>
<!-- 徐々に大きくなる箱 2006/01/31 22:05
真中から大きくなる箱?できるかな?
-->
<ujml>
    <application>
        <state-variables>
            <state-var name="sTick" type="boolean" />
            <state-var name="sBox" 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="mBoxWidth" type="int" />
        </variables>
        <functions>
            <function name="processTick" type="void">
                <script>
                    <!-- 徐々に箱のサイズを大きくする -->
                    if (mBoxWidth &_LT; mScrWidth &_AND; mBoxWidth &_LT; mScrHeight ){
                        <!-- とりあえずスクリーンの幅の10分の1ずつ大きくしています。 -->
                        mBoxWidth = mBoxWidth + (mScrWidth / 10);

                        <!-- 箱の左上の角の位置を決める。 -->
                        mPosX = (mScrWidth / 2) - (mBoxWidth / 2);
                        mPosY = (mScrHeight / 2) - (mBoxWidth / 2);

                        <!-- ステート変数切り替えて再描画 -->
                        sBox = false;
                        sBox = true;

                        <!-- サイズ変更の再処理 -->
                        sTick = false;
                        sTick = true;
                    }   
                </script>
            </function>
        </functions>
        <script>
            <!-- スクリーンのサイズを調べる -->
            mScrWidth = _getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;);
            mScrHeight = _getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;);

            <!-- 最初の箱の位置を決める:箱は正方形なのでWidthの値を高さにも使っていますよ -->
            mBoxWidth = 10;

            mPosX = (mScrWidth / 2) - (mBoxWidth / 2);
            mPosY = (mScrHeight / 2) - (mBoxWidth / 2);

            sBox = true;
            sTick = true;
        </script>
        <states>
            <!-- 徐々にサイズ変更します。delayの分だけ実行間隔があります。 -->
            <state var="sTick">
                <transition value="true">
                    <delay>&MSEC_FRAME;</delay>
                    <script>processTick();</script>
                </transition>
            </state>
            <state var="sBox">
                <transition value="true">
                    <display>
                        <box>
                            <x><eval>mPosX</eval></x>
                            <y><eval>mPosY</eval></y>
                            <width><eval>mBoxWidth</eval></width>
                            <height><eval>mBoxWidth</eval></height>
                            <fg>&_COLOR_BLUE;</fg>
                            <bg>&_COLOR_WHITE;</bg>
                        </box>
                    </display>
                </transition>
            </state>
        </states>
    </application>
</ujml>

トラックバック

この記事のトラックバックURL:
https://www.typepad.com/services/trackback/6a00d8341c2e2e53ef00e5509416128833

UJMLサンプル007:中心からだんだん大きくなる箱を参照しているブログ:

コメント

この記事へのコメントは終了しました。