使用Google Closure Compiler导出pixi.js项目时的常见问题指南

想象一下,您的游戏项目的新功能已按预期完成,测试和工作,彩虹和卡哇伊独角兽泛滥成您的想象力,面颊上浮现出微笑。 但是……等等,突然间,您意识到您只是测试了开发版本,而您还没有测试过生产版本,因此Google Closure Compiler使其所有的魔法精简,混淆代码并使某些事情在开发版本上完美运行。 再见,独角兽🙁

考虑到创建项目的生产版本并不是您每天要做的事情,这意味着您会忘记大多数错误,加上对所有代码进行混淆后,对每个“ this.ck ”更改“ this.myDescriptiveVariableName ”可以将当出现神秘错误时,检查是否一切正常的任务。

这篇文章是有关使用Google Closure Compiler及其解决方案导出pixi.js项目时遇到的基本问题的指南。

封尾:权威指南:增强JavaScript功能的Google工具

如果您准备使用Closure用JavaScript构建富Web应用程序,那么该动手指南将为您提供……

www.amazon.com

如果添加了新库,可能会收到类似以下错误:

示例: 错误-未声明变量MSDFText
消息=新的MSDFText.MSDFText(textString,textOptions);

解:

  • 创建一个extern文件(在本示例中为msdftext-externs.js文件),并将其添加到项目中Google Closure Compiler的externs文件夹中。 在此示例中,这将是添加到文件中的代码:
  var MSDFText = { 
“ MSDFText”:function(){}
}
  • 确保将路径添加到为其他对象为Google Closure Compiler定义的对象创建的新externs文件。
  • 在一个完美的世界中,正常的情况是库包含自己的externs文件,这些文件已更新并可以使用,但并非总是如此。 另一方面,有一些externs生成器,您可以在其中提供库并获取生成的externs文件,有些工作可以,有些则不能。
  • pixi.js的新功能(例如NineSlicePlane),一些滤镜(例如colorMatrix)以及添加了动画粒子支持时也出现了此错误 适用的解决方案相同,添加到pixi-externs.js文件中:
  // NineSlicePlane示例,将其添加到“ mesh”对象 
“ NineSlicePlane”:函数(){} // ColorMatrix pixi过滤器示例,将此添加到“ filters”对象
“ ColorMatrixFilter”:{
“ contrast”:函数(){},
“亮度”:function(){},
“ hue”:函数(){},
“ saturate”:函数(){},
“去饱和”:function(){}
},//动画粒子示例
//未捕获的TypeError:无法读取未定义的属性'hasLoaded'//(value.baseTexture.hasLoaded)
//在“粒子”“粒子”中添加“ particleConstructor”和“ AnimatedParticle”:{
“发射器”:{
“比例”:{
“ minimumScaleMultiplier”:{}
},
“速度”:{
“ minimumScaleMultiplier”:{}
},
“ spawnRect”:{
“X”: { },
“ y”:{},
“ w”:{},
“H”: { }
},
“经过”:{},
“ particleConstructor”:function(){}
},
“ AnimatedParticle”:function(){}
}

尝试从库访问特定属性时:

来自MSDFText的示例未捕获的TypeError:无法读取未定义的属性’fontSize’

  textObject.fontData.fontSize = 25; 

解决方案A:

  • 将所有textObject.fontData替换为textObject [‘fontData’]
  textObject ['fontData']。fontSize = 25; 

解决方案B(推荐):

  • 在库externs文件中,添加属性:
  var MSDFText = { 
“ MSDFText”:function(){},
“ numberFont”:{},
“ fontData”:{}
};

了解Pixi.js

创建和显示交互式图形,构建场景和动画过渡,制作跨平台的响应式游戏……

www.amazon.com

我遇到的问题是使用TweenLite.to制作的动画没有达到预期的效果。

解:

  • 这是由于easy参数名称(或其他诸如alpha或其他名称)不在引号之间或未在某些TweenLite相关的externs.js文件中定义的。 您可以按照上述情况中的说明解决它,但是要小心,如果您使用的是项目代码中定义的模型或视图中的对象属性,则不要使用引号。
  TweenLite.to(myObjectToAnimate,seconds,{'y':posY,'ease':'Elastic.easeOut'}); 

如果我们从服务器读取JSON格式传递给游戏的数据,则点号会使Google Closure Compiler崩溃。 相反,我们需要使用方括号表示法,以便将该属性读取为字符串(Google Closure Compiler不会混淆字符串)

示例:未捕获的TypeError:无法读取未定义的属性’gameEnded’

this.bc.ll = s [o.ut] .gameEnded

解:

  • 对于此示例,该不可读文本实际上是: this.gameModel.gameEnded = data [GameData.STATE] .gameEnded ,用于保存从服务器数据获取的gameEnded属性。
  this.gameModel.gameEnded = data [GameData.STATE] ['gameEnded'] ; 

没有错误,就我而言,问题来自一个函数,该函数的目的是定义文本字符串并在屏幕上打印。 文字并未印在游戏上。

该问题与Google Closure Compiler与完全不兼容setter函数的功能有关,而setter函数所做的不仅仅是将变量设置为一个值,实际上,由于Closure Compiler认为未使用该函数,该相关函数已从代码中删除 :生成的最终代码中,没有函数的踪迹,也没有对该函数的调用。

并非所有的设置员都会发生此问题,因此我无法得知发生这种情况的特殊原因。

  // setter的定义 
设置myText(value)
{
值= value.toString();
如果(!this._myText)
{
this._myText =
this.createPixiText(
值,
this._myTextLayout,
);
}
其他
{
this._myText =值;
}
}
//调用设置器
this.myText =“你好,世界!”;

与Google Closure编译器兼容的此代码需要重构为此:

  //函数定义 
setMyText(值)
{
值= value.toString();
如果(!this._myText)
{
this._myText =
this.createPixiText(
值,
this._myTextLayout,
);
}
其他
{
this._myText =值;
}
} //调用functionthis.setMyText(“ hello world!”);

我希望本指南可以节省一些时间和头痛,并让卡哇伊独角兽再次自由飞翔🦄

带有HTML5和JavaScript的高级游戏设计

您如何制作视频游戏? 带有HTML5和JavaScript的高级游戏设计是如何实践…的扎实教育。

www.amazon.com