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 打印为 undefined !!!!!!

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}
}

我遍历该 json 数组并将值分配给self.spriteData如下:

    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所以在高级编译中,如果我打印as没有问题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's 成员为

/**
 * @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 回答