質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%

Q&A

解決済

1回答

1780閲覧

ゲーム開発での"ゲームの定義"の抽象化/データ化を試みる上で、動的にパラメータを与える必要のある要素のセンスのある定義方法

mozukichi

総合スコア57

1グッド

0クリップ

投稿2015/12/04 01:38

注意:ハイコンテキストな話題なので、裏の文脈が読み取れないと答えにくい質問かなと思っています

参考:ハイコンテクストとは - はてなキーワード

ゲーム開発において、ソースコードレベルで定義する必要のないものを設定ファイルとしてXMLフォーマットの定義を試みています。

構造が単純なものについての定義は問題ないと感じています。

例:画像にidをつける

xml

1<image id="block" src="block.png" />

例:スプライトを定義する

xml

1<sprite id="block" image="block" pivot="center-bottom" />

例:ゲーム要素(エンティティ)を定義する

xml

1<entity id="block"> 2 <view> 3 <view-sprite sprite="block" /> 4 </view> 5 <body> 6 <body-box x="0" y="0" width="100" height="100" pivot="center-bottom" /> 7 </body> 8</entity>

しかし、ゲーム要素(エンティティ)の例で、動的にパラメータを与える必要があるパターンがあります。

例えば、上の例で、<sprite><body-box>のサイズを動的に与えることが出来るパターンで、なんとか定義方法を設計した場合、以下の様なパターンしか思いつけていません。

xml

1<entity id="block"> 2 <parameters> 3 <parameter name="width" type="int" /> 4 <parameter name="height" type="int" /> 5 </parameters> 6 <view> 7 <view-sprite sprite="block" width="$width" height="$height" /> 8 </view> 9 <body> 10 <!-- 物理ボディ(物理演算用) --> 11 <body-box x="0" y="0" width="${width}" height="${height - 10}" /> 12 </body> 13</entity>

上の例では、"block"という<entity>widthheightというパラメータを整数で受け付けて、<view-sprite><body-box>に渡しています。

<body-box>では、heightから「10を引く」という計算を行っていますが、ここでheight="${height - 10}"という表現が出てきてしまっています。

これでは、このデータを駆動させるエンジン側で、計算式を解析する必要が出てしまい、XML書式チェックだけでなく、そのプロパティの中身の書式のチェックも必要になり、シンプルではないセンスの無い仕様のように感じてしまいます。

この計算に関しては、Polymerのcomputed propertyのように、計算そのものを実装に逃がした方がシンプルでしょうか?

何かセンスの良い解決方法はないでしょうか?

hpfoon👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

java フレームワークの幾つかは、バックエンドに、ミドル処理のダイナミックな結果を保持させて
フロントエンジンがバックエンドのデータを参照することでフロント処理が動的に動きを変化させます。
jsfなどのxhtml/xml ベースのフレームワークで使われています。
xml は、うめこみの動的な簡易言語が利用できるようになっていて、ブロック単位でループ処理出来るもの、ループや条件分岐は出来ないが、タグのプレースホルダー内に記述された簡易言語構文を解釈して動作したりします。

hight - 10 でもいいんじゃないですか。でも、可能なら、this.height - const.ten < v.value ? v.getValue() : x.getValue()
とかやれたらもっと可能性がひろがる。
別にこういう書き方を強制するものではなくて、簡易言語の文法バリエーションがほとんど java に近く、省略表記も可能で php perl のような短い文字数で複雑なしょりもできる、みたいな実装になってれば使えるケースも出てくるかもしれないし。

安易に作るなら、タグのループ、条件分岐処理と、埋め込みマクロとして、javascript か。xmlパーサを独自で用意して、埋込構文 例えば {{...}} を検出毎にその場でスクリプトの実行結果を得て最終的な結果に反映でくればいいかな、と。
パターンゲーなら、構造化したパターンリストを読み込んで動作するロジックを、処理中結果で動的にパターン変化するようなら動的なパターン変化に対応可能なロジックをそれぞれ作り込むのがよろしいのでは。

計算そのものを実装に逃す、結局これやると xml は呼び出しだけなんで簡潔になるけど、計算にパターンが出てきたり、計算の掛け算が割り算に変わったからそこだけ直してコンパイル、テスト、ちょっと直してコンパイル、実機にインストールしてリモートデバッグ、しんどい、デバッグ中のまんま、スクリプトだけ差し替えて手順を簡素にできないか、、、、堂々めぐりな予感ですが、そんな感じです。スマートに作ったつもりでも、作り込んでいくうちに、バージョンアップを重ねるうちにそこらじゅうでボロがでてきてツギハギだらけになります。なので、どれがいいとは言えませんが、自分としては、
前提として、ゲーム用の粒度の細かいシナリオがあり、基本シナリオ通りに動作するが、一部ではキャラクタが自分の意思で行動するかのようなランダム性ももたせたい、なら、xmlパーサー+ブロック制御用タグ+インライン処理用兼構造処理用の簡易言語、かな。

投稿2015/12/04 02:42

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ipadcaron

2015/12/04 03:04

簡易言語の部分ですが、自分が実装するとしたら、入力式のパース結果の中間コード形式(ノードツリー)をキャッシュしておいて2度 目は字句解析を端折って、キャッシュから取得して、実行するような実装にします。細かいことですが、スピードアップの通常考えられる仕組みは大抵の簡易言語は多くを実装してるものです。なので、計算式やパラメタ付きメソッド呼び出しがループ処理中で1000 回実行されても、1000 の最初の1回だけは、字句解析、構文解析、中間コード生成、実行処理、と手順が多くなるけど、2回目以降は機械的でスマートでシンプルな動作になると思います。 ゲームのシナリオ解析実行エンジンは中核の機能のひとつだと思うので見えない部分の代表でもあるわけで、言い換えれば持てる知識を総動員する処理なのでスマートは求めなくてもいい気がします。xml として開発サイドに目に見える部分は、スマートでシンプルで、ちょっとしか書いてないけどこんばに一杯色々できるみたいなものがベストかなぁ、と。
mozukichi

2015/12/04 04:30 編集

> xml は、うめこみの動的な簡易言語が利用できるようになっていて、 ~~こちらはXMLの仕様として何かあるんでしょうか?~~ (あれ、teratailで打ち消し線使えない?!うおあああああ!!!) あ、これはJavaフレームワークの例の話ですね。
ipadcaron

2015/12/04 06:35

http://s2container.seasar.org/2.4/ja/s2dxo.html#ognl シーサーの簡易言語です。 http://s2container.seasar.org/2.4/ja/ognl.html 式言語って言ってるから、ブロック制御は無さそうですね。 springも他の巨大fwも全部手作りだと思います。java 標準では、el式がソレになります。 java にかぎらず、phpdもパイソンでも、呼び方が異なるだけかと。 テンプレートエンジンは、ブロック構造が評価できて、インラインの式評価もできるようになっています。 例として、身近なjava fw をあげただけです。
mozukichi

2015/12/09 00:26

また色々考察は進めようと思いますが、本件の質問としては、 @ipadcaron さんの回答をベストアンサーとさせて頂きました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問