2

次の行を使用して Collidable クラスから「継承」するゲームの Player クラスの Javascript オブジェクトを作成しました。

Player.prototype = new Collidable(50, 50, 70);

この Collidable クラスには、次のようなコードでインスタンス化される Vector クラスのインスタンスがあります。

this.pos = new Vector(x, y) || new Vector(50, 50);

私の問題は、新しい Collidable オブジェクトを問題なく作成できることです。内部のベクトルには、new Collidable(x, y, diameter)パーツの最初の 2 つの引数で指定された x と y の値が含まれます。ただし、新しいプレーヤーが作成されると ( current = new Player();)、ベクトルの x と y の値は NaN になります。

以下に、Collidable コンストラクターと Player コンストラクターのコードを含めました。

衝突可能:

Collidable = function Collidable(x, y, d){
    this.pos = new Vector(x, y) || new Vector(50, 50); // Position of centre
    this.diam = d || 50; // Diameter
    this.col = new Color().randomRGB(); // For debug
}
// More functions below

プレーヤー:

Player = function Player(){
    this.health = 100;
    this.facing = 0;
    this.sprites = new Image();
    this.sprites.src = "./npc-oldman1.png";
    this.spriteNo = 0;
    this.moveSpeed = 2;
}

Player.prototype = new Collidable(50, 50, 70);
// More functions below

これはこの質問に関連していると思われますが、何が問題なのかを突き止めることができませんでした。

私の完全なコードはこちらで入手できます。すべきことは、マウスがクリックした場所に移動する老人の画像を表示することです ((50, 50) (プレーヤーが作成された場所) で最初に点滅するか、手動で pos 値を変更したときに点滅します)。 . Collisions クラスを追加する前に、コードを動作させました。

前もって感謝します。

4

3 に答える 3

2

この問題は、ネストされたオブジェクトの継承の問題と、コンストラクターの継承からキーワード/共有プロパティを使用する[しない]理由newが混在しているようです。解決策は次のとおりです。

function Player(){
    Collidable.call(this, 50, 50, 70); // give *this* instance an *own* Vector
    this.health = 100;
    this.facing = 0;
    this.sprites = new Image();
    this.sprites.src = "./npc-oldman1.png";
    this.spriteNo = 0;
    this.moveSpeed = 2;
}

Player.prototype = Object.create(Collidable.prototype); // without creating instance
于 2013-02-16T18:56:56.810 に答える
1

あなたのvector.jsコードはこのチェックを行います:

if (typeof x === 'NaN' || typeof y === 'NaN')

ただし、typeof NaN == 'number'. あなたがしたいisNaN(x)、またはもっと不可解に、x != x


それを修正すると、問題が他の場所にあることが明らかになります。この行:

var diff = new Vector(this.getCentre.x - x, this.getCentre.y - y);

次のいずれかである必要があります。

var diff = new Vector(this.getCentre().x - x, this.getCentre().y - y);
var diff = this.getCentre().diff(new Vector(x, y))

欠落した括弧のセットがかなりあります。

于 2013-02-16T20:33:45.533 に答える
0

おそらく、あなたのコードにはあなたが示したものとは異なる問題があります。おそらくそれは故障していますか?私は再現できませんでしたNaN、これが私が使用したものです:

html

<div>Vector</div>
<div><span>X: </span><span id="x"></span><div>
<div><span>Y: </span><span id="y"></span></div>

js

var Vector = function(x,y){
 this.x = x;
 this.y = y;
}
var Collidable = function Collidable(x, y, d){
    this.pos = new Vector(x, y) || new Vector(50, 50);
}
var Player = function Player(){
    this.health = 100;
}
Player.prototype = new Collidable(50, 50, 70);

var current = new Player();

console.log(current);
console.log(current.pos);

document.getElementById("x").innerHTML = current.pos.x;
document.getElementById("y").innerHTML = current.pos.y;

デモ: http: //jsfiddle.net/MuRNx/

于 2013-02-16T18:48:09.843 に答える