1

この質問の他の多くの回答を調べましたが、回答が見つかりませんでした。

問題は、私の game.js ファイルで World グローバルを認識していないようです。

htmlファイルは適切に並べられています

<script src="js/world.js"></script>
<script src="js/game.js"></script>

IN world.js -- このコンストラクターは、他のコンストラクターと似ているため、機能するはずです。

var World = function(){

    var draw = function(ctx) {
        ctx.drawImage(bg1, 100, 100);
    };
}; 

IN game.js --犯人はおそらくここにいる

以下の 2 つの関数はどちらもネストされていないことに注意してください。

var World;

function init() {
    // Declare the canvas and rendering context
    canvas = document.getElementById("gameCanvas");
    ctx = canvas.getContext("2d");
    localPlayer = new Player(startX, startY); //WORKS CORRECTLY
    World = new World(); //SHOULD ALSO WORK CORRECTLY

...................................

init 関数の外側は

function draw() {
    // Wipe the canvas clean
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    World.draw(ctx);
    // Draw the local player

    // Draw the remote players
    var i;
    for (i = 0; i < remotePlayers.length; i++) {
        remotePlayers[i].draw(ctx);
    };
    localPlayer.draw(ctx);
};

World.draw(ctx) で、エラーが発生する場所です

Uncaught TypeError: Object [object Object] has no method 'draw' game.js:202 draw

さらに詳細が必要な場合は、喜んで対応させていただきます。かなり大きいことを除いて、すべてのコードを投稿したはずです。

4

2 に答える 2

0

インスタンスメソッドとして使用draw()している場合は、次のように定義する必要があります。

var World = function(){

    this.draw = function(ctx) {
        ctx.drawImage(bg1, 100, 100);
    };

}; 

thisキーワードを使用すると、関数をオブジェクトの外部で参照できますWorld

を使用varすると、可視性が関数Worldのスコープ内に制限されます。

于 2013-09-16T23:24:32.727 に答える
0

の複数のインスタンスが必要な場合はWorld、コンストラクターで関数をプロパティ ( on this) としてエクスポートする必要があります。Javascript: Do I need to put this.var for every variable in an object? を参照してください。プライベート変数との違いについて。そして、インスタンスをコンストラクターと同じ変数に書き込まないでください。

function World(){
    this.draw = function(ctx) {
        ctx.drawImage(bg1, 100, 100);
    };
}

var world, ctx;
function init() {
    // Declare the canvas and rendering context
    var canvas = document.getElementById("gameCanvas");
    ctx = canvas.getContext("2d");

    world = new World(ctx);

    …
}

function draw() {

    world.draw(ctx);

    …
}

ただし、静的モジュール (シングルトン) のみが必要な場合は、初期化を忘れWorldて、名前空間として機能する割り当て先のオブジェクト リテラルを使用します。これは@fahadashが提案したものです:

World = {
    draw: function(ctx) {
        ctx.drawImage(bg1, 100, 100);
    }
};

var ctx;
function init() {
    // Declare the canvas and rendering context
    var canvas = document.getElementById("gameCanvas");
    ctx = canvas.getContext("2d");

    // no World initialisation here! Do not try to call `new World`!

    …
}

function draw() {

    World.draw(ctx);

    …
}
于 2013-09-16T23:27:34.483 に答える