6

Meteorite で Meteor 0.6.3 を使用しています。マルチプレイヤーに Meteor を使用する Three.js を使用してゲームを開発しようとしています。完全なコードはこちら。Atmosphere パッケージhereを使用してみましたが、次のようになります。

ReferenceError: THREE が定義されていません

私の回避策は、テンプレート ファイルのヘッダーに Three.js を含めることでした。これは、クライアントが起動するまで Three.js 関数を呼び出さない場合に機能します。プロトタイプを使用して味方クラスを定義しようとしたときに問題が発生しました。次のようなコードがありました:

var Enemy = function() {
 this.mesh = new THREE.Mesh();
};

var Enemy = function(){};
Enemy.prototype = new Entity();

次のように記述されている場合、コードは正常に機能しますが、これにより、THREE が定義されていないというエラーが発生します。

var Entity = function() {
 this.mesh = new THREE.Mesh();
};

var Enemy = function() {
 this.mesh = new THREE.Mesh();
};

このようなプロトタイピングを使用して、同じ基本インターフェースを持ついくつかのタイプのエンティティを管理できるようにしたいと考えています。私も試したことがいくつかあります:

  1. ドキュメントに基づいて、プロジェクト/、プロジェクト/クライアント/、プロジェクト/クライアント/互換性/、およびプロジェクト/lib/にthree.min.jsを配置してみました。THREE が定義されていない、または Meteor がクラッシュしたと表示されるたびに。

  2. Three.js を呼び出す html ファイルでこれらのプロトタイプを定義します。

私の質問を明確にするために、Three.js をロードしてからすべてのタイプ ファイルをロードし、Meteor.startup() でクライアントを開始しようとするようにファイルを構造化する方法を誰かが提案できるかどうか疑問に思っています。現在のファイル構造は次のとおりです。

project/model.js
project/server/server.js
project/client/game.css
project/client/game.html
project/client/game.js

他に提供すべき情報があれば教えてください。キーワードを酷使しすぎていないことを願っています!

4

4 に答える 4

4

編集: Meteor の新しいバージョンでは、three.js を client/compatibility に入れることができます。þăדᴚῖↄڛの回答を参照してください。


Three.js は、それ自体をグローバル ウィンドウ オブジェクトにアタッチしません。代わりに、var THREE のみを定義します。

一方、Meteor はロードされたすべてのファイルのスコープを作成するため、このスクリプトで定義されたすべての var はグローバルではありません。そのため、THREE はグローバルに表示されません。

window.THREE = THREE;three.js ソース ファイルの末尾に を追加すると、この問題は解決します。

于 2014-05-27T18:42:17.633 に答える
2

最後に、Meteor 1.3 以降では、NPM モジュールがそのままサポートされています。Three.js の追加は、実行するのと同じくらい簡単です

npm install three

Meteor アプリのルートで、次にコードで、任意のファイルで、これを一番上に置くだけです:

import THREE from 'three'

以上です!

Meteor 1.3 はまだベータ版なので、試すには実行する必要があります

meteor update --release METEOR@1.3-beta.12

あなたのアプリで。

于 2016-03-06T19:55:52.727 に答える
1

Meteor では、/libディレクトリに配置されたスクリプトが他の何よりも先にロードされます。https://github.com/mrdoob/three.js/zipball/masterから Three.js の最新バージョンを入手してそこにドロップすることをお勧めします。

于 2013-05-29T07:25:37.057 に答える
1

THREE.js を lib に入れないでください。入れclient/compatibilityます。

ドキュメントから:

一部の JavaScript ライブラリは、client/compatibility サブディレクトリに配置した場合にのみ機能します。このディレクトリ内のファイルは、新しい変数スコープにラップされることなく実行されます。これは、トップレベルの各 var がグローバル変数を定義することを意味します。さらに、これらのファイルは他のクライアント側 JavaScript ファイルの前に実行されます。

あなたの問題は、他の回答で述べたように、変数を定義するとvar、プロジェクト全体ではなく、モジュールのスコープに対してローカルな変数が作成されることです。含める必要はありませんでしたwindow.THREE = THREE;

于 2014-10-22T14:57:04.023 に答える