1

GameWorld.as,第 96 行 1180:调用可能未定义的方法初始化。

我正在向实现 IController 的 GameWorld 添加一个控制器:

addController(new BackgroundController(this));

public function addController(controller:IController):void
{
    controller.initialize();
    controllers.push(controller);
}

public interface IController 
{
    function initialize():void;         //setup the controller
    function getType():String;          //define the controller by a type string
    function update():void;             //perform update actions
    function destroy():void;            //cleanup the controller
}

initialize 是来自 IController 的方法,但现在突然未定义

我没有收到任何语法错误,而且似乎无法将我的代码恢复到工作状态。

这可能是什么原因造成的?

这是背景控制器:

package controller 
{
    import Entity;
    import flash.display.Bitmap;
    import flash.display.Sprite;

    public class BackgroundController implements IController
    {
        private var world:GameWorld;
        private var images:Vector.<Bitmap>;
        private var bgImage:Sprite;

        public function BackgroundController(world:GameWorld)
        {
            this.world = world;
        }

        public function initialize():void
        {
            bgImage = new Sprite();
            images = new Vector.<Bitmap>();

            var ypos:int = 0;

            for (var i:int = 0; i < 3; i++ )
            {
                var tempBmp:Bitmap = new Bitmap(new grasstile(0, 0));
                images.push(tempBmp);
                bgImage.addChild(tempBmp);
                tempBmp.y = ypos;
                ypos += 500;
            }

            GameWorld.lowerLayer.addChild(bgImage);
        }
        public function update():void 
        {
            //update the background tiles
            for (var i:int = 0; i < 3; i++ )
            {
                images[i].y -= world.gameSpeed;
                if (images[i].y < -500 )
                {
                    images[i].y += 1500;
                }
            }
        }

        public function getType():String
        {
            return "Background";
        }

        public function destroy():void 
        {

        }

    }

}
4

3 回答 3

1

一些全局检查

  • 您是否使用运行时共享资产、多个文件?确保你已经构建了它们。
  • 确保没有其他运行时/构建错误
  • 在 FDT(您使用哪个编辑器?)中,有一个名为“重置 MXML 编译器并强制完整构建”的功能。这会清除缓存并强制执行全新的构建而不是增量构建。
  • 在 Flashdevelop 中,您必须使用工具 > flash 工具 > 重建类路径
  • 在 Flash IDE 中,您可以清除 ASO 文件(CS5-)/清除发布缓存(CS6)。
  • 重新启动/杀死编辑器+相关进程以确保没有奇怪的缓存冲突并且所有语法检查都是最新的。

代码检查

// make sure it has implemented the IController
trace("controller is IController: "  + (controller is IController) );

和..

// detect what kind of class it really is. Goto that class, check the interface.
trace("controller is : "  + getQualifiedClassName(controller) );

还要确保没有其他IController接口,或检查所有导入语句,以确保在任何地方都使用了正确的接口。

于 2012-10-31T08:21:21.253 回答
1

发现自己处于同样的境地。

发现问题是由于包和定义的变量之间的名称冲突问题。

所以,在你的情况下,只是改变

public function addController(controller:IController):void
{
    controller.initialize();
    controllers.push(controller);
}

public function addController(controllerImpl:IController):void
{
    controllerImpl.initialize();
    controllers.push(controllerImpl);
}

应该已经解决了。

于 2013-10-13T03:26:23.593 回答
0

接口只是为类定义规则,在这种情况下,说明任何实现的类IController都必须包含这四个方法的定义。您实际上在控制器类中定义了一个初始化方法吗?

于 2012-10-31T08:00:29.893 回答