ADVツール作成 画像の表示、移動などを実装

明日の君と逢うために』をちょいちょいやってます。
話の内容は良く覚えてないけど、とにかく絵がぐりぐり動くのが気持ちよくてそれだけで楽しい。
ということは話を作る技術がなくても動かしまくれるADVツールなら自分でも面白おかしいADVが作れるかも?
なんて不純な動機で今回の実装をしました。


一応『明日の君と逢うために』っぽく疑似3Dになっていて、全ての画像はx,y,zの座標系を持っています。
移動はTweenerを使っていて下のように書きます。

位置指定以外にdelayを付けられたりしますので複数キャラクタを順々に登場させるのも楽です。
3D空間は微妙ですが動き自体は意外にうにゅうにゅ気持ちよく動くので満足してます。


他にもAddChara ShowCharaとか文法整備もいろいろしています。
選択肢を作ったら一応ノベルっぽくはなるのかなぁ。


crossdomainの関係か上にそのまんま表示できなくなってしまったので記事の上の部分にある
ADVエンジン実験 2008/10/28
からご覧下さい。

明日の君と逢うために

ノベルエンジンを作るにあたって、システムの凝ってるエロゲはないかと友人に尋ねたところこれを上げてくれました。


実際やってみると確かに凝ってますね。
ズームしたり立ち絵が歩いたり背景がアニメーションしてたり。
自分が最近のエロゲをやってないだけで他もみんなこんなレベルなのかもしれないけど、こんなレベルにまで出来れば楽しいんだろうなぁ。

F50fd

先週カメラを買いました。
機種はFujitsu FinePix F50fd
名機と呼ばれたらしいF31fdと最近売れてるらしいF100fdの間の子で評価も良かったり悪かったりいろいろな機種です。
カメラについてはまったくの初心者なので、とりあえず携帯のカメラより綺麗になればそれでいいかなーと思ってたりします。


早く撮りたいなーと思っても平日の日が高いうちは仕事なので、うずうずして土日を待っていました。
で撮った写真は「うわひでぇ」な写真ばかりで結構泣けたりします。


実際カメラを構えて思ったのは撮れないモノがいっぱいあるなということです。

  • 遠い
  • 近すぎ(小さい)
  • 動く(これは下手だから)

この辺は高級な一眼ならとれるんでしょうかね。


で今日の一枚
「オラァッ!パンの耳ゲッツ!!」

XMLまとめ

XMLの構成

XMLは要素(Element)と属性(Attribute)で構成される。
要素値の呼ばれ方はコンテンツとかプロパティとかあるけど、ここでは以下の呼び名で統一する。

  • 要素値を持つもの
<要素名 属性名="属性値">要素値</要素名>
<ElementName AttributeName="AttributeValue">ElementValue</ElementName>
  • 要素値を持たないもの
<要素名 属性名="属性値"/>
<ElementName AttributeName="AttributeValue"/>

属性はなくても構わないが、属性名のみは持てない

<要素名/>←これはOK
<要素名 属性名/>←これはNG

AS3のXML

XML型とXMLList型二つを使って操作する。
ごっちゃになりやすいので注意。


xml.Chapter[i] == xml.child("Chapter")[i] == xml.children()[i] == XML
xml.Chapter == xml.child("Chapter") == XMLList型

要素 Element

//XMLの持つ、指定した要素名のリスト
xml.child("要素名")
//XMLの持つ要素のリスト
xml.children()
//XMLの持つ要素の数
xml.children().length()
//XMLの持つi番目の要素の要素値
xml.children()[i]
//XMLの持つi番目の要素の要素名
xml.children()[i].name()

//指定XMLに指定名の要素があるか?
xml.hasOwnProperty(name:String):Boolean;
//書くならこう
private function IsExistElements(xml:XML, name:String):Boolean{
	//XMLの持つ要素数
	var len:int = xml.children().length;
	//全ての要素の名前を調べる
	for(var i:int = 0 ; i < len ; i++){
		//一致する要素名を発見したらtrue
		if(xml.children[i].name() == name){
			return true;
		}
	}
	//一致する名前がなかったらfalse
	return false
}

属性 Attribute

//XMLの持つ、指定した属性名のリスト
xml.attribute("名前")
//XMLの持つ属性のリスト
xml.attributes()
//XMLの持つ属性の数
xml.attributes().length()
//XMLの持つi番目の属性の属性値
xml.attributes()[i]
//XMLの持つi番目の属性の属性名
xml.attributes()[i].name()

