2012-03-10 4 views
5

私はGroovyでゲームを開発しています。私はクロージャを広範囲に使って、より洗練されたアーキテクチャにすることを考えています。 たとえば、状態の影響(中毒など)を実装する場合、プレイヤーのオブジェクトには、各ゲームターンを実行するためのクロージャのリストがあります。これらは、ゲームを保存するときにシリアル化する必要があります。groovyでクロージャをシリアライズ

通常、直列化が必要なオブジェクトにクロージャを格納するのは良い考えですか?または、より伝統的なアーキテクチャ(例えば、StatusEffectオブジェクトのリストを格納する)を選択する必要がありますか?

直列化クロージャが完全に可能である:-)各ゲームターンを実行するためのクロージャのリストを持つ

答えて

4

本当にいいアイデアのように聞こえます。 Groovyの1.8.5以降(ownerthisObjectdelegateシリアル化の前に除去することができるように)、それは二つの方法dehydraterehydrateとして容易になりましたがクロージャに追加された

しかし、私はのためのネイティブJava直列化の問題を持っていますデータの保存システム間で短命のデータを送信する場合、それは素晴らしいことがあります(ただし、それでもprotocol buffersまたはthriftを参照してください)

ゲームを更新する必要がある場合はどうなりますか? poisonedにバグがある場合、そのバグの毒素付きクロージャーを保存ファイルに保存したすべてのユーザーは、そのバグが消耗するまでそのバグを保持します。マルチプレイヤーゲームでは、人々が予期しないまたは望ましくない力を与えるためにゲームのセーブゲームファイルを操作することも可能です(パワー自体の機能がファイルに保存されるため)。私は毒の影響を操作することが分かりましたので、HPを取り除く代わりにHPを追加すると有益かもしれません;-)

要するに、私が言っていることは、私がキャラクターシートを書き、ユーザー、在庫、スコアなどに影響を与えています。ファイルが読み込まれると、クロージャをチェックして適用します。

+0

ありがとうございました。私はJava逆コンパイラを使ってGroovyが内部的にクロージャを実装していることを知り、それをシリアライズしても何の問題もないことを確認しました。それらはdoCallメソッドを持つクラスを自動的に生成し、クロージャーで使用されるすべての外部変数への参照を格納します。唯一の問題は、使用されていなくても常に 'this'への参照を持ちますが、あなたが言ったように、1.8.5 – ramirami

関連する問題