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>