我最近拿起了Emanuele Feronato的《Flash Game Development by Example》,试图帮助我扩展游戏设计和actionscript 3的知识,我被卡在第一章中,我们基本上是在创建一个记忆匹配两款游戏,你有十组贴图,你试着通过点击它们来匹配它们。
在我所坚持的代码中,Mr. Feronato使用for循环和addChild将tile添加到舞台上,下面是特别的代码:
// tile placing loop
for (i:uint=0; i<NUMBER_OF_TILES; i++) {
tile = new tile_movieclip();
addChild(tile);
tile.cardType=tiles[i];
tile.x=5+(tile.width+5)*(i%TILES_PER_ROW);
tile.y=5+(tile.height+5)*(Math.floor(i/TILES_PER_ROW));
tile.gotoAndStop(NUMBER_OF_TILES/2+1);
tile.buttonMode = true;
tile.addEventListener(MouseEvent.CLICK,onTileClicked);
}
// end of tile placing loop
在第5行中,您可以看到他为tile变量创建了一个名为"cardType"的自定义属性,但是当我尝试运行代码时,我得到了错误"通过静态类型tile的引用访问可能未定义的属性cardType"。我的类Tile扩展了MovieClip,主类扩展了Sprite,但据我所知,我编写的代码与书中完全相同,无法超越这一点。我想只是使用一个普通的int变量cardType来保存tiles[I],但后来你在鼠标事件上使用cardType属性,所以我有点卡住了。
是否在Flash中发生了一些变化,不再允许您以这种方式创建自定义属性?还是我做了什么蠢事,我没意识到。
一如既往,非常感谢您的帮助。
ActionScript支持动态类,可以在运行时添加属性。没有dynamic关键字,类是密封的,这意味着它的属性不能被改变。
MovieClip是一个动态类的例子。
从代码实例化一个MovieClip(或在Flash Professional中创建的MovieClip实例),添加这个属性将被支持:
var tile:MovieClip = new MovieClip();
tile.cardType = "custom value";
然而,从代码中,即使扩展MovieClip,也必须添加dynamic
关键字:
package {
import flash.display.MovieClip;
public dynamic class Tile extends MovieClip {
/* ... */
}
}
现在,你可以添加属性到你的Tile实例:
var tile:Tile = new Tile();
tile.cardType = "custom value";