HSP とかが goto メインなのはセーブ・ロードの実装が 簡単だからじゃないのかなあ。 吉里吉里 (のKAG) では if の中にラベルを書けない (セーブポイントにできない) っていう制限があるけど、 あれもつまりそういうことだろう。 ゲームプラットフォームとして、if/while を取るか セーブ機構を取るかという選択ならセーブ機構になるよね。
(00:43)
ツッコミ欄は狭いのでこっちにします。
> 自分でセーブ機能を実装するってこと? > システムがその時点のスナップショットを > 取っておく機能を持つってのはあるような > 気がしますから、あんまり関係ないような > 気がします。
うーん、うまく説明できるかな。 例えばありがちなビジュアルノベルのスクリプトを例にすると、 次のように書いたとして (微妙に Ruby 風)、
a = true if フラグチェック 背景1表示 立ち絵1表示 テキスト1…… b = true <<<セーブポイント1>>> 背景2表示 立ち絵2表示 テキスト2…… end
セーブポイント 1 でセーブして別プロセスでロードしたときに、
の状態でセーブポイント 1 から始められる、というのが理想です。
しかし例えば Ruby で上記のように書いたとすると、 データは特定のオブジェクトのインスタンス変数で妥協すればなんとかなりますが、 if 文の途中にすっとんでいけません (callcc ではプロセスをまたげない)。
また KAG3 でも上記のような書きかたは禁止されており、 次のように書かないといけません (文法は違います)。
フラグ a = true if フラグチェック 背景1表示 立ち絵1表示 テキスト1…… フラグ b = true end <<<セーブポイント1>>> if フラグチェック 背景2表示 立ち絵2表示 テキスト2…… end
これが「if の中にはラベルを書けない」という制限です。 その代わり、この制限にのっかっていれば goto ラベルを書いとくだけで セーブ・ロードを処理系が面倒見てくれます。 変数にも「勝手に保存される変数」と「ゲーム終了ごとに中身が消える変数」 があって、「勝手に保存される変数」はロードすると勝手に復帰します。
それでは、if 文 (やサブルーチン呼び出し) の中に セーブポイントを置けないもんでしょうか。 できないことはないでしょうが、関数呼び放題、if/while 使い放題の言語で 普通に continuation を保存してしまうとデータの融通が効きません。 例えばちょっとスクリプトが変わっても同じセーブデータを使いたいとか、 どこでセーブしたのか情報を取り出したいとか。 それだったらちょっとくらい制御構造を妥協してもいいんじゃないか、 と言いたいのです。
まとまらねえな。
(04:25)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
自分でセーブ機能を実装するってこと? システムがその時点のスナップショットを取っておく機能を持つってのはあるような気がしますから、あんまり関係ないような気がします。
if の中でラベルを書けないっていうのは、よくわからないなぁ。なんか根本的な勘違いしてそうですけど。
注意しとくと、勘違いってのは、私がって意味ですね。
フラグとかのデータについては、あんまり関係ないですね。それはいいとして。背景データとか、その辺も、同じデータ構造の問題になりますね。
if文で駄目な理由がやっぱりわからないなぁ。例えば自分が処理系を作ったとして、どうしてそこで詰まるのかが思い浮かびません。保存しなきゃいけない状態は、トップレベルと変わらないような気がして。
もちろん、関数コールの途中とかだと、スタックの保存とか考えなくてはならなくて、面倒ってのは散々味わいました(え?)けど、if文の途中ってのが、ちと想像できません。
考えている、要求と制限で、色々と前提が変わっていて、話が合ってないだけな気もします。
ゲーム開発をわかりやすく(シンプルに)するための制限、として if文中でのラベルなしってのはあるかもしれないけれど。システムとして、そこに課題があるんだろうか。
なんか、私の知らない「状態」が存在したりするのかも。