<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>何もない場所 &#187; ゲーム</title>
	<atom:link href="http://blog.chisyamori.com/kay/category/games/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.chisyamori.com/kay</link>
	<description>──あなたの心の琴線に触れるようなものは何もないです。かといって、他の何があるわけでもないですが。</description>
	<lastBuildDate>Fri, 23 Dec 2011 21:39:39 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>「モニタにキス」試してみました。</title>
		<link>http://blog.chisyamori.com/kay/2009/10/10/368/</link>
		<comments>http://blog.chisyamori.com/kay/2009/10/10/368/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 09:07:28 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=368</guid>
		<description><![CDATA[以前書いた例のアレですが、試してみました。 ラブプラスで。 結論。 アリだわ。]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.chisyamori.com/kay/2009/09/13/351/" rel="external">以前書いた例のアレ</a>ですが、試してみました。<br />
<a href="http://www.amazon.co.jp/o/ASIN/B00266QNYI/nanimonaibasy-22/ref=nosim" rel="external">ラブプラス</a>で。</p>
<p>結論。</p>
<p><strong style="font-size:200%;">アリだわ。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2009/10/10/368/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>「428 ～封鎖された渋谷で～」感想</title>
		<link>http://blog.chisyamori.com/kay/2009/05/23/284/</link>
		<comments>http://blog.chisyamori.com/kay/2009/05/23/284/#comments</comments>
		<pubDate>Sat, 23 May 2009 04:25:54 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[ゲーム感想]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=284</guid>
		<description><![CDATA[ようやくクリアしました～。 428 ～封鎖された渋谷で～ では感想いきます～。 以下ネタバレ注意！ まず、一言。 最高だった。 これに尽きる。 もうほんと、プレイ開始から一気にやっちゃいましたね。もちろん虹の栞まで出しま [...]]]></description>
			<content:encoded><![CDATA[<p>ようやくクリアしました～。</p>
<p><a href="http://chun.sega.jp/428/" rel="external">428 ～封鎖された渋谷で～</a></p>
<p>では感想いきます～。<br />
以下ネタバレ注意！<br />
<span id="more-284"></span></p>
<p>まず、一言。</p>
<p><strong style="font-size:40px;line-height:150%;">最高だった。</strong></p>
<p>これに尽きる。<br />
もうほんと、プレイ開始から一気にやっちゃいましたね。もちろん虹の栞まで出しましたよ。<br />
これ今までにやったサウンドノベルの中で最高峰かも。</p>
<p>あとね、ひとみちゃんがゲロマブすぎてﾜﾛﾀｗ<br />
ドストライクです。<br />
亜智くんがね～。いい子なんだけど、ひとみの彼氏としてはちょっと厳しいかなと。<br />
本人よりも周囲の人間関係が……。父親は檻の中だし、ガラ悪い友達ばっかりだし……。そのうちKOKのナンバー2絡みでひとみちゃんがトラブルに巻き込まれるのでは……とか想像すると怖くて仕方ない。<br />
男性キャラだとお気に入りは御法川ですね。あの暑苦しさがたまらない。</p>
<p>操作性に関してですが、これはもう何度でも言いますよ。<br />
<strong>WiiリモコンはADVの為にある。</strong><br />
アクション性が皆無であり、複雑な操作を必要としないゲームで両手が塞がれる事ほど不条理な事はないですよね。</p>
<p>前回、<a href="http://blog.chisyamori.com/kay/2009/04/14/253/" rel="external">忌火起草の感想</a>の時にTIPがうざいと言ってましたが、撤回。<br />
実装の仕方によるわこれ。<br />
一番のポイントはバックログからも参照出来る、という点。<br />
忌火起草の時は、バックログからTIPに飛ぶ事が出来ないため、確認作業に気を取られて全く物語に集中出来ませんでした。<br />
人物名に関しては色が違うのでまだ判りやすかったんですが、小咄の方はぱっと見で絶対に判らないので、テキストを送るたびに「-」ボタンを押してTIPが無いか確認する必要があったんですよね。<br />
その点、428はかなりの親切設計です。仮に見逃してもバックログがあるので、TIP探しに気を取られる事もありません。</p>
<p>この手の大作ゲームをやってると思うんですが、やっぱエンターテイメント性って重要ですねー。<br />
ストーリーはほんと王道なんだけど、しっかりと作り込まれているので安心して楽しめる。<br />
作りのしょぼさをシナリオのみでカバーしてしまってる作品もあるし、個人的にそういうのも大好物ですけどね。</p>
<p>あと、我孫子さんのおまけシナリオは鬱シナリオでしたね～。<br />
尺の短さに救われました。キャラに感情移入する間もなく死んだので、まだダメージが少なかったというか……。（それでもボロ泣きしましたが）<br />
ずっぷずぷにはまった後にこの展開だったらまたしばらく立ち直れなくなってたところです。</p>
<p>ん～、ザッピングシステムにも言及しとくか。<br />
悪くは無いんですが、ちょっと引っ掛かるんですよねー。KEEP OUTとか。<br />
ゲーム内の設定やシナリオと関係の無い部分で進行を制御されるというのに違和感を覚える。<br />
あくまでゲーム内のシナリオで制限掛けてくんないと、ゲームとプレイヤーの一騎打ちという構図に制作者という神の手が介在してしまうというか、そこに手を出しちゃダメだろーみたいな。<br />
うむむ。考えがまとまらん。<br />
そう考えるとYU-NOはほんと秀逸だったな……。あのゲームもランダムウォークでエンカウントしてシナリオが進行する局面が多いという欠点はあるけれども。</p>
<p>もっとこう、ノベルという形態でシームレスにザッピングが成立する画期的な手法って無いですかね？<br />
通常のザッピングだと「視点」が切り替わるだけですが、ノベルだとどうしても「シナリオ」が切り替わっちゃいますもんね。</p>
<p>まあそんな画期的な方法を思い付いたら絶対人には話さずに自分でゲーム作ろうと思っちゃいますが。<br />
てかゲーム作りてぇ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2009/05/23/284/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「忌火起草 解明編」感想</title>
		<link>http://blog.chisyamori.com/kay/2009/04/14/253/</link>
		<comments>http://blog.chisyamori.com/kay/2009/04/14/253/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 17:11:46 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[ゲーム感想]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=253</guid>
		<description><![CDATA[はい前回に引き続きゲームの感想。 忌火起草 解明編 今回初めて、WiiによるADV（厳密にはノベルだけど）をプレイしたわけですが。 ※ネタバレを含みますので、閲覧注意。 やっぱね、やぁ～～っぱねっ！！ Wiiリモコンはこ [...]]]></description>
			<content:encoded><![CDATA[<p>はい<a href="/kay/2009/04/12/254/">前回</a>に引き続きゲームの感想。</p>
<p><a href="http://chun.sega.jp/kaimei/" rel="external">忌火起草 解明編</a></p>
<p>今回初めて、WiiによるADV（厳密にはノベルだけど）をプレイしたわけですが。</p>
<p>※ネタバレを含みますので、閲覧注意。<br />
<span id="more-253"></span></p>
<p>やっぱね、やぁ～～っぱねっ！！<br />
Wiiリモコンはこの為にあったんだなあと！<br />
<a href="/kay/2006/12/18/72/" rel="external">以前から</a><a href="/kay/2007/01/12/76/" rel="external">ずっと</a><a href="/kay/2007/06/30/108/" rel="external">言ってました</a>がっ！<br />
操作に関しては、従来のコントローラに比べて格段に快適です。<strong>基本的には</strong>。<br />
いや～……1、2ボタンは別に使わなくてもよかったんじゃね？<br />
アドベンチャーゲームなんて基本「進む」「戻る」「決定」「キャンセル」の4つがありゃ事足りるだろーがよ……。</p>
<p>あの、いっつも疑問だったんですが、地の文に挿入されるTIPってなんなんですかねあれ。<br />
うざくね？　TIPのボタンを無くしてそこにメニューボタンを配置すればよかったのに。<br />
物語に没入してるのに、いきなりミニ怪談とかやられても……。<br />
こう言うと「じゃあ見なけりゃいいじゃん」とか言われそうですが。<br />
KAYさん、そういうのスルー出来ないんですよね。アドベンチャーゲームに関してはそういうヌルいプレイの仕方したくないです。<br />
特に、キャラの補足説明TIPなんかは、そのまま地の文に書いとけば済む話なのでは？<br />
とにかく、いちいち物語を中断させられるのがすごくうっとおしかったです。</p>
<p>で、肝心のストーリーに関してですが。</p>
<p>あ、この辺からちょっとネタバレしていきますので、ご注意を。</p>
<div style="margin-bottom:100px;">&nbsp;</div>
<p>う～ん、さほど怖くなかったのはまあいいとして。KAYは今までも、本気で怖いと思ったホラーゲームに出会った事無いんで。<br />
かまいたちの夜とどっちが怖かった？　って訊かれたら「かまいたち」って答えます。</p>
<p>演出がしっかり作りこんであったので、ストーリーが少々アレでも充分楽しめました。<br />
吸血鬼編みたいな、全く違うストーリー展開のルートがもうちょっと欲しかったかなあという気はしますね。<br />
Wii版で追加された部分のシナリオに関しては、結構いい感じの終わり方でした。</p>
<p>そんな感じですね。ええ。<br />
このゲームに関しては、操作性について言及出来ればそれでよかったんです。<br />
ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2009/04/14/253/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「TIME HOLLOW -奪われた過去を求めて-」感想</title>
		<link>http://blog.chisyamori.com/kay/2009/04/12/254/</link>
		<comments>http://blog.chisyamori.com/kay/2009/04/12/254/#comments</comments>
		<pubDate>Sat, 11 Apr 2009 20:49:01 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[ゲーム感想]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=254</guid>
		<description><![CDATA[はいはいたまにはゲームの感想でも書きますよ……っと。 いやーあのね、たまにじゃなく定期的に書きたいなとは思っとるんですが。 なかなかゲームやってる時間がとれず……。 TIME HOLLOW -奪われた過去を求めて- この [...]]]></description>
			<content:encoded><![CDATA[<p>はいはいたまにはゲームの感想でも書きますよ……っと。<br />
いやーあのね、たまにじゃなく定期的に書きたいなとは思っとるんですが。<br />
なかなかゲームやってる時間がとれず……。</p>
<p><a href="http://www.konami.jp/time_hollow/" rel="external">TIME HOLLOW -奪われた過去を求めて-</a></p>
<p>このほど、ようやくクリア致しました。<br />
以下、ネタバレ含みますので、未プレイの方はお気を付けて。<br />
<span id="more-254"></span></p>
<p>久々のガチADV。良作でした。<br />
なんかこう、<a href="http://ja.wikipedia.org/wiki/%E3%81%93%E3%81%AE%E4%B8%96%E3%81%AE%E6%9E%9C%E3%81%A6%E3%81%A7%E6%81%8B%E3%82%92%E5%94%84%E3%81%86%E5%B0%91%E5%A5%B3YU-NO" rel="external">YU-NO</a>を彷彿とさせるような……。プレイした人なら判るよねこれ。つかむしろかなりYU-NOを意識して作ってるんじゃないかな？？　気のせい？<br />
ただ、素材とかプロットはいいのに、シナリオが結構大味な気がする。もっと練れたんじゃないの？　と。</p>
<p>以下、知ったかのトーシロにありがちな「俺だったらこうする」のコーナー。<br />
こっから色々とネタバレ炸裂し始めるので注意。</p>
<p>まず、一柳の母親の自殺理由。<br />
これ、かなり終盤になってからあの事故が自殺だったという事実とともに自殺理由が明かされますが、もっと序盤で明かして欲しかったなあ。<br />
その方がもっとスリリングな物語を楽しめた気がする。俺が厨二だからそう思うだけ？</p>
<p>なんかこう、最初からずーっと場当たり的に目の前の事態に対処してってるだけで、主人公の目的がちょっと希薄なんですよね。<br />
いや、一応は両親と暮らす平穏な日常を取り戻す、というとりあえずの目的はあるんだけれども。<br />
いくら運命を書き換えても殺され続ける少女、とかめっちゃ<del>萌える</del>燃えるやん。</p>
<p>これがもし、序盤でかのんの運命が明かされていたら……？<br />
苦悩しつつ、救われない少女の運命を書き換えようとあがき続ける主人公……あかん。どう考えても燃える展開しか思い付かない。<br />
そんなタイム歩郎を見たかった。</p>
<p>あと、気になったのがキャラ配置。<br />
歩郎と保おじさんは設定を合体させて同一キャラにしてもよかったんじゃ？<br />
いやこれは単純に「かのんって一応ヒロインだよね？」という予定調和とか王道とかその辺の観点からの意見ですが。<br />
「主人公は10代の少年であるべき」という日本の主人公像を踏襲しようという大人の事情とかも絡んでるんですかね。<br />
それと、EDで「歩郎先輩」とか言ってる女の子。あれは恐らくかのんの娘でしょうが、あの演出はなかなかよかったので一概に否定は出来ないっつー部分も。</p>
<p>ひとつ気になるのが、三原のけが。<br />
あれって結局どーなったんだ？　なんか最後の方は部活バッグみたいのを抱えてたので、怪我しない方向で過去が書き換わったような気もするんだけど、その辺、明確な記述って無かったような……。キャラクター紹介の画面でも「怪我してる」って書いたままだったし。</p>
<p>いや実はこのゲーム、途中までプレイしてて数ヶ月間ブランクがあった後に再開してクリアしたので、ちょっと記憶が曖昧な部分もあるんですが。<br />
三原君の怪我がどうなったのか、知ってる方がいたら教えて下さい。</p>
<p>え～っと。<br />
いずれにしろ、すごく楽しめた事には変わりないですよ？<br />
なんつーか、やっぱADV最高。もっとこういうゲームがいっぱい出ればいいのに。<br />
それと、最後に一言だけ言わせてくれ。</p>
<div style="font-size:36px"><strong>和織は俺の嫁。</strong></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2009/04/12/254/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>アドベンチャーゲームにゲームオーバーが要らない理由</title>
		<link>http://blog.chisyamori.com/kay/2008/11/07/162/</link>
		<comments>http://blog.chisyamori.com/kay/2008/11/07/162/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 09:38:06 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=162</guid>
		<description><![CDATA[あのね、遊びの幅が縮まるのよぶっちゃけ。 例えば、コマンド選択式のゲームの場合。下手な選択肢を選んだらゲームオーバーになるという前提で、セーブポイントから分岐点まで結構な距離があった場合、絶対に総当りしようとは思わないで [...]]]></description>
			<content:encoded><![CDATA[<p>あのね、遊びの幅が縮まるのよぶっちゃけ。<br />
例えば、コマンド選択式のゲームの場合。下手な選択肢を選んだらゲームオーバーになるという前提で、セーブポイントから分岐点まで結構な距離があった場合、絶対に総当りしようとは思わないでしょ。<br />
3Dとかのオブジェクトをクリックするタイプでも同じ。ゲームオーバーになりそうなポイントは避けます。</p>
<p>不正解の選択肢にお遊びのテキストやアクションを仕込んであったとしても、プレイヤーにはスルーされますよ？　全攻略するという前提で遊んでいる廃プレイヤー以外は。</p>
<p>じゃ逆に、なぜ制作者はゲームオーバーを仕込むのか？<br />
恐らくひとつひとつの選択肢に重みを持たせるという事なんでしょうが、もうちょっと別の方法論もあると思うんですよね。<br />
例えばサウンドノベル。分岐によってストーリーの内容ががらりと変わる、という事であれば、プレイヤーは慎重に選択肢を選ぶ事になりますし、総当りしてみようかというモチベーションにも繋がります。<br />
DQ5の結婚イベントもそうですね。これはRPGですが。</p>
<p>ゲームオーバーがあるとモチベーションは下がるし自由度は下がるし、全然いい事無いんですよねー。<br />
というわけでゲームクリエイターのみなさん、アドベンチャーゲームを作る際は、ゲームオーバーは仕込まないで下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2008/11/07/162/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ふと思ったんだけど</title>
		<link>http://blog.chisyamori.com/kay/2007/11/05/117/</link>
		<comments>http://blog.chisyamori.com/kay/2007/11/05/117/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 19:50:09 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/2007/11/05/117/</guid>
		<description><![CDATA[Wiiのバーチャルコンソール経由で、NSFの再生とか出来るようにならないかなあ……。 どんな音が出るのか聴いてみたい。]]></description>
			<content:encoded><![CDATA[<p>Wiiのバーチャルコンソール経由で、NSFの再生とか出来るようにならないかなあ……。<br />
どんな音が出るのか聴いてみたい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/11/05/117/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>バーチャルコンソールではじまりの森配信</title>
		<link>http://blog.chisyamori.com/kay/2007/06/30/108/</link>
		<comments>http://blog.chisyamori.com/kay/2007/06/30/108/#comments</comments>
		<pubDate>Fri, 29 Jun 2007 20:02:15 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/2007/06/30/108/</guid>
		<description><![CDATA[http://www.nintendo.co.jp/wii/vc/index.html ついに来ましたーーーーーーーっ！！！！！ あの不朽の名作「はじまりの森」がWiiのバーチャルコンソールに配信決定ですーーーーーーー！ [...]]]></description>
			<content:encoded><![CDATA[<p><a REL="external" HREF="http://www.nintendo.co.jp/wii/vc/index.html">http://www.nintendo.co.jp/wii/vc/index.html</a></p>
<p>ついに来ましたーーーーーーーっ！！！！！<br />
あの不朽の名作「はじまりの森」がWiiのバーチャルコンソールに配信決定ですーーーーーーー！！！！！！！１１１</p>
<p>あのな、とりあえず、何も言わずに買っとけ。そして、泣け。<br />
つか、任天堂はやっぱタイミング計ってたんだろうなあ。夏といえばはじまりの森だもんなあ。</p>
<p>でさ、でさ、これってWiiでアドベンチャーゲームを出すための布石？<br />
やっと気付いた？　Wiiリモコンが静的ゲームをプレイするために最適化されたデバイスだという事に。<br />
<a REL="external" HREF="http://www.chunsoft.co.jp/games/imabikiso/">忌火起草</a>の発表でチュンソフトには心底がっかりさせられたからなあ……。<br />
何やってんだよチュンソフト。こういうゲームこそWiiリモコン片手にごろんと横になりながらプレイさせろよ。つか、もちろんWiiにも移植するよな？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/06/30/108/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>文字描画レイヤ</title>
		<link>http://blog.chisyamori.com/kay/2007/04/10/101/</link>
		<comments>http://blog.chisyamori.com/kay/2007/04/10/101/#comments</comments>
		<pubDate>Tue, 10 Apr 2007 14:18:30 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=101</guid>
		<description><![CDATA[ようやくお披露目、前からちょくちょく話に出してた文字描画レイヤです。 KAGのMessageLayerは非常によく出来ているのですが、いくつか痒い所に手が届かない部分があったので、それなら自分で作ってしまえと。 ……のは [...]]]></description>
			<content:encoded><![CDATA[<p>ようやくお披露目、前からちょくちょく話に出してた文字描画レイヤです。<br />
KAGのMessageLayerは非常によく出来ているのですが、いくつか痒い所に手が届かない部分があったので、それなら自分で作ってしまえと。<br />
……のはずだったんですが、シナリオ側の記述で結構フレキシブルに使えるんですよねMessageLayer。＾＾；<br />
例えば、リファレンスを鵜呑みにして複数文字にルビを振ろうとすればこういう感じになるんですが……</p>
<pre>[ruby text="ひ"]向[ruby text="まわ"]日[ruby text="り"]葵</pre>
<p>実際は<a HREF="/kay/2007/04/07/100/">こんなやり方</a>で均等にルビを配置する事が可能なわけで。<br />
あと、KAGはベタテキストを1文字ずつに分解してchタグとして解釈するので、袋文字を利用している場合に罫線『──』のような、2文字以上がひと続きとなる文字が現れると、2文字目の縁取り部分が前の文字に重なってしまい、文字が途切れてしまうという問題があったんですが（Fateで顕著だった気がする）、これも[ch text="──"]と書いてやる事で簡単に回避できちゃうんですよねー。</p>
<p>というわけで、今回紹介する文字描画レイヤのアドバンテージは、FontクラスのプロパティやdrawText()の引数が全てシナリオファイル側の記述で制御できる、という点くらいに……。<br />
このレイヤクラスは、chなどで文字が送られてきてもすぐに描画するわけではなく、一旦partsと呼ばれるバッファに溜め込み、描画したいタイミング（クリック待ちの直前など）でprint()メソッドを呼び出して一気に描画する、という方法を取っています。<br />
エロゲをインストールしたら即効で文字速度を最速に設定してしまう人用。＾＾；<br />
まあ、KAGParserがテキストを1文字ごとに分解して吐き出すので、タグハンドラの書き方次第で1文字ごとの描画も全然いけますが。</p>
<p><span id="more-101"></span></p>
<pre>
//文字描画レイヤ
class TextLayer extends Layer {
    var padding = 12;           //パディング
    var lineSpace = 2;          //行間
    var rubySize = 13;          //ルビのサイズ
    var partsNum = 0;           //次に描画するパーツ番号
    var overParts = [];         //ページ内に収まりきらなかったパーツ   

                                //行頭禁則文字
    var noLeading = "%),:;]}｡｣ﾞﾟ。，、．：；゛゜ヽヾゝゞ々’”）〕］｝〉》」』】°′″℃￠％‰"
        "!.?､･ｧｨｩｪｫｬｭｮｯｰ・？！ーぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮヵヶ";
                                //行末禁則文字
    var noFollowing = "\\\\$([{｢‘“（〔［｛〈《「『【￥＄￡";
                                //分離禁止文字
    var noSeparation = /─{2,}|…{2,}|‥{2,}|\\d{2,}|[０-９]{2,}|[〇一二三四五六七八九]{2,}/;   

    var parts = [];             //フォント設定ごとの文字パーツ
    var defaultParts = %[
        text:           "",                 //描画する文字
        ruby:           "",                 //ルビ
        x:              padding,            //キャレットx座標
        y:              padding + rubySize, //キャレットy座標
        width:          0,                  //文字幅
        lineHeight:     0,                  //行の高さ
        cr:             false,              //改行するかどうか   

        valign:         "bottom",           //位置揃えの方法
        hinv:           false,              //縦中横
        image:          null,               //インライン画像   

        //fontオブジェクトプロパティ
        angle:          0,
        bold:           false,
        face:           "ＭＳ Ｐ明朝",
        height:         30,
        italic:         false,
        strikeout:      false,
        underline:      false,   

        //drawTextオプション
        color:          0x000000,
        opacity:        255,
        aa:             true,
        sdwLevel:       0,
        sdwColor:       0x000000,
        sdwWidth:       0,
        sdwOffsetX:     0,
        sdwOffsetY:     0
    ];   

    //コンストラクタ
    //横幅、高さ、デフォルトのフォント設定
    function TextLayer(owner, parent, w, h, def = %[]) {
        super.Layer(owner, parent);
        setSize(w, h);
        (Dictionary.assign incontextof defaultParts)(def, false);
        resetParts();
        assignFont(0);
    }   

    //デストラクタ
    function finalize() {
        super.finalize();
    }   

    //現在のパーツに文字を追加していく。
    //戻り値：ページ内に入りきらなかったパーツがあるかどうか
    function pushText(ch, ww = true) {
        var p = parts[-1];
        var p2 = parts[-2];
        var chWidth = getTextWidth(p, ch);
        var chHeight = getTextHeight(p, ch);   

        if(!p.text.length) {
            if((chWidth + padding * 2 &gt; width) || (chHeight + padding * 2 &gt; height)) {
                throw new Exception("大きすぎてレイヤに描画出来ません。");
                return;
            }   

            //高さのチェック
            if(p.y + chHeight + padding &gt; height) {
                p.text = ch;
                while(parts[-1] !== void &amp;&amp; !parts[-1].cr) {
                    overParts.insert(0, %[]);
                    (Dictionary.assign incontextof overParts[0])(parts[-1]);
                    parts.erase(-1);
                }
                return 1;
            }
        }   

        //幅は大丈夫？
        if(p.x + p.width + chWidth + padding &gt; width) {
            cr();
            return pushText((ww? wordWrap(ch): ch), false);
        }   

        p.text += ch;
        p.width += chWidth;
        p.lineHeight = chHeight if(!p.lineHeight);
        evenLineHeight(chHeight) if(chHeight &gt; p.lineHeight);   

    }   

    //画像パーツを追加する
    function pushImage(img) {
        var p = parts[-1];
        var p2 = parts[-2];
        var imgWidth = *(&amp;this.width incontextof img);
        var imgHeight = *(&amp;this.height incontextof img);   

        if((imgWidth + padding * 2 &gt; width) || (imgHeight + padding * 2 &gt; height)) {
            throw new Exception("大きすぎてレイヤに描画出来ません。");
            return;
        }   

        if(p.y + imgHeight + padding &gt; height) {
            p.image = img;
            while(parts[-1] !== void &amp;&amp; !parts[-1].cr) {
                overParts.insert(0, %[]);
                (Dictionary.assign incontextof overParts[0])(parts[-1]);
                parts.erase(-1);
            }
            return 1;
        }   

        if(p.x + imgWidth + padding &gt; width) {
            cr();
            return pushImage(img);
        }   

        p.image = img;
        p.width = imgWidth;
        p.lineHeight = imgHeight if(!p.lineHeight);
        evenLineHeight(imgHeight) if(imgHeight &gt; p.lineHeight);
    }   

    //改行
    function cr() {
        partsAdd();
        if(parts[-2] === void) { return; }   

        var p = parts[-1];
        var p2 = parts[-2];   

        p2.cr = true;
        p.x = padding;
        p.y = p2.y + p2.lineHeight + lineSpace + rubySize;
        p.lineHeight = 0;
    }   

    //禁則処理
    //tail...送り込み先の文字
    function wordWrap(tail) {
        var p2 = parts[-2];
        var bk = tail;   

        while(
            noLeading.indexOf(tail.substring(0, 1)) != -1 ||
            noFollowing.indexOf(p2.text.reverse().substring(0, 1)) != -1 ||
            noSeparation.test(p2.text.reverse().substring(0, 1) + tail.substring(0, 1))
        )
        {
            //禁則処理に引っ掛かったので1文字送り込む
            if(!p2.text.length) {
                p2.text = tail.substring(0, tail.length - bk.length);
                tail = bk;
                break;
            }
            var last = p2.text.length - 1;
            tail = p2.text.substring(last) + tail;
            p2.text = p2.text.substring(0, last);
        }   

        return tail;
    }   

    //文字の描画
    function print() {
        var n = parts.count;
        for(var i = partsNum; i &lt; n; i++) {
            var p = parts[i];   

            assignFont(i);   

            //位置揃え
            var textHeight = (p.image instanceof "Layer")? *(&amp;this.height incontextof p.image): getTextHeight(p, p.text);
            var y = p.y + (p.hinv? textHeight: 0);
            switch(p.valign) {
                case "top":
                    break;
                case "center":
                    y += (p.lineHeight - textHeight) \\ 2;
                    break;
                case "bottom":
                default:
                    y += p.lineHeight - textHeight;
            }   

            if(p.image instanceof "Layer") {
                if(this instanceof "VerticalTextLayer") {
                    p.image.setPos(height - y - p.image.width, p.x);
                } else {
                    p.image.setPos(p.x, y);
                }
                p.image.visible = true;
            } else {
                drawText(p.x + adjustX(i), y + adjustY(i), p.text, p.color, p.opacity, p.aa,
                    p.sdwLevel, p.sdwColor, p.sdwWidth, p.sdwOffsetX, p.sdwOffsetY);
            }   

            //ルビの描画
            if(p.ruby.length) {
                font.angle = 0;
                font.height = rubySize;
                font.bold = font.italic = font.strikeout = font.underline = false;   

                var rubyWidth = font.getTextWidth(p.ruby);
                var rubyY = p.y - font.height;
                if(rubyWidth &lt; p.width) {
                    var l = p.ruby.length;
                    var w = p.width / l;
                    for(var i = 0; i &lt; l; i++) {
                        drawText(p.x + Math.round((w * i) + (w - font.getTextWidth(p.ruby[i])) / 2), rubyY, p.ruby[i], p.color, p.opacity, p.aa,
                            p.sdwLevel, p.sdwColor, p.sdwWidth, p.sdwOffsetX, p.sdwOffsetY);
                    }
                } else {
                    var x = p.x - (rubyWidth - p.width) \\ 2;
                    if(x &lt; padding) {
                        x = padding;
                    } else if(x + rubyWidth + padding &gt; width) {
                        x = width - padding - rubyWidth;
                    }
                    drawText(x, rubyY, p.ruby, p.color,
                        p.opacity, p.aa, p.sdwLevel, p.sdwColor, p.sdwWidth, p.sdwOffsetX, p.sdwOffsetY);
                }
            }
        }
        partsNum = n;
        partsAdd();
    }   

    //高さを揃える
    function evenLineHeight(height) {
        var i = -1;
        while(parts[i] !== void &amp;&amp; !parts[i].cr) {
            parts[i--].lineHeight = height;
        }
    }   

    //ルビの分割
    //2分割までしか考慮しない。前のパーツにルビがあって、現在のパーツにはルビが無いという期待の元に実行される
    function splitRuby() {
        var p = parts[-1];
        var p2 = parts[-2];
        var length = Math.round(p2.ruby.length / (p2.text.length + p.text.length) * p2.text.length);
        p.ruby = p2.ruby.substring(length);
        p2.ruby = p2.ruby.substring(0, length);
    }   

    //パーツを追加する
    function partsAdd(replace = %[]) {
        var prev = parts[-1];   

        if(prev.text.length || (prev.image instanceof "Layer")) {
            //現在のパーツで、描画する文字があった場合のみ新規パーツを生成する
            parts.add(%[]);
            //とりあえず前の設定を引き継ぐ
            (Dictionary.assign incontextof parts[-1])(prev);
            //引き継げない分は初期化
            parts[-1].ruby = "";
            parts[-1].hinv = false;
            parts[-1].angle = 0;
            parts[-1].image = null;
        }   

        var p = parts[-1];
        delete replace.x;
        delete replace.y;
        delete replace.lineHeight;
        delete replace.width;
        (Dictionary.assign incontextof p)(replace, false);   

        p.x = prev.x + prev.width;
        p.y = prev.y;
        p.lineHeight = prev.lineHeight;
        p.width = 0;
        p.cr = false;
        p.text = "";        //引数でtextが指定してあっても無効   

        assignFont(-1);
    }   

    //初期化
    function resetParts() {
        partsNum = 0;
        fillRect(0, 0, width, height, 0);
        while(parts.count) {
            invalidate parts[0].image if(parts[0].image instanceof "Layer");
            parts.erase(0);
        }
        parts[0] = %[];
        (Dictionary.assign incontextof parts[0])(defaultParts);
    }   

    //idxで指定されたパーツの設定をfontオブジェクトに反映
    function assignFont(idx) {
        font.angle = parts[idx].angle;
        font.bold = parts[idx].bold;
        font.face = parts[idx].face;
        font.height = parts[idx].height;
        font.italic = parts[idx].italic;
        font.strikeout = parts[idx].strikeout;
        font.underline = parts[idx].underline;
    }   

    //拡張getTextWidth
    function getTextWidth(p, text) {
        if(p.hinv) {
            return font.getTextHeight(text);
        } else if(p.angle) {
            return Math.ceil(Math.abs(font.getEscWidthX(text)) + Math.abs(font.getEscHeightX(text)));
        } else {
            return font.getTextWidth(text);
        }
    }   

    //拡張getTextHeight
    function getTextHeight(p, text) {
        if(p.hinv) {
            return font.getTextWidth(text);
        } else if(p.angle) {
            return Math.ceil(Math.abs(font.getEscWidthY(text)) + Math.abs(font.getEscHeightY(text)));
        } else {
            return font.getTextHeight(text);
        }
    }   

    //X軸補正
    function adjustX(idx) {
        var p = parts[idx];
        if(p.angle &gt; 900 &amp;&amp; p.angle &lt;= 1800) {
            return Math.ceil(Math.abs(font.getEscWidthX(p.text)));
        } else if(p.angle &gt; 1800 &amp;&amp; p.angle &lt;= 2700) {
            return Math.ceil(Math.abs(font.getEscWidthX(p.text)) + Math.abs(font.getEscHeightX(p.text)));
        } else if(p.angle &gt; 2700) {
            return Math.ceil(Math.abs(font.getEscHeightX(p.text)));
        }
        return 0;
    }   

    //Y軸補正
    function adjustY(idx) {
        var p = parts[idx];
        if(p.angle &gt; 0 &amp;&amp; p.angle &lt;= 900) {
            return Math.ceil(Math.abs(font.getEscWidthY(p.text)));
        } else if(p.angle &gt; 900 &amp;&amp; p.angle &lt;= 1800) {
            return Math.ceil(Math.abs(font.getEscWidthY(p.text)) + Math.abs(font.getEscHeightY(p.text)));
        } else if(p.angle &gt; 1800 &amp;&amp; p.angle &lt;= 2700) {
            return Math.ceil(Math.abs(font.getEscHeightY(p.text)));
        }
        return 0;
    }
}   

//縦書き用文字描画レイヤ
class VerticalTextLayer extends TextLayer {
    var fontAngle;          //font.angleプロパティ
    var fontFace;           //font.faceプロパティ   

    //コンストラクタ
    function VerticalTextLayer(owner, parent, w, h, def = %[]) {
        super.TextLayer(...);   

        font.angle += 2700;
        fontAngle = &amp;font.angle;
        &amp;font.angle = &amp;myFontAngle;   

        font.face = "@" + font.face;
        fontFace = &amp;font.face;
        &amp;font.face = &amp;myFontFace;   

        font.getEscWidthX &lt;-&gt; font.getEscWidthY;
        font.getEscHeightX &lt;-&gt; font.getEscHeightY;   

        if(def.valign === void) {
            //縦書きの場合はcenterがデフォルト
            defaultParts.valign = parts[0].valign = "center";
        }
    }   

    //デストラクタ
    function finalize() {
        super.finalize();
    }   

    function drawText(x, y, *) {
        super.drawText(height - y, x, *);
    }   

    function fillRect(l, t, w, h, color) {
        super.fillRect(l, t, h, w, color);
    }   

    //assignFontオーバーライド
    function assignFont(idx) {
        super.assignFont(idx);   

        //縦中横
        if(parts[idx].hinv) {
            fontFace = font.face;
            fontAngle = font.angle;
        }
    }   

    property width {
        setter(v) {
            super.height = v;
        }
        getter {
            return super.height;
        }
    }   

    property height {
        setter(v) {
            super.width = v;
        }
        getter {
            return super.width;
        }
    }   

    property myFontAngle {
        setter(v) {
            fontAngle = v + 2700;   //3600以上を指定すると自動的に丸められるみたいです。
        }
        getter {
            return fontAngle + 900;
        }
    }   

    property myFontFace {
        setter(v) {
            fontFace = "@" + v;
        }
        getter {
            return fontFace.substring(1);
        }
    }
}</pre>
<p>あらゆる面でKAGのMessgeLayerに劣ってる感が漂ってますが、一応、基本的な機能は一通り揃えたつもりです。<br />
縦中横や縦方向の位置揃え（top, center, bottom）、禁則処理、インライン画像、ルビなどは全て実装してます。<br />
バグとかは、一応、気が付いた部分は全部取れてると思うんですが……。このクラスに限らず、今までここで公開したスクリプトで、バグを見つけた人がいれば教えて欲しいなあとか思いつつ、それ以前にこんな辺境で吉里吉里系のコンテンツやってるという事を、ほとんどの人が知らないだろな。＾＾；</p>
<p>ちなみに、このレイヤクラスはKAGシステムとは一切互換性はありません。というか、KAYがここで公開してるスクリプトは基本的にKAGとの互換性は考慮してないです。<br />
ただ、汎用的に使えるようには気を付けてるつもりなので、上手く使えばKAG上で運用する事も出来るかと。<br />
まあそんな訳で、この文字描画レイヤを使うにはこれ専用のタグハンドラを書かなければいけないわけですが……一応、自前のシステム用のタグハンドラは既にあるんですが、これを公開したところでなあ……KAGのMainWindowクラスもConductorクラスも使ってないんで、タグハンドラ部分だけ見せてもあんまし意味ないかなと。<br />
じゃあ自前のWindowクラスとかも公開しろよという話ですが、ここら辺はまだまだ書き掛けの部分なので。つか、Windowクラスなんかは多分一番最後までいじってると思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/04/10/101/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>KAGで複数文字に渡るルビを振る</title>
		<link>http://blog.chisyamori.com/kay/2007/04/07/100/</link>
		<comments>http://blog.chisyamori.com/kay/2007/04/07/100/#comments</comments>
		<pubDate>Sat, 07 Apr 2007 14:52:23 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=100</guid>
		<description><![CDATA[ああなんて事。 KAGでこれが出来ると判ってたら、一からシステム作ろうとは思わなかったかも……。 KAGシステムのrubyタグは、タグが現れた次の1文字に対してルビが振られる、……とリファレンスには書かれています。 まあ [...]]]></description>
			<content:encoded><![CDATA[<p>ああなんて事。<br />
KAGでこれが出来ると判ってたら、一からシステム作ろうとは思わなかったかも……。</p>
<p>KAGシステムのrubyタグは、タグが現れた次の1文字に対してルビが振られる、……とリファレンスには書かれています。<br />
まあ間違いでは無いんですが。KAGParserはベタテキストを1文字ずつに分解してchタグとして解釈するので。<br />
でも実際は、内部的には次の1文字ではなく、次に現れるchタグに対してルビが振られる、という挙動を採っています。<br />
なので、こういう風に書いてやると……</p>
<pre>[ruby text="ひ　ま　わ　り"][ch text="向日葵"]</pre>
<p>あはは……ほら……3文字に渡ってルビが振られるじゃん……。<br />
マクロ化するとこう。</p>
<pre>;マクロ定義
@macro name=mruby
@ruby text=%r
@ch text=%text
@endmacro

;使用例
[mruby r="ひ　ま　わ　り" text="向日葵"]</pre>
<p>ルビの文字間隔は半角スペースや全角スペースなどで調節する必要がありますが、これで少なくとも文字間隔が不揃いになるという事はなくなります。はぁ……。<br />
近いうちにKAYの作った文字描画レイヤ紹介します。<br />
<strong>複　数　文　字　に　渡　る　ル　ビ　を　振　る　こ　と　が　可　能</strong><br />
なやつ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/04/07/100/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正規表現リテラルの罠</title>
		<link>http://blog.chisyamori.com/kay/2007/03/25/98/</link>
		<comments>http://blog.chisyamori.com/kay/2007/03/25/98/#comments</comments>
		<pubDate>Sat, 24 Mar 2007 16:49:49 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=98</guid>
		<description><![CDATA[文法的に間違っていないにも拘らず、syntax errorが投げられてしまう例。 //2.28 stableにて確認 var regexp = //正規表現オブジェクト /[a-z]+/; どうやら、行コメントを書いて、 [...]]]></description>
			<content:encoded><![CDATA[<p>文法的に間違っていないにも拘らず、syntax errorが投げられてしまう例。</p>
<pre>//2.28 stableにて確認
var regexp = //正規表現オブジェクト
    /[a-z]+/;</pre>
<p>どうやら、行コメントを書いて、改行後すぐに正規表現リテラルが来ると例外が発生するようです。<br />
<a HREF="/blog/2007/03/ltaddalpha.html">前回のエントリ</a>と合わせて、公式の掲示板あたりに報告した方がよさそうかな？</p>
<p>（2007/03/28追記）</p>
<p>報告済み。修正済み。安定版は時期リリース版で対応かな？<br />
<a HREF="http://kikyou.info/tvp/bbs/bbs.cgi?mode=&amp;action=treeall&amp;num=10082" REL="external">http://kikyou.info/tvp/bbs/bbs.cgi?mode=&amp;action=treeall&amp;num=10082</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/03/25/98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>プライマリレイヤにltAddAlphaを指定すると……</title>
		<link>http://blog.chisyamori.com/kay/2007/03/21/97/</link>
		<comments>http://blog.chisyamori.com/kay/2007/03/21/97/#comments</comments>
		<pubDate>Tue, 20 Mar 2007 17:46:39 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=97</guid>
		<description><![CDATA[2.28安定版での話です。 とりあえず、以下のテストスクリプトを実行してみて下さい。 class TestWindow extends Window { var timer; var primary; var count [...]]]></description>
			<content:encoded><![CDATA[<p>2.28安定版での話です。<br />
とりあえず、以下のテストスクリプトを実行してみて下さい。</p>
<pre>class TestWindow extends Window {
    var timer;
    var primary;
    var counter = 0; 

    //コンストラクタ
    function TestWindow() {
        super.Window();
        borderStyle = bsSingle;
        innerSunken = false;
        setInnerSize(300, 300);
        visible = true; 

        timer = new Timer(createLayer, "");
        timer.capacity = 1;
        timer.interval = 50;
        add(timer); 

        primary = new Layer(this, null);
        primary.setPos(0, 0);
        primary.setSize(300, 300);
        primary.fillRect(0, 0, 300, 300, 0xffffffff);
        primary.type = ltAddAlpha;          //●
        primary.visible = true;
        add(primary);
    } 

    //デストラクタ
    function finalize() {
        super.finalize();
    } 

    function createLayer() {
        if(++counter &gt; 100) {
            timer.enabled = false;
            return;
        }
        var layer = new Layer(this, primary);
        layer.setPos(0, 0);
        layer.setSize(150, 300);
        layer.visible = true;
        add(layer);
    }
} 

var win = new TestWindow();
win.timer.enabled = true;</pre>
<p>↓こちらからダウンロードできます。<br />
<a HREF="/storage/startup.tjs">startup.tjs</a></p>
<p>50msごとにウィンドウの左半分にレイヤを1枚ずつ重ねていき、100枚になったら停止する、というだけのものです。<br />
これは……バグなのかなあ。仕様？　まあ、プライマリレイヤなんだから完全不透明なレイヤタイプを使えという事ですかね。</p>
<p>（2007/03/28追記）</p>
<p>公式の掲示板でW.Deeさんよりご回答いただきました。</p>
<p><a REL="external" HREF="http://kikyou.info/tvp/bbs/bbs.cgi?mode=&amp;action=treeall&amp;num=10082">http://kikyou.info/tvp/bbs/bbs.cgi?mode=&amp;action=treeall&amp;num=10082</a></p>
<p>というわけで、演算誤差が原因との事でした。まあ、プライマリレイヤはltOpaqueで十分だと思うので、特に問題はない、かな？<br />
プライマリ以外は……どうだろう。多分大丈夫だと思うけど。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/03/21/97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>外部からスーパークラスのプロパティを参照する</title>
		<link>http://blog.chisyamori.com/kay/2007/03/13/94/</link>
		<comments>http://blog.chisyamori.com/kay/2007/03/13/94/#comments</comments>
		<pubDate>Mon, 12 Mar 2007 17:31:22 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=94</guid>
		<description><![CDATA[以下のような感じで、外部からオブジェクトのスーパークラスのプロパティにアクセスする事が可能です。 TJS2おもろい。 //例えば、Layerクラスを継承したSubLayerというクラスからインスタンスを生成する var  [...]]]></description>
			<content:encoded><![CDATA[<p>以下のような感じで、外部からオブジェクトのスーパークラスのプロパティにアクセスする事が可能です。<br />
TJS2おもろい。</p>
<pre>//例えば、Layerクラスを継承したSubLayerというクラスからインスタンスを生成する
var layer = new SubLayer(window, parent);   

*(&amp;Layer.width incontextof layer) = 100;                 //setterを呼び出す
System.inform(*(&amp;Layer.absolute incontextof layer));     //getterを呼び出す</pre>
<p>メソッドなんかだと、Dictionaryクラスのメソッドを呼び出すのにincontextof演算子はほぼ必須ですので、見慣れたもんですが、プロパティの方はあまりこういう呼び出し方はしないのではないでしょうか。<br />
先に紹介した<a HREF="/kay/2007/03/04/92/">縦書きレイヤクラス</a>なんかで威力を発揮すると思います。<br />
実際に運用する際に、それが縦書きレイヤなのかそうじゃないのかわからない状態でオーバーライドしてしまったプロパティ（widthやheightなど）を参照したい場合。<br />
スタンダードに行くなら、instanceof演算子を使って処理を分けるのが普通でしょうが、似たような処理を2回も書くのはめんどくさいですもんねえ。＾＾；</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/03/13/94/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Layerクラスのオブジェクト生成直後のプロパティ一覧</title>
		<link>http://blog.chisyamori.com/kay/2007/03/08/93/</link>
		<comments>http://blog.chisyamori.com/kay/2007/03/08/93/#comments</comments>
		<pubDate>Thu, 08 Mar 2007 10:49:57 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=93</guid>
		<description><![CDATA[値が不定のものもあるので、ぴったりこの通りというわけではないです。まあ、参考程度に。 2.28 stableにて書き出しました。 absolute 0 absoluteOrderMode 0 attentionLeft  [...]]]></description>
			<content:encoded><![CDATA[<p>値が不定のものもあるので、ぴったりこの通りというわけではないです。まあ、参考程度に。<br />
2.28 stableにて書き出しました。</p>
<p><span id="more-93"></span></p>
<dl>
<dt>absolute</dt>
<dd>0</dd>
<dt>absoluteOrderMode</dt>
<dd>0</dd>
<dt>attentionLeft</dt>
<dd>0</dd>
<dt>attentionTop</dt>
<dd>0</dd>
<dt>cached</dt>
<dd>0</dd>
<dt>callOnPaint</dt>
<dd>0</dd>
<dt>children</dt>
<dd>Object</dd>
<dt>clipHeight</dt>
<dd>32</dd>
<dt>clipLeft</dt>
<dd>0</dd>
<dt>clipTop</dt>
<dd>0</dd>
<dt>clipWidth</dt>
<dd>32</dd>
<dt>cursor</dt>
<dd>crDefault</dd>
<dt>cursorX</dt>
<dd>-669</dd>
<dt>cursorY</dt>
<dd>414</dd>
<dt>enabled</dt>
<dd>1</dd>
<dt>face</dt>
<dd>dfAuto</dd>
<dt>focusable</dt>
<dd>0</dd>
<dt>focused</dt>
<dd>0</dd>
<dt>font</dt>
<dd>Object</dd>
<dt>hasImage</dt>
<dd>1</dd>
<dt>height</dt>
<dd>32</dd>
<dt>hint</dt>
<dd>&#8220;&#8221;</dd>
<dt>hitThreshold</dt>
<dd>16</dd>
<dt>hitType</dt>
<dd>htMask</dd>
<dt>holdAlpha</dt>
<dd>0</dd>
<dt>imageHeight</dt>
<dd>32</dd>
<dt>imageLeft</dt>
<dd>0</dd>
<dt>imageModified</dt>
<dd>1</dd>
<dt>imageTop</dt>
<dd>0</dd>
<dt>imageWidth</dt>
<dd>32</dd>
<dt>imeMode</dt>
<dd>imDisable</dd>
<dt>isPrimary</dt>
<dd>0</dd>
<dt>joinFocusChain</dt>
<dd>1</dd>
<dt>left</dt>
<dd>0</dd>
<dt>mainImageBuffer</dt>
<dd>21517360</dd>
<dt>mainImageBufferForWrite</dt>
<dd>22218752</dd>
<dt>mainImageBufferPitch</dt>
<dd>-128</dd>
<dt>name</dt>
<dd>&#8220;&#8221;</dd>
<dt>neutralColor</dt>
<dd>0xffffff</dd>
<dt>nextFocusable</dt>
<dd>Object</dd>
<dt>nodeEnabled</dt>
<dd>1</dd>
<dt><strong>nodeFocusable</strong></dt>
<dd>0</dd>
<dt>nodeVisible</dt>
<dd>0</dd>
<dt>opacity</dt>
<dd>255</dd>
<dt>order</dt>
<dd>0</dd>
<dt>parent</dt>
<dd>Object</dd>
<dt>prevFocusable</dt>
<dd>0</dd>
<dt>provinceImageBuffer</dt>
<dd>22214704</dd>
<dt>provinceImageBufferForWrite</dt>
<dd>-32</dd>
<dt>provinceImageBufferPitch</dt>
<dd>1</dd>
<dt>showParentHint</dt>
<dd>0</dd>
<dt>top</dt>
<dd>0</dd>
<dt>type</dt>
<dd>ltAlpha</dd>
<dt>useAttention</dt>
<dd>0</dd>
<dt>visible</dt>
<dd>0</dd>
<dt>width</dt>
<dd>32</dd>
<dt>window</dt>
<dd>Object</dd>
</dl>
<p>ひとつ気になったのが、nodeFocusableというプロパティがマニュアルに記載されてないですね。まあ、名前から大体どんなもんかはわかりますが……。<br />
あと、dump()というメソッドもマニュアルに載ってないです。とりあえず引数なしで実行してみると、コンソールにこんな情報が書き出されました。</p>
<pre>&lt;noname&gt; (object 0x015CDB88) (native 0x016446D0) (0,0)-(32,32) (32x32) invisible index=0 p ltAlpha</pre>
<p>う～ん、大体はわかりますが、よくわかんない部分もいくつかありますねえ。<br />
indexは親レイヤのchildrenプロパティにおける添え字の番号かな？　pってなんだpって。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/03/08/93/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fontクラスのプロパティをオーバーライドしてみる</title>
		<link>http://blog.chisyamori.com/kay/2007/03/04/92/</link>
		<comments>http://blog.chisyamori.com/kay/2007/03/04/92/#comments</comments>
		<pubDate>Sat, 03 Mar 2007 17:45:13 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=92</guid>
		<description><![CDATA[吉里吉里のFontクラスは特殊な位置付けで、ユーザが任意にnewする事が出来ません。 ただし、Layerクラスのfontプロパティとしてぶら下がっているFontオブジェクトのメンバに対しては、上書きが可能のようです。 こ [...]]]></description>
			<content:encoded><![CDATA[<p>吉里吉里のFontクラスは特殊な位置付けで、ユーザが任意にnewする事が出来ません。<br />
ただし、Layerクラスのfontプロパティとしてぶら下がっているFontオブジェクトのメンバに対しては、上書きが可能のようです。<br />
これを利用して、こんな珍妙なLayerクラスが作れます。</p>
<p><span id="more-92"></span></p>
<pre>//縦書きレイヤ
class VerticalLayer extends Layer {
    var fontAngle;          //font.angleプロパティ
    var fontFace;           //font.faceプロパティ

    //コンストラクタ
    function VerticalLayer(*) {
        super.Layer(*);

        font.angle += 2700;
        fontAngle = &amp;font.angle;
        &amp;font.angle = &amp;myFontAngle;

        font.face = "@" + font.face;
        fontFace = &amp;font.face;
        &amp;font.face = &amp;myFontFace;
    }

    //デストラクタ
    function finalize() {
        super.finalize();
    }

    //他の描画系メソッドも似た様なやり方でオーバーライドすればいい感じに動くはず
    function drawText(x, y, *) {
        super.drawText(height - y, x, *);
    }

    property width {
        setter(v) {
            super.height = v;
        }
        getter {
            return super.height;
        }
    }

    property height {
        setter(v) {
            super.width = v;
        }
        getter {
            return super.width;
        }
    }

    property myFontAngle {
        setter(v) {
            fontAngle = v + 2700;   //3600以上を指定すると自動的に丸められるみたいです。
        }
        getter {
            return fontAngle + 900;
        }
    }

    property myFontFace {
        setter(v) {
            fontFace = "@" + v;
        }
        getter {
            return fontFace.substring(1);
        }
    }
}</pre>
<p>(^-^)v<br />
もちろん、メソッドに関しても同様のやり方でオーバーライド出来ます。<br />
ただ、見て判るとおり、このレイヤはかなり特殊な振る舞いをしますので、あんまり人に勧められるもんじゃねーかもです。</p>
<p>今、KAGで言うMessageLayer的な文字描画用レイヤを書いてる最中なんですが、最初はMessageLayer同様、真偽値を取るverticalというメンバを持たせて処理を分けてたんですね。<br />
でもなんか、めんどくせーのよこれが。縦書きの時だけ一時レイヤに描画して、affine変換で回転させてべちゃっと貼り付けるか？　とも思ったんですが、描画系のメソッドはなんか重そうというファジーな理由で却下しました。＾＾；</p>
<p>そのうち、気が向いたら今書いてる文字描画レイヤもここに載せるかもです。例のごとく、超簡単なやつですよ？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/03/04/92/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>メンバの有無の確認方法</title>
		<link>http://blog.chisyamori.com/kay/2007/03/01/91/</link>
		<comments>http://blog.chisyamori.com/kay/2007/03/01/91/#comments</comments>
		<pubDate>Thu, 01 Mar 2007 12:27:00 +0000</pubDate>
		<dc:creator>KAY</dc:creator>
				<category><![CDATA[ゲーム制作]]></category>
		<category><![CDATA[吉里吉里]]></category>

		<guid isPermaLink="false">http://blog.chisyamori.com/kay/?p=91</guid>
		<description><![CDATA[TJS2で、Dictionaryクラスのオブジェクト（辞書配列）にメンバが存在するかどうかは var dic = %[]; if(dic.hoge === void) { System.inform("無いよっ"); } [...]]]></description>
			<content:encoded><![CDATA[<p>TJS2で、Dictionaryクラスのオブジェクト（辞書配列）にメンバが存在するかどうかは</p>
<pre>var dic = %[];
if(dic.hoge === void) {
    System.inform("無いよっ");
}</pre>
<p>このようにvoidとの比較で出来ますが、これと同じ事を他のオブジェクトでやると例外が出ます。</p>
<pre>var obj = new Date();
if(obj.hoge === void) {     //この行で例外が発生する。
    System.inform("無いってば！");
}</pre>
<p>じゃあ辞書配列以外のオブジェクトでメンバの有無はどうやって確認するんだという話ですが、typeof演算子を使います。</p>
<pre>var obj = new Date();
if(typeof obj.hoge == "undefined") {        //これならOK。
    System.inform("無いってば！");
}</pre>
<p>この仕様は結構はまりやすそう（というかはまった）なので、気を付けましょう。<br />
typeof演算子による比較は辞書配列でも使えますので、はまりそうだなという人は、比較の際は必ずtypeof演算子を使う、という風に決めておいた方がいいかも。</p>
<p>というお話。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chisyamori.com/kay/2007/03/01/91/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

