2

バックグラウンド

私は簡単なWebGLパズルゲームを作成しました。人々が自分のレベルをデザインして共有できるようにしたいと思います。

私のアイデアは、レベルデータをURLのクエリ文字列に格納することでした。これにより、友人にレベルを試してもらいたい場合は、URLを共有するだけで済みます。

ゲームデータをクエリ文字列に保存する良い方法は何ですか?

私が試したこと

現在、私は経由でURLを生成します

"penguins.html?data="+encodeURIComponent(JSON.stringify([X,P]));

これは最初にデータをJSONに変換します:

[[[[3,-1,0,0,0],[4,-1,0,0,0]]],[{"x":20,"y":20,"dx":0,"dy":0,"vy":2.9999999871229686,"vx":0.0002779607689814708,"thetaf":180,"speed":3,"type":0,"state":6,"steps":0,"numfish":0,"d":4,"size":8},{"x":60,"y":60,"dx":20,"dy":100,"vy":97.51615330485151,"vx":-78.06665276994102,"thetaf":0,"speed":3,"type":17,"state":0,"steps":0,"numfish":0,"d":15,"size":89.00000012433019}]]

そしてそれを脱出して次のようになります:

[[[[3%2C-1%2C0%2C0%2C0]%2C[4%2C-1%2C0%2C0%2C0]]]%2C[{%22x%22%3A20%2C%22y%22%3A20%2C%22dx%22%3A0%2C%22dy%22%3A0%2C%22vy%22%3A2.9999999871229686%2C%22vx%22%3A0.0002779607689814708%2C%22thetaf%22%3A180%2C%22speed%22%3A3%2C%22type%22%3A0%2C%22state%22%3A6%2C%22steps%22%3A0%2C%22numfish%22%3A0%2C%22d%22%3A4%2C%22size%22%3A8}%2C{%22x%22%3A60%2C%22y%22%3A60%2C%22dx%22%3A20%2C%22dy%22%3A100%2C%22vy%22%3A97.51615330485151%2C%22vx%22%3A-78.06665276994102%2C%22thetaf%22%3A0%2C%22speed%22%3A3%2C%22type%22%3A17%2C%22state%22%3A0%2C%22steps%22%3A0%2C%22numfish%22%3A0%2C%22d%22%3A15%2C%22size%22%3A89.00000012433019}]]

現在のアプローチの欠点

このアプローチは小さなレベルではうまく機能しますが、大きなレベルではエラーが発生します。

414. That’s an error.

The requested URL /penguins.html... is too large to process.

現在のホスト(Google Appengine)にはURLの長さに制限があるようです。

質問

Javascriptでゲームデータを保存するためのより良い方法はありますか(つまり、URIが短くなります)?

4

4 に答える 4

3

データはクライアントによって解析および使用されるため、実際にそれらのデータをサーバーに送信する必要はありません。したがって、クエリ文字列を使用する代わりに、URLのハッシュ部分を使用します。

"penguins.html#" + encodeURIComponent(JSON.stringify([X, P]));

に注意して#ください。これで、次を使用して日付を解析できます。

JSON.parse(location.hash.substring(1));
于 2012-09-14T14:06:09.523 に答える
3

JSONデータを使用してGAEにPOSTを作成し、生成されたキーを使用してデータストアに保存し、そのキーに基づいてユーザーが共有できるURLを返すという同様のことを行いました。

したがって、JSONデータを投稿します。そのデータを次のようなオブジェクトに保存します。

/* Annotations ommitted */
public class GameInfo {
    public JSONObject gameData;
    public Integer key;
}

key自動生成されintます。http://www.mygameurl.com/games?id=1234次に、生成されたに対応するidを持つ次のようなURLをユーザーに返しますkey。次に、ユーザーにそのURLを共有させて、データストアからゲームデータを取り戻すことができます。ユーザーが共有しているURLを短縮し、ユーザーがURLをいじったり、ゲームデータを壊したりするのを防ぎます。

于 2012-09-14T14:10:24.497 に答える
1

ゲームをSQLデータベースに保存し、URLをDB上のIDにポイントしてロードするだけです。

または、必要に応じて、より複雑な場合は、URLをバイナリデータにパックしてbase64として表示するため、ゲームをロードするには、解凍する必要があります。

于 2012-09-14T14:05:45.327 に答える
1

開発しているゲームの種類によって異なりますが、場合によっては、特に決定論的なパズルゲームでは、状態全体を保存するよりも、特定のゲーム状態に至るまでのステップを保存する方が効率的です。

たとえば、チェスゲームを作成している場合、ボード内のすべてのチェスの駒の位置ではなく、ステップ(e4、e5; f4、exf4; Bc4 ...)を保存することで、ボードの状態を保存できます。ゲームの初期状態が手続き型で生成されている場合は、ゲームの最初のシードをURLに保存することもできます。

このように、特定のURLのリクエストがサーブレットによって受信されると、サーブレットは、指定されたURLからすべてのステップをやり直すことにより、終了状態を再計算できます。

于 2012-09-14T14:44:01.527 に答える