UJMLサンプル029:うろうろ+ジャンプ(2006/02/06)
前回のサンプル「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>
コメント