为什么我无法通过ObjectContainer访问对象的方法

时间:2017-12-01 02:12:35

标签: actionscript-3 object random methods actionscript

首先,我不是母语为英语的人,但是,我仍然会尽力让自己理解并尽可能清楚。

所以,在我的编程课程中,我需要使用动画cc(flash)制作基于Tile的游戏(例如zelda,例如)。在地图上,我想制作一个可以根据音乐节奏改变音乐的舞池。这些瓷砖是两个框架,一个白色和一个红色的movieclip。

这是瓷砖的生成方式:

private function createGrid(): void {

        grid = new MovieClip();
        addChild(grid);
        for (var r: int = 0; r < nbRow; r++) {
            for (var c: int = 0; c < nbCol; c++) {
                var t: Tiles = new Tiles();
                t.x = t.width * c;
                t.y = t.height * r;
                grid.addChild(t);
            }
        }

        grid.x = 15; //center the grid on x
        grid.y = 35; //center the grid on y
}

这是Tiles Class:

package {
import flash.display.MovieClip;
import flash.events.*;

public class Tiles extends MovieClip {
    private var rand:int;

    public function Tiles() {
        // constructor code
        getTiles();
    }
    public function getTiles():void {
        random();
        setColor();
    }
    private function random() : void{
        rand = Math.floor(Math.random()*100)+1;
    }

    private function setColor() : void{
        if(rand<=30){
            gotoAndStop(8); //red frame
        }else{
            gotoAndStop(7); //white frame
        }
    }
}

}

createGrid()将地图放置在舞台上后立即放置切片并存储MovieClip 网格中的每个切片。现在,我希望瓷砖在流媒体音乐的节拍上随机变换红色和白色(并保持30%红色瓷砖和70%白色瓷砖的比例)

var s: Sound = new Sound();
var sc: SoundChannel;

s.load(new URLRequest("GameSong_mixdown.mp3"));
sc = s.play(0, 1000);

我知道我需要声音通道的leftpeek属性来实现这一点但是,现在,我使用触发此功能的按钮进行测试:

private function setTiles(e: Event): void {
        // loop through all child element of a movieclip
        for (var i: int = 0; i < grid.numChildren; i++) {
            grid.getChildAt(i).getTiles();          
        }
    }

现在,问题是:我无法访问我的Tiles方法。我在网格上执行了跟踪,getChildAt(i),并查看了我的所有瓷砖实例安慰。所以,我确信我的瓷砖的每个实例都存储在网格中。但是,我不知道为什么,grid.getChildAt(i) .getTiles();没有工作(以及Tiles的所有其他方法)。错误消息是:通过静态类型flash.display的引用调用可能未定义的方法getTiles:DisplayObject

有人知道我做错了吗?

  

ps:我将所有课程名称,var名称等翻译成法语   英语使代码更清晰。

1 个答案:

答案 0 :(得分:0)

您的错误是 getChildAt(...)方法的返回类型为 DisplayObject ,它既不是动态的(也不允许您访问随机属性),也不具备 DisplayObject.getTiles()方法。

您只需告诉程序该对象实际上是 Tiles 类:

private function setTiles(e:Event):void
{
    // loop through all child element of a movieclip
    for (var i: int = 0; i < grid.numChildren; i++)
    {
        // Cast display objects to Tiles class.
        var aTiles:Tiles = grid.getChildAt(i) as Tiles;

        // Call the method.
        aTiles.getTiles();          
    }
}