//指定XMLに指定名の属性があるか?
//属性にはなぜかhasOwnPropertyに相当するものがないので自分で書く
private function IsExistAttribute(xml:XML, name:String):Boolean{
	//XMLの持つ属性の数
	var len:int = xml.attributes().length();
	//全ての属性の名前を調べる
	for(var i:int = 0 ; i < len ; i++){
		//一致する属性名を発見したらtrue
		if(xml.attributes()[i].name() == name){
			return true;
		}
	}
	//一致する名前がなかったらfalse
	return false
}
  • 参考

XMLの構造XMLの基本
http://www.techscore.com/tech/XML/Basic/2_1.html
Extendsible Markup Language - Wikipedia
http://ja.wikipedia.org/wiki/XML

ノベルエンジンに変数宣言とか計算とか

そういえばADVといえばフラグを立てなければいけないのだった。
ので変数くらいは必須かなと思う。
実際吉里吉里NScripterもLemoNovelも変数くらい宣言できてる。


とりあえずこんな実装にしてみた

<Expression>hoge = 10 + 5</Expression>

変数hogeに対して10+5の結果を渡す。
hogeが既にある変数でも、ない変数でも無視して作成する。
計算は四則演算と比較と論理和積ができれば、とりあえず問題なさそうかな。
いやしかしこうの方がいいような気もする。

<SetVar name="hoge" value="10 + 5"/>

こっちの方が素直かも。


とここで気がついたのはスコープの問題。
例えば現在作成中のツールでは 章 節 段落 の単位でツリー状に作っていくのだけど、
複数人で作成する時、章単位で担当を分けて作成する場面があると思う。
このとき好き勝手にtmpなんて変数を作成しようモノなら多分どっかしらカブって面倒なことになるだろう。
ので変数にはスコープを作成する必要があるかもしれない。

<Clause>//節
	〜中略〜//スコープを節内と指定して変数hogeを宣言する
	<SetVar scope="Clause" name="hoge" value="10"/>
	〜中略〜
</Clause>
<Clause>//節
	〜中略〜//節が違うのでかぶらない!!
	<SetVar scope="Clause" name="hoge" value="FOOBAR"/>
	〜中略〜
</Clause>

作ること自体は楽しそうだけど、ボッチで作成する自分にとっては不要なのかもしれないw

シナリオデータをXMLにしてみた。

ちょっと更新。
使ってる背景はむきりょくかん。さんの素材
http://mukiryokukan.sakura.ne.jp/
立ち絵はwikipediaのウィキペたん頁から拝借。
都合良く透過pngだったのでお借りしていますが問題あれば直します。


カンマテキストで適当に入力していたシナリオをXMLに変更。
下のようなNScripterの基本的な書き方を用いると、制作者はとても楽になるんだろうなと思っているのですが
今回はXML(っぽいの)を採用することにしました。
理由は

  • 効果指定の範囲などが明確である
  • 拡張性が高い

と書いてみましたが、タグで囲まれた範囲をひとまとまりとして扱うと安心感があるな〜という個人的な感情が本音です。


NScripter

こんなかんじに@クリック待ちします。\
改ページされました。@
br
この文は、空行をはさんで表示されます。\


うちのやつ

<XML>
	<Chapter name="章名">//章
		<Clause name="節名">//節
			<Paragraph>//段落(頁、改頁単位)
				<Name></Name>//名前(なくてもOK)
				<Msg>こんなかんじに<click/>クリック待ちします。</Msg>//メッセージ
			</Paragraph>
			<Paragraph>
				<Msg>改ページされました。<click/><br/>
				<br/>
				この文は、空行をはさんで表示されます。</Msg>
			</Paragraph>
			//節の終端、または節途中の選択肢で異動先の章、または節のラベルを指定する予定
		</Clause>
	</Chapter>
</XML>


考えるまでもなくNScripterと比べて面倒くさそう。
ファイルサイズも膨らむし。
でも安心感あるんだよなー。


色変え方法は2通り用意していて、一つは変えっぱなし、もう一つはスタックして閉じると色が戻る感じ。
こういうはXML風だと見た目はっきりしてていいかなーと。

<Paragraph>
	<Msg>最初はデフォルト色で
	<color value="0xFF0000">赤に変わり
	<color value="0x0000FF">青に変わり
	</color>一つ閉じると赤に戻り
	</color>二つ閉じると元に戻ります。</Msg>
</Paragraph>
<Paragraph>
	<Name>arvitos</Name>
	<Msg>もう一つの実装は
	<color value="0xFF0000"/>変えっぱなしです</Msg>
</Paragraph>


とりあえず文章はこの辺にして、画像周りの処理を造ってみようと思います。