Apricotでの複数キャラクターの同期方法


Apricotで複数キャラクターの制御方法


というエントリーで、複数キャラクターの制御方法について書いたのですが、ここで書いた複数キャラクターが会話をするための方法とは別の方法があります。
それが、キャラクターを同期させ会話を行うものです。Apricotの内部では、全てのシークエンス(スクリプトのsequenceと等価)が単一のキュー(FIFO: first-in, first-out)によって管理されています。このキューは、対象のキャラクターのものであれば中からシークエンスを取り出し実行します。

このメカニズムを使うと、キャラクターを同期させ会話を成立させることが出来ます。下記のように、BeginMarisaRe0というsequenceを呼び出すことにより、他のキャラクターに台詞を喋らせています。ここまでは前回の方法と変わりありません。次に他のキャラクターのEndMarisaRe0というsequenceを呼び出しています。このsequenceはclearを呼び出しているだけで特に意味のないsequenceですが、このsequenceを記述して呼び出すことによりがキューから取り出されるまで、(今回のケースでは)callの呼び出し元キャラクターを待機させることが出来ます。

この方法を使うと、motionタグでloop属性をTrueにしている場合などで、途切れることなくアニメーションを継続させながら待機させたりすることが出来ます。

    <sequence name="DoubleClick">
      <call name="Bound" />
      <message>ねえねえ、まりさ。</message>
      <call name="Say" />
      <call name="BeginMarisaRe0" />
      <call name="EndMarisaRe0" />
      <message>最近、東方 ってよくきくけど</message>
      <call name="Say" />
      <message>あれ何?萌え同人エロゲなの?</message>
      <call name="Say" />
    </sequence>

Apricot
Apricotとは
Apricot FAQ
Apricot Wiki
キャラクター作成ガイド
mixiコミュニティ「Apricot開発室」


XML:

<?xml version="1.0" encoding="utf-8" ?>
<script id="東方って何?エロゲ?">
  <character name="博麗霊夢" x="0" y="0" width="340" height="370" offset-x="25" offset-y="95">
    <sequence name="Neutral">
      <motion fps="8" z-index="0">
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
      </motion>
    </sequence>
    <sequence name="Say">
      <motion fps="8" z-index="1">
        <clear x="0" y="-45" width="320" height="320" color="Transparent" />
        <wait duration="4000" />
      </motion>
    </sequence>
    <sequence name="Blink">
      <motion fps="8" z-index="1">
        <clear x="0" y="-45" width="320" height="320" color="Transparent" />
        <wait duration="500" />
      </motion>
    </sequence>
    <sequence name="Bound">
      <motion loop="True" fps="30" z-index="0" iterations="3">
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-37" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-45" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-52" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-59" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-65" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-70" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-74" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-77" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-79" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-77" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-74" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-70" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-65" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-59" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-52" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-45" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-37" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
      </motion>
    </sequence>
    <sequence name="Quake">
      <motion loop="False" fps="30" z-index="0">
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="55" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="75" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="56" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="74" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="57" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="73" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="58" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="72" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="59" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="71" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="60" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="70" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="61" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="69" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="62" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="68" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="63" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="67" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="64" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="66" y="-29" width="190" height="288">Images\Reimu.png</image>
        <image x="65" y="-29" width="190" height="288">Images\Reimu.png</image>
      </motion>
    </sequence>
    <sequence name="Idle">
      <call name="Blink" />
    </sequence>
    <sequence name="DoubleClick">
      <call name="Bound" />
      <message>ねえねえ、まりさ。</message>
      <call name="Say" />
      <call name="BeginMarisaRe0" />
      <call name="EndMarisaRe0" />
      <message>最近、東方 ってよくきくけど</message>
      <call name="Say" />
      <message>あれ何?萌え同人エロゲなの?</message>
      <call name="Say" />
    </sequence>
  </character>
  <character name="霧雨魔理沙" x="-240" y="0" width="340" height="370" offset-x="15" offset-y="85">
    <sequence name="Neutral">
      <motion fps="8" z-index="0">
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
      </motion>
    </sequence>
    <sequence name="Stop">
      <message>じゃあな</message>
      <motion fps="8" z-index="1">
        <clear x="0" y="-35" width="320" height="320" color="Transparent" />
        <wait duration="4000" />
      </motion>
    </sequence>
    <sequence name="marisaSay">
      <motion fps="8" z-index="1">
        <clear x="0" y="-35" width="320" height="320" color="Transparent" />
        <wait duration="4000" />
      </motion>
    </sequence>
    <sequence name="Blink">
      <motion fps="8" z-index="1">
        <clear x="0" y="-35" width="320" height="320" color="Transparent" />
        <wait duration="500" />
      </motion>
    </sequence>
    <sequence name="marisaBound">
      <motion loop="False" fps="30" z-index="0" iterations="3">
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-23" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-31" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-38" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-45" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-51" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-56" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-60" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-63" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-65" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-63" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-60" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-56" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-51" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-45" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-38" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-31" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-23" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
      </motion>
    </sequence>
    <sequence name="marisaQuake">
      <motion loop="False" fps="30" z-index="0">
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="32" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="52" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="33" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="51" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="34" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="50" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="35" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="49" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="36" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="48" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="37" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="47" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="38" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="46" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="39" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="45" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="40" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="44" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="41" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="43" y="-15" width="236" height="280">Images\Marisa.png</image>
        <image x="42" y="-15" width="236" height="280">Images\Marisa.png</image>
      </motion>
    </sequence>
    <sequence name="BeginMarisaRe0">
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="5000" />
      </motion>
      <message>どうしたんだ霊夢?</message>
      <call name="marisaSay" />
    </sequence>
    <sequence name="EndMarisaRe0">
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
      </motion>
    </sequence>
  </character>
</script>