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

D

Apricotでの複数キャラクターの表示と制御方法について書いてみます。

最初に、複数のキャラクター表示するための定義方法ですが、scirptタグ内に任意の数のcharacterタグを書くことによって表示可能です。各キャラクターの位置を指定する場合はcharacterタグのxまたはyの属性値を設定します。

<?xml version="1.0" encoding="utf-8" ?>
<script id="東方って何?エロゲ?">
  <character name="博麗霊夢" x="-480" y="0" width="340" height="370" offset-x="25" offset-y="95">
  </character>
  <character name="霧雨魔理沙" x="0" y="0" width="340" height="370" offset-x="15" offset-y="85">
  </character>
 </script>

次に、会話を行う方法ですが、character内のsequenceタグのname属性は、予め定義されているもの意外は自由に定義可能です。このname属性値で指定したものはどのキャラクターからでもcallタグで呼び出すことが可能です。これを使って下記のように会話させることが出来ます。下記の例では、callタグで違うキャラクターに定義されているmarisaRe0というのsequenceを呼び出しています。

尚、sequenceは全て一つのキュー(FIFO: first-in, first-out)によって処理されるので、異なるキャラクターのsequenceが入っている場合は一斉に同時に喋ります。逆に、同じキャラクターのsequenceが複数あった場合は、一つのキャラクターの処理が終わるまで他のキャラクターを喋らすことは出来ません。なので、この仕組みを使って他のキャラクターを待機させるといったことが可能です。

<?xml version="1.0" encoding="utf-8" ?>
<script id="東方って何?エロゲ?">
  <character name="博麗霊夢" x="-480" y="0" width="340" height="370" offset-x="25" offset-y="95">
(省略)
    <sequence name="DoubleClick">
      <call name="Bound" />
      <message>ねえねえ、まりさ。</message>
      <call name="Say" />
      <call name="marisaRe0" />
    </sequence>
(省略)
  </character>
  <character name="霧雨魔理沙" x="0" y="0" width="340" height="370" offset-x="15" offset-y="85">
(省略)
    <sequence name="marisaRe0">
      <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>
(省略)
  </character>
 </script>


参考:

Apricot
Apricotとは
Apricot FAQ
Apricot Wiki
キャラクター作成ガイド


XML:

<?xml version="1.0" encoding="utf-8" ?>
<script id="東方って何?エロゲ?">
  <character name="博麗霊夢" x="-480" 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="False" 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="marisaRe0" />
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="4000" />
      </motion>
      <message>最近、東方 ってよくきくけど</message>
      <call name="Say" />
      <message>あれ何?萌え同人エロゲなの?</message>
      <call name="Say" />
      <call name="marisaRe1" />
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="5000" />
      </motion>
      <message>( ゚∀゚)o彡゜えーりん!えーりん!</message>
      <call name="Say" />
      <call name="marisaRe2" />
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="10000" />
      </motion>
      <message>全然そんな感じしないじゃない。萌え動画か、電波フラッシュばかり見かけるわよ?</message>
      <call name="Say" />
      <message>東方っていえば「魔理沙は大変なものを盗んでいきました」とか</message>
      <call name="Say" />
      <call name="marisaRe3" />
      <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="Say" />
      <call name="marisaRe4" />
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="10000" />
      </motion>
      <call name="Bound" />
      <message>なによ悪かったわね</message>
      <call name="Say" />
    </sequence>
  </character>
  <character name="霧雨魔理沙" x="0" 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="marisaRe0">
      <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="marisaRe1">
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="10000" />
      </motion>
      <call name="marisaBound" />
      <message>おいおい、霊夢。それは違うぜ!</message>
      <call name="marisaSay" />
    </sequence>
    <sequence name="marisaRe2">
      <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" />
      <message>東方、正確に「東方プロジェクト」は弾幕シューティングだぜ!</message>
      <call name="marisaSay" />
    </sequence>
    <sequence name="marisaRe3">
      <motion fps="8" z-index="1">
        <clear x="25" y="-30" width="320" height="320" color="Transparent" />
        <wait duration="10000" />
      </motion>
      <message>ニコニコで東方に火がついたのは「魔理沙は大変なものを盗んでいきました」の影響だぜ。(ニコニコ新参にアリスを指して魔理沙とか言われてむかついたのは内緒だぜ)</message>
      <call name="marisaSay" />
    </sequence>
    <sequence name="marisaRe4">
      <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" />
      <message>ニコニコだとそういった電波動画や萌え動画ばかりあがってくるから、東方をエロゲか何かと勘違いしてる人が多くてね。霊夢みたいに。</message>
      <call name="marisaSay" />
    </sequence>
  </character>
 </script>