« UIE™ SDK 1.5.2 Beta 1 はどうか? | メイン | UJMLサンプル030:大脳刺激-数字記憶 »

UJMLサンプル029:うろうろ+ジャンプ(2006/02/06)

Samples_029_walkjump前回のサンプル「UJMLサンプル028:うろうろ」を改良して、キョロキョロしているときにFIREボタンでジャンプするように改良した。

主な改良点:
・うろうろの動きを左右のみに限定した。
・キョロキョロしているときだけFIREボタンの入力を受け付ける。
・FIREボタンを押すと「UJMLサンプル013:ブーメラン風移動効果 」のようにジャンプする。

動作サンプル
※動作にはJAVA Runtimeが必要
※キーボードのENTERでジャンプ
※前回と同じように移動前の画像が消されないが、、どうしたものか。

---コード
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ujml PUBLIC "-//UIEVOLUTION//DTD UJML 1.2//EN" "../ujml.dtd" [
    <!ENTITY MSEC_FRAME "300">
    <!ENTITY MSEC_FRAME_JUMP "10">
    <!ENTITY BOYW "20">
    <!ENTITY BOYH "24">
    <!ENTITY SBOY_L0 "0">
    <!ENTITY SBOY_L1 "1">
    <!ENTITY SBOY_R0 "2">
    <!ENTITY SBOY_R1 "3">
    <!ENTITY SBOY_U0 "4">
    <!ENTITY SBOY_U1 "5">
    <!ENTITY SBOY_D0 "6">
    <!ENTITY SBOY_D1 "7">
    <!ENTITY IMAGE_URL "<image-url>boy</image-url>">

    <!ENTITY INITIAL_DIST "5"><!-- 最初の移動速度 -->
    <!ENTITY MOVE_SUB "1"><!-- 減速の度合 -->
]>
<!-- http://uiengineda.blogs.com うろうろしてジャンプ -->
<ujml>
    <application>
        <state-variables>
            <state-var name="sTick" type="boolean"/>
            <state-var name="sKyoroKyoro" type="boolean"/>
            <state-var name="sJumping" type="boolean"/>

            <state-var name="sInput" type="boolean"/>

            <state-var name="sBoy" type="int"/>
            <state-var name="sMoveBoy" type="int"/>
        </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="mDX" type="int"/>
            <var name="mDY" type="int"/>

            <var name="mTickCount" type="int"/>
            <var name="mJumpingStep" type="int"/>

        </variables>
        <functions>
            <function name="randRange" type="int"><!-- これは指定範囲の数字をランダムに作る関数 -->
                <parameters>
                    <var name="seed" type="int"/>
                    <var name="min" type="int"/>
                    <var name="max" type="int"/>
                </parameters>
                <return>
                    <eval>
                        (_srand(seed) % (max - min + 1)) + min
                    </eval>
                </return>
            </function>

            <function name="processTickJumping" type="void"><!-- キョロキョロ中 -->
                <script>
                    <!-- 戻ってくるまで移動するようにするため "2 * " を入れている -->
                    if (mJumpingStep * &MOVE_SUB; &_LTE; 2 * (&INITIAL_DIST;)) {

                        <!-- 移動後のXY座標を算出する。 -->
                        <!-- Y座標のみ移動 -->
                        mPosY = mPosY - (&INITIAL_DIST; - mJumpingStep * &MOVE_SUB;);

                        <!-- 再描画 -->
                        _clear_state(sBoy);
                        sBoy = (mTickCount % 2) * 2;

                        mJumpingStep++;<!-- だんだん移動距離を短くするために、移動ステップ数を増やす。 -->

                        <!-- 同じ処理を再度実行 -->
                        sJumping = false;
                        sJumping = true;
                    } else {
                        <!-- 移動距離が0になったので移動処理をやめて、入力待ち状態にする。 -->
                        mTickCount = 0;

                        sJumping = false;

                        sKyoroKyoro = false;
                        sKyoroKyoro = true;

                    }

                </script>
            </function>

            <function name="processTick2" type="void"><!-- キョロキョロ中 -->
                <script>
                    mTickCount++;

                    sBoy = (mTickCount % 2) * 2;

                    if (mTickCount &_LT; 5) {<!-- これぐらいキョロキョロすれば充分 -->
                        sKyoroKyoro = false;
                        sKyoroKyoro = true;
                    } else {
                        _clear_state(sMoveBoy);
                        <!-- 次に移動する方向をランダムで決める -->
                        sMoveBoy = randRange(_msec(), 0, 1);;
                    }   
                </script>
            </function>

            <function name="processTick" type="void">
                <script>
                    mPosX = mPosX + mDX;
                    mPosY = mPosY + mDY;
                    sBoy = (sBoy /2 *2) + 1 - (sBoy % 2);
                    if (_eq(sBoy % 2,1)) {
                        sTick = false;
                        sTick = true;
                    } else {
                        mTickCount = 0;
                        sKyoroKyoro = false;
                        sKyoroKyoro = true;

                        sInput = true;<!-- 入力しても良い -->
                    }   
                </script>
            </function>
            <function name="moveBoy" type="void">
                <parameters>
                    <var name="dx" type="int"/>
                    <var name="dy" type="int"/>
                    <var name="state" type="int"/>
                    <var name="fMove" type="boolean"/>
                </parameters>
                <script>
                    sBoy = state;
                    if (fMove) {
                        mDX = (dx * &BOYW;)/2;
                        mDY = (dy * &BOYH;)/2;
                        sTick = false;
                        sTick = true;

                        sInput = false;<!-- 入力許さず -->
                    }else{
                        mTickCount = 0;
                        sKyoroKyoro = false;
                        sKyoroKyoro = true;

                        sInput = true;<!-- 入力しても良い -->
                    }
                </script>
            </function>

        </functions>
        <script>
            mScrWidth = _getIntProperty(&_PROPERTY_INT_SCREEN_WIDTH;);
            mScrHeight = _getIntProperty(&_PROPERTY_INT_SCREEN_HEIGHT;);
            mPosX = (mScrWidth-&BOYW;)/2;
            mPosY = mScrHeight-&BOYH;*2;

            mTickCount = 0;

            sMoveBoy = 0;
            sJumping = false;
            sInput = true;

        </script>
        <states>
            <state var="sTick">
                <transition value="true">
                    <delay>&MSEC_FRAME;</delay>
                    <script>processTick();</script>
                </transition>
            </state>
            <state var="sKyoroKyoro">
                <transition value="true">
                    <delay>&MSEC_FRAME;</delay>
                    <script>processTick2();</script>
                </transition>
            </state>
            <state var="sJumping">
                <transition value="true">
                    <delay>&MSEC_FRAME_JUMP;</delay>
                    <script>processTickJumping();</script>
                </transition>
            </state>
            <state var="sMoveBoy">
                <transition value="0"><!-- move to LEFT -->
                    <script>
                        moveBoy(-1, 0, &SBOY_L0;, _gt(mPosX-&BOYW;, -1));
                    </script>
                </transition>
                <transition value="1"><!-- move to RIGHT -->
                    <script>
                        moveBoy(1, 0, &SBOY_R0;, _lt(mPosX+&BOYW;*2, mScrWidth));
                    </script>
                </transition>
                <transition value="2"><!-- move to UP -->
                    <script>
                        moveBoy(0, -1, &SBOY_U0;, _gt(mPosY-&BOYH;, -1));
                    </script>
                </transition>
                <transition value="3"><!-- move to DOWN -->
                    <script>
                        moveBoy(0, 1, &SBOY_D0;, _lt(mPosY+&BOYH;*2, mScrHeight));
                    </script>
                </transition>
            </state>
            <state var="sInput">
                <transition value="true">
                    <display>
                        <box>
                            <width><eval>mScrWidth</eval></width>
                            <height><eval>mScrHeight</eval></height>
                            <fg>&_COLOR_TRANSPARENT; </fg>
                            <bg>&_COLOR_TRANSPARENT; </bg>
                            <event name="onSelect">
                                <accelerators>
                                    <key>FIRE</key>
                                </accelerators>
                                <script>
                                    mJumpingStep = 0;
                                    _clear_state(sKyoroKyoro);<!-- キョロキョロをキャンセル -->
                                    sJumping = true;<!-- ジャンプします。 -->
                                </script>
                            </event>
                        </box>
                    </display>
                </transition>
            </state>
            <!-- キャラの画像 8種類 上下左右(全部は使ってないけど、一応貼り付けた) -->
            <state var="sBoy">
                <transition value="&SBOY_L0;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_L1;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-y>&BOYH;</src-y>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_R0;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-x>&BOYW;</src-x>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_R1;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-x>&BOYW;</src-x>
                            <src-y>&BOYH;</src-y>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_U0;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-x>
                                <eval>&BOYW;*2</eval>
                            </src-x>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_U1;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-x>
                                <eval>&BOYW;*2</eval>
                            </src-x>
                            <src-y>&BOYH;</src-y>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_D0;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-x>
                                <eval>&BOYW;*3</eval>
                            </src-x>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
                <transition value="&SBOY_D1;">
                    <display>
                        <image>
                            <url>&IMAGE_URL;</url>
                            <src-x>
                                <eval>&BOYW;*3</eval>
                            </src-x>
                            <src-y>&BOYH;</src-y>
                            <x>
                                <eval>mPosX</eval>
                            </x>
                            <y>
                                <eval>mPosY</eval>
                            </y>
                            <width>&BOYW;</width>
                            <height>&BOYH;</height>
                        </image>
                    </display>
                </transition>
            </state>
        </states>
    </application>
</ujml>

トラックバック

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

UJMLサンプル029:うろうろ+ジャンプを参照しているブログ:

コメント

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