如何将初始化对象的引用从一个类传递到另一个类,以将(addChild)添加到显示列表?

时间:2012-05-28 17:21:17

标签: actionscript-3 flash air addchild displaylist

我创建了这个简单的例子 因为我正在使用一个更复杂的类,一个菜单项,我想初始化Main类中的所有设置,然后在需要时将这些设置添加到Game类中(并更新它)(两个类是分开的)

Class:Main(文档类,(理想情况下)所有内容都已初始化/创建)

    public class Main extends MovieClip
    {
            //testing passing on reference to Game
        private var testBitmap:Bitmap;
        private var testBitmapData:BitmapData;
        private var testArray:Array;

            public function Main():void
            {
                testBitmapData = new BitmapData(256, 256, false, 0xCCDDEE);         
                testBitmap = new Bitmap(testBitmapData);            
                testArray = [];
                testArray.push(testBitmap);    //Array for reference

                game = new Game(540, 960, testArray); 
                    //create Game class, pass reference to Object
                game.x = 0;
                game.y = 0;
            }
     }

类:游戏(由文档类创建,(理想情况下)一切都在运行)

    public class Game extends MovieClip
    {

            private var testingArray:Array

            public function Game(gameWidth:int, gameHeight:int, testArray:Array):void
            {
                    this.testingArray = testArray;  //assign to local Array and access
                    addChild(testingArray[0]);  
             //addChild to Game from an item intialised in Main, doesn't work >___<
            }
    }

事情是,在我原来的Game类中;它接收一个初始的缓存BitmapData和一个列表数组,告诉它需要循环的BitmapData 在这里减少(并且仅用于更新作品的参考(如果我已经在Main中添加了Child):

    public function Game(gameWidth:int, gameHeight:int, cachedBitmapClipArray:Array)
    {

            this.cachedBitmapClipArray = cachedBitmapClipArray;


            private function update():void
            {           
                for each (tempCachedBitmapClip in cachedBitmapClipArray)  
                {
                    tempCachedBitmapClip.updateCurrentTile();   
          //but updating through the reference to an item initialised in Main works !!
                }
            }

    }

如何使引用和传入对象(或有权访问)在原始实例中表现如何? (能够添加孩子)

即。 can对象可以跨越'scopes'(??),还是只能在初始化的类中控制(实例化)对象

1 个答案:

答案 0 :(得分:1)

回答最后一个问题,是的对象可以从一个对象传递到另一个对象。我很难理解问题到底是什么。在通用编程术语中,Object或任何其他复杂类型通过引用传递,原始类型也通过引用传递,但AVM的内部处理它们以便将它们视为按值传递。有关如何通过函数/方法调用传递参数的非常清楚(至少在我看来)解释,请在此处阅读: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f56.html

查看左侧树导航中的其他区域,了解有关语言本身的更多详细信息。

有一点需要注意,虽然我认为编译器会解决这个错误,在你发布的第一个代码中游戏的返回值为:void对于构造函数,应该没有声明的返回类型,因为它应该被隐式输入无论班级是什么。

在我自己的话中添加一些关于按引用传递或按值传递的解释。按值传递意味着对象的值(即存储在变量指向的位置的字节)实际上被复制到新的内存位置,然后使用该位置。这在实践中意味着它们不是相同的内存字节,而是它们是两个独立的内存位置,每个位置都存储有相同的值,在传递后修改一个值不会影响原始值。通过引用传递就是说你传递了内存位置,因此没有为该值分配新的内存,这两个值实际上指向相同的内存位置(指向它们的指针本身可能不同,但指针都指向同一个位置)记忆)。在这种情况下,对象是相同的。

您正在做的事情是可取的,将分工和在类中封装特定类型的功能确实使代码更容易使用。我认为唯一的问题是如果游戏对象本身从未作为孩子添加到显示树中的某些东西(附加到舞台上的东西)。看起来你正在创建一个新游戏并设置它的位置,但从不将它作为一个孩子添加到舞台上,然后向游戏中添加任何内容都不是显示树的一部分。