0

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

类: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 >___<
            }
    }

.

.

.

问题是,在我原来的游戏课上;它接收缓存的 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 !!
                }
            }

    }

.

如何使引用和传入的对象(或有权访问)的行为与原始实例一样?(能够添加孩子)

即对象可以跨越“范围”(??)还是应该只在它们已初始化的类中控制(实例化)对象

4

1 回答 1

1

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

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

需要注意的一点是,尽管我认为编译器会解决此错误,但在您发布的第一段代码中,Game 的返回值为 :void 对于构造函数不应该声明返回类型,因为它应该被隐式类型化为类是。

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

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

于 2012-05-28T17:36:37.783 回答