2

それで、ここで大きく考えましょう。まとめたいMMO全体があるとしましょう。当然、これにはMob、アイテム、スプライトシート、タイルマップ、ダイアログ、キャラクターなどの多くのリソースが含まれます。通常のゲームエンジンでは、マップや「」などの任意の指定子に基づいてこれらのリソースをロードまたはアンロードします。ゾーン"。

これのJavascriptバージョンはありますか?たとえば、ゲームループの実行中にできるでしょうか。

(擬似コード)

If playerPosition = theRightPlace {
    Load Resources for Next Zone
    Unload Resources for Previous Zone
}

これを行うことでパフォーマンスが向上しますか?それとも、ゲームのすべてのリソースをロードして、それで済ませる必要がありますか?一部のゾーンではクラスUglyMonsterがあり、別のゾーンではUglierMonsterがあるとします。

これらの2つのクラスは、John Resigの古典的な継承クラス構造(この会話スターターに到達するまで使用していたもので、この種のプログラムに便利です)を介してインスタンス化できます。

var UglyMonster = Monster.extend({
    Stuff why it is ugly;
    Make a position!
    Attack player!!!
});

var Monster1 = new UglyMonster();

または機能

function UglyMonster(name, position) {
    Create Ugly Monster!!!! Attack player!
    Stuff why it is ugly
}

var Monster1 = new UglyMonster('Fred', 100);

それらをすべて変数として宣言すると、ゲーム内のすべてのモンスターはグローバル変数に座っていますね。実際に変数を作成せずに変数を宣言する方法はありますか?私はJavascriptの継承ゲーム全体に慣れていないので、おそらく何か明らかなものが欠けています。

浮かんでいるこれらの種類のクラスを処理するための最良の方法は何ですか?それらを残しますか?それらを削除しますか?関数を介してインスタンス化しますか?それは顕著な違いをもたらしますか?

私が達成したいことを十分に明確に述べたことを願っています。ありがとうございました!

4

2 に答える 2

2

あなたが何を求めているのか完全にはわかりませんが

function UglyMonster(name, position) {
   ...
}

var UglyMonster = function (name, position) {
    ...
}

同等の式です。関数はJavascriptのオブジェクトです。どちらの場合も、これらの関数は変数として保存され、グローバルオブジェクトのプロパティとしてアタッチされます。

これら2つのアプローチでは、目立ったパフォーマンスの違いはありません。

の限り

実際に変数を作成せずに変数を宣言する方法はありますか?

変数を定義せずに宣言できます。ただvar x;。または、そのクラスのオブジェクトをすぐにインスタンス化せずに、クラスコンストラクターを宣言することもできます。これで、実際にはまだ実行されていない関数を定義できました。

アップデート

関数がjavascriptでどのように読み取られるかについてもう少し背景を説明します。

javascriptエンジンが新しいスコープを解釈しているときは、コード内のすべての変数宣言を現在のスコープ(グローバルスコープまたは現在の関数)の先頭に上げることから始まります。これらの変数は「存在」しますが、定義されていません。次に、関数宣言がデフォルトで一番上に移動されるため、関数宣言が処理されます。

したがって、次のコード

var x = 3+2;

var UglyMonster = function (name, position) {
    ...
}

function UglyMonster2(name, position) {
   ...
}

次のように記述されているかのように解釈されます。

var UglyMonster, UglyMonster2,x;

UglyMonster2 = function(name, position) {
   ...
}

x = 3+2;

UglyMonster = function (name, position) {
    ...
}

この例では、実際には関数が実行されていないことに注意することが重要です。それらは定義されたばかりです。実行するまで、関数は実行されず、UglyMonsterのインスタンスは作成されません。

new UglyMonster()。あなたが多くのモンスターを作成しているなら、それらをできるだけ長く作成することを延期することに価値があるかもしれません。結局のところ、パフォーマンスは多くのことに依存することになり、確実に伝える唯一の方法は、それをテストして自分で試してみることです。

于 2013-03-27T03:29:24.180 に答える
1

それはたくさんの質問です!一つずつ行ってみましょう。

リソースをロードおよびアンロードする必要がありますか?

ゲームエンジンはリソースをディスクからメモリにロードすると思います。ブラウザのJavaScriptでは、ディスクから読み取ることはできず、ネットワークから読み取る必要があり、それは遅いです。したがって、深刻なメモリ使用の問題がある場合にのみロード/アンロードします(ブラウザツールを使用してそれを確認します)。

それらをすべて変数として宣言すると、ゲーム内のすべてのモンスターはグローバル変数に座っています

あなたfunction UglyMonsterが違うと言っているのなら、そうではありません。それはグローバルな範囲にもあります。グローバルスコープをクリーンに保ちたい場合は、すぐに呼び出される関数式でコードをラップします。

(function(){}(
    // your code here
));

実際に変数を作成せずに変数を宣言する方法はありますか?

意味はわかりませんが、オブジェクトリテラルを定義できます。

var Monster = {
    attack : function() {  },
    eyes : 5
};

Object.create:を使用して任意のオブジェクトから継承することもできます。

var UglyMonster = Object.create(Monster);

浮かんでいるこれらの種類のクラスを処理するための最良の方法は何ですか?それらを残しますか?それらを削除しますか?関数を介してインスタンス化しますか?それは顕著な違いをもたらしますか?

私はあなたがここで何を求めているのか分かりません!:)

于 2013-03-27T03:37:13.470 に答える