トップページgamedev
1001コメント403KB

■吉里吉里/KAG/TJS雑談質問スレ■その23

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2011/02/03(木) 13:12:07ID:6MBIOEHD
ノベルゲーム製作ツール吉里吉里/KAGのユーザーが雑談・質問をするスレです。
自作ゲームの進行状況や製作ツールについての話、TJS等の話題もどうぞ。
マルチポストはやめましょう。個人叩きも禁止です。

※スレで質問をするときは※
KAG/TJS/吉里吉里ドキュメント、スレの過去ログ、公式掲示板のログ、
FAQ、Google等で調べてからにしましょう。
努力の形跡が見られないとスルーされがちです。初心者?でも頑張れ!

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
吉里吉里2/KAG3雑談質問スレ_過去ログ
ttp://www.geocities.jp/kirikiri_log/

吉里吉里ダウンロードページ
ttp://kikyou.info/tvp/

ダウンロードしたアーカイブに含まれる「KAG System リファレンス」は
初心者にとって最も頼もしい教科書です。何度も繰り返し読みましょう。
■タグリファレンス … KAGの機能が網羅的、辞書的に載っています。
大よその機能(KAGでどんなことが出来るか)は把握しておきましょう。
■Tips/その他 … 陥り易いミスやより高度な使い方への足掛かりになる
数々のTipsが記載されています。
■TJSをもっと使うために
ゲームのインターフェイスをカスタマイズしたい、また
KAGの命令に無いことをしたくなったらまずここを読んでみよう。

必要に応じて>>3-5の公式掲示板や講座等を併用してください。
(併用に、紙媒体の参考本が欲しい人は、ダウンロードページにリストがあります)

前スレ
■吉里吉里/KAG/TJS雑談質問スレ■その22
http://hibari.2ch.net/test/read.cgi/gamedev/1285897465/
0872名前は開発中のものです。2011/05/20(金) 19:12:28.26ID:eAwQCbJq
TJSについて詳しく無い人にわかるようにきちんと説明するのはかなり大変なので、要点だけ解説します。

まず、一番大本の obj[i] = new SystemButtonLayer(kag, kag.fore.base, btn(i)); では駄目なのか?

この場合、期待しているのは「ボタンが押された時にbtn関数が呼ばれる」事なのに、
この表記だと「ボタンを作成した時にbtn関数が呼ばれる」事になってしまいます。

つまり、最初の表記ではSystemButtonLayerに「btn関数を渡す」つもりで
「btn関数の呼び出し結果を渡してしまっている」ことがエラーの原因です。

(続く)
0873名前は開発中のものです。2011/05/20(金) 19:15:40.36ID:eAwQCbJq
TJSではbtn関数が定義されている状態で「btn()」と書くと、
その関数が呼び出した実行結果がとなります。関数そのものを
あらわすには「btn」と、括弧無しで表記する必要があります。

つまり、元々の意図通り「SystemButtonLayerに、ボタンが
呼び出された時に処理されるようにbtn関数を渡す」場合は、
以下のように表記するのが正しいことになります。

obj[i] = new SystemButtonLayer(kag, kag.fore.base, btn);

…でも、これはこれで何かおかしいですね?
そう、btn関数は引数をひとつ必要とする関数なのに、
これではボタンが押された時に引数無しでbtn関数が呼び出されてしまい、
やはりエラーになってしまうでしょう。

ではどうすればいいのか?

(続く)
0874名前は開発中のものです。2011/05/20(金) 19:26:16.66ID:eAwQCbJq
吉里吉里の関数は「ファーストクラスオブジェクト」と言って、
変数に代入が可能な要素になっています(その仕組みのおかげで、
SystemButtonLayerに関数を指定して、後から実行してもらう
事が出来ます)。

ですが、ファーストクラスオブジェクトとしての関数は、
「関数そのもの」と「関数が実行されるコンテキスト」の
2つの要素だけで構成されています。関数を実行する際に
与える引数は、含まれていません。

つまり、吉里吉里の素の表記では、引数まで含めて関数を
遅延評価するために変数に代入してやることは出来ません。

(続く)
0875名前は開発中のものです。2011/05/20(金) 19:29:42.81ID:eAwQCbJq
そこを何とかするための小技が「funccall」の一連の仕組みです。

詳細に書くと「目的の関数と引数を含めた新たなコンテキスト」を
作って、そのコンテキストで「目的の関数を目的の引数で呼び出す関数」
を作り、最終的にその関数を返値として返すという処理をしてるんですが、
自分で書いてて何言ってるんだという感じですね。

すいません、ややこしいのでなかなかうまく説明できる気がしません。

■ このスレッドは過去ログ倉庫に格納されています