Actionscript 3 as3-如何将movieclip添加到父级&x27;谁的父母?

Actionscript 3 as3-如何将movieclip添加到父级&x27;谁的父母?,actionscript-3,Actionscript 3,我有一个枪孩子在一个叫做“玩家”的电影里,“玩家”在另一个叫做“一级”的电影里 因此在gun类中,代码生成一个bullet。必须在父对象的父对象中生成。这样子弹就可以射入水平面了 private function fire(m: MouseEvent) { //when bullet fired var b = new Bullet; MovieClip(MovieClip(parent).parent).addChild(b); } 但是,项目符号从未出现在父项的父项

我有一个枪孩子在一个叫做“玩家”的电影里,“玩家”在另一个叫做“一级”的电影里

因此在gun类中,代码生成一个bullet。必须在父对象的父对象中生成。这样子弹就可以射入水平面了

private function fire(m: MouseEvent)
{
    //when bullet fired
    var b = new Bullet;
    MovieClip(MovieClip(parent).parent).addChild(b);
}
但是,项目符号从未出现在父项的父项中。这里可能有什么问题

更新代码:

枪级:

function fire(e:MouseEvent):void 
{
    dispatchEvent(new Event('fire!', true));
}
在球员级别:

protected function fire(e: Event)
    {
        var b: Bullet = new Bullet();
        // bullet must be in same position and angle as player.gun
        b.rotation = player.gun.rotation;
        b.x = player.gun.x; + player.gun.width * Math.cos(player.gun.rotation / 180 * Math.PI);
        b.y = player.gun.y + player.gun.width * Math.sin(player.gun.rotation / 180 * Math.PI);
        addChild(b);
    }

您没有键入变量并添加括号 尝试 变量b:Bullet=newbullet()

为什么不保留对parent.parent的引用

var b:Bullet = new Bullet(parent)
...
public function Bullet(spawnTarget:MovieClip)
{
    _spawnTarget = spawnTarget;
}

private function fire(m: MouseEvent)
{
    //when bullet fired
    var b = new Bullet;
    _spawnTarget.addChild(b);
}

使用parent.parent是有风险的,因为您始终需要确保gun类在游戏类的子类中实例化。此外,你不能在层次结构中的任何其他位置创建枪,如果你的游戏越来越大,这可能会成为一个问题

您可以使用侦听器解决此问题(作为注释状态,这是传递游戏引用的示例。每个实例接收对游戏的引用,因此每个实例都可以调用游戏上的公共函数:

游戏。如

myPlayer = new Player(this);
public function addBulletToWorld(){
}
public function Player(game){
    myGun = new Gun(game);
}
public function Gun(game){
    game.addBulletToWorld();
}
玩家。作为

myPlayer = new Player(this);
public function addBulletToWorld(){
}
public function Player(game){
    myGun = new Gun(game);
}
public function Gun(game){
    game.addBulletToWorld();
}
枪。作为

myPlayer = new Player(this);
public function addBulletToWorld(){
}
public function Player(game){
    myGun = new Gun(game);
}
public function Gun(game){
    game.addBulletToWorld();
}

如果你绝对坚持使用parent.parent,只需在那一行设置一个断点,看看parent.parent实际上是什么,然后根据需要进行调整以匹配你的实际结构。但除了这只是一个糟糕的做法之外,这将限制你在除了这一深度之外的任何地方都不能使用这个类

我建议当你想发射子弹时,只生成一个自定义事件,让祖父母来处理

枪内:

function fire(e:MoudeEvent):void { dispatchEvent(new Event('fire!', true));//setting it true lets it bubble up to the parent } 功能火灾(e:MoudeEvent):无效{ dispatchEvent(新事件('fire!',true));//如果将其设置为true,则会向父级冒泡 } 在游戏中

protected var bullets:Vector. = new Vector(); public function Game() { addEventListener('fire!', fire); } //note I worked with Flex too long to use private methods very often protected function fire(e:Event) { var bullet:Bullet = new Bullet(); bullet.x = MoveClip(e.target).x); bullet.y = MoveClip(e.target).y); addChild(bullet); bullets.push(bullet);//I assume you're going to want to move this or something, so we need to store it to manage it } 受保护变量项目符号:向量。=新向量(); 公共功能游戏(){ addEventListener(“火灾!”,火灾); } //注意:我使用Flex的时间太长,不能经常使用私有方法 受保护功能火灾(e:事件){ 变量bullet:bullet=newbullet(); bullet.x=移动夹(e.target.x); bullet.y=MoveClip(e.target.y); addChild(子弹); bullets.push(bullet);//我想你会想移动这个或其他东西,所以我们需要存储它来管理它 }
难道你不能从你的
对象中触发一个自定义事件,并在子弹需要产生的任何地方捕获它吗?我刚刚尝试了一些非常类似的方法,这似乎对我有效。
Bullet
对象被添加到
LevelOne
对象中。@Crook应该可以工作(至少是可见的代码)。您的
fire()
函数是否已执行?这就是这样一种代码气味,它不仅让子对象知道他们的父对象,而且让一些子对象只知道他们的父对象,以便他们可以将该信息传递给自己的子对象。是的,尽管可以假设玩家也需要了解游戏。我在这里选择了我能想到的最简单的解决方案,没有向新手程序员介绍新的概念。我不想在每一个级别都写这个,因为我有多个级别。所以我更喜欢使用parent.parent。parent.parent有解决方案吗?你可以试试parent.parent.spawnBullet();,然后在主类中放置函数spawnbill(){addChild(new Bullet());我认为事件监听器是避免在每一个关卡都写这些内容的最好方法。@Kokodoko,我认为让初学者养成习惯,即使是在Flash中,也会留下意大利面代码和有限的职业前景,这对他们没有任何好处。我尝试了这个方法,但子弹仍然没有在游戏中出现。我更新了我的代码,让你看到w我做了。看起来子弹被添加了,但无法添加到枪所在的区域。我尝试了b.x=player.gun.x(…)但游戏类似乎无法将子弹发射到枪的位置,因为它在另一个电影剪辑中?有解决方法吗?一种处理方法是让玩家在枪上监听鼠标事件,然后发出“开火!”事件。然后x和y将与玩家相对。我可以想出两个或三个其他方法来解决这个问题,但先试试那个。我不想把你搞糊涂。