0

編集 私はまだこれが起こった理由を知りたいのですが、プロトタイプに関するいくつかのものを読んだ後、私の解決策は、このhttp://freshbrewedcode.com/derekgreer/2011/12/31に従って、2つのオブジェクトがベースプロトタイプをオーバーライドしないようにすることでした/ solid-javascript-the-liskov-substitution-principle /

私は3つのオブジェクトを持っています

ベースオブジェクトはオブジェクトコントロールと呼ばれます

オブジェクトmoneyBagとオブジェクトmovementPadは、どちらもコントロールのプロトタイプを継承します。

マネーバッグとmovementPadの両方に2つの異なる描画関数があるため、コードは次のようになります。

Money.prototype.Draw = function (context) {
    console.log("foo2");
}

MovementPad.prototype.Draw = function (context) {
    console.log("foo1");
}

私のHUD.jsでは、これらのオブジェクトは両方とも初期化されており、Hudはこれらの2つのオブジェクトを次のように描画すると呼びます

var movementControl = new MovementPad(screenManager, 1,1,1,1);

var money = new Money(screenManager, 10, 10, 37, 36);

   // .... code skipped
this.Draw = function (context) {
    movementControl.Draw(context);
    money.Draw(context);
}

私の問題は、これらのオブジェクトの両方が描画メソッドを呼び出していないことです。最初にmovementPadを初期化すると、その描画メソッドが呼び出されます。最初にお金を初期化すると、その描画メソッドのみが呼び出されます。

両方の描画メソッドが呼び出されないようにプロトタイプを理解したり、間違ったことをしたりするのを見逃しているのは何ですか。

(以下の詳細コード)

function control(x, y, width, height) {
    "use strict"
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;

    var defaultImg = new Image();
    defaultImg.src = "blank.png";
}


    //.... code skipped

control.prototype.Draw = function (context) {
    context.drawImage(defaultImg, this.x, this.y, this.width, this.height);
}

MovementPad.js

MovementPad.prototype = control.prototype;
MovementPad.prototype.constructor = MovementPad;

function MovementPad(screenManager, x, y, width, height) {
    "use strict"
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;

    //.... code skipped

    MovementPad.prototype.Draw = function (context) {
        context.drawImage(movementPad, x, y , width ,height);

    }

}

Money.js

Money.prototype = control.prototype;
Money.prototype.constructor = Money;

function Money(screenManager, x, y, width, height) {
    "use strict"
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;

  //.... code skipped

    Money.prototype.Draw = function (context) {
        context.drawImage(moneyBag, x, y, width, height);
    }
}
4

1 に答える 1

0

とのcontrol.prototype両方のプロトタイプに同じインスタンスを割り当てたため、メソッド宣言は互いに混乱しています。MoneyMovementPadDraw

プロトタイプを個別のインスタンスにします。

Money.prototype = new control();
// ...
MovementPad.prototype = new control();

そしてあなたのDraw割り当てはうまくいくはずです。

于 2012-11-11T20:43:49.197 に答える