0

次のコード行があります

frame = self.spriteData['backgroundps.png'];
self.bgBoard  = new gg.casino.game.sprite(self.spriteSheet, frame, 0, 0, frame.w, frame.h);
console.log(frame);
console.log(self.bgBoard.x + ' ' + self.bgBoard.y + ' ' + self.bgBoard.w + ' ' + self.bgBoard.h);

gg.casino.game.spriteは次のように定義されています

gg.casino.game.sprite = function(sheet, frame, x, y, twidth, theight) {
    this.sheetRef                               =   sheet;
    this.frame                                  =   frame;
    this.x                                      =   x;  
    this.y                                      =   y;  
    this.w                                      =   twidth;
    this.h                                      =   theight;
    console.log(this.x + ' ' + this.y + ' ' + this.w + ' ' + this.h);
}

simpleoptimizationでコンパイルすると、すべてがうまく機能し、次のログが得られます。

0 0 800 480
(frame object)
0 0 800 480

しかし、高度な最適化でコンパイルすると、ログに表示されます

0 0 undefined undefined 
(frame object) - with correct values
0 0 undefined undefined 

このコードで何がうまくいかなかったのでしょうか?

編集:

後にログを追加しましたframe = self.spriteData['backgroundps.png'];

console.log('ps ' + frame.w + '   ' + frame.h);

そして、wとhを未定義として出力します!!!!!!

ps undefined undefined

次の行のようconsole.log(frame)に、オブジェクトを正しい値で出力します

編集2:

self.spriteDataの詳細:texturepackerからエクスポートされたjsonファイルがあります。オブジェクトの配列があり、各オブジェクトは次のように表されます。

{
"filename": "backgroundps.png",
"frame": {"x":105,"y":304,"w":800,"h":480},
"rotated": false,
"trimmed": false,
"spriteSourceSize": {"x":0,"y":0,"w":800,"h":480},
"sourceSize": {"w":800,"h":480}
}

self.spriteDataそのjson配列をループして、次のように値を割り当てます。

    var respData                            =   xhr.getResponseJson();
    self.spriteData                         =   {};
    for(var i = 0, len = respData.frames.length; i < len; i++) {
        self.spriteData[respData.frames[i].filename] = respData.frames[i].frame;
    }

したがってframe、コンソールに出力される次の構造になります。

Object
  h: 480
  w: 800
  x: 105
  y: 304

frameしたがって、高度なコンパイルでは、をとして印刷しても問題はありませんconsole.log(frame)。しかし、そのメンバーconsole.log(frame.h)にアクセスしようとすると、として出力されundefinedます。名前が変更されないことを期待して、に@exposeコメントを追加しようとしましたが、役に立ちvar frame = {};ませんでした。

編集:frame割り当てをframe.x =self.spriteData['backgroundps.png']。x;として 変更しました。frame.y =self.spriteData['backgroundps.png']。y; frame.w =self.spriteData['backgroundps.png']。w; frame.h =self.spriteData['backgroundps.png']。h;

宣言frame.wframe.h、コメント `@type {number}を付けます(xとyはすでに正常に機能していたため、実行しませんでした)。

今console.log(frame)が表示されます

Object
  a: undefined
  b: undefined
  x: 105
  y: 304

しかし、なぜ?

編集(解決済み):D:-)私は明示的にframeのメンバーを次のように宣言しました

/**
 * @type {number}
 * @expose
 */
frame.w                                     =   0;

/**
 * @type {number}
 * @expose
 */
frame.h                                     =   0;

/**
 * @type {number}
 * @expose
 */
frame.x                                     =   0;

/**
 * @type {number}
 * @expose
 */
frame.y                                     =   0;

そして今それは動作します:-)

助けてくれたKayhr、Ross、Chadに感謝します。しかし今、私は誰の答えが正しいものをマークするべきか疑問に思いますか?

4

2 に答える 2

1

self.spriteData ['backgroundps.png']の定義は何ですか?

self.spriteData['backgroundps.png']の「w」キーと「h」キーが文字列で定義されていることは間違いありません。その場合、コンパイラは文字列を変更せずにドット構文で記述されたプロパティの名前を最適化するため、ドット構文を使用してそのようなプロパティにアクセスすると、通常は問題が発生します。

例えば:

  foo['bar'] => a['bar']
  foo.bar    => a.b

...ここで、aとbは架空のコンパイラ出力トークンです。

参照:https ://developers.google.com/closure/compiler/docs/api-tutorial3#propnames

于 2012-07-06T11:55:27.357 に答える
1

再現できません。コードを実行するために、不足しているコードを単純なオブジェクトで偽造しました。出力は同じですが、SIMPLE最適化とADVANCED最適化のどちらを使用してもかまいません。私はあなたの問題があなたがここで言及しなかったコードにあると思います(多分このspriteDataのものの定義にあります)。完全な例と使用した正確なコンパイラオプションを教えてください。

これが私がコンパイルしているコードです、多分あなたはあなたのREALコードとの決定的な違いを見ることができます:

// Faked code (The stuff you didn't include in the question):

var gg, self;
gg = {};
gg.casino = {};
gg.casino.game = {};
self = { spriteData: { 'backgroundps.png': { w: 800, h: 480 } } };

// Your code (unchanged):

gg.casino.game.sprite = function(sheet, frame, x, y, twidth, theight) {
    this.sheetRef                               =   sheet;
    this.frame                                  =   frame;
    this.x                                      =   x;  
    this.y                                      =   y;  
    this.w                                      =   twidth;
    this.h                                      =   theight;
    console.log(this.x + ' ' + this.y + ' ' + this.w + ' ' + this.h);
}

frame = self.spriteData['backgroundps.png'];
self.bgBoard  = new gg.casino.game.sprite(self.spriteSheet, frame, 0, 0,  frame.w, frame.h);
console.log(frame);
console.log(self.bgBoard.x + ' ' + self.bgBoard.y + ' ' + self.bgBoard.w +  ' ' + self.bgBoard.h);
于 2012-07-06T12:06:28.057 に答える