【问题标题】:as3 - How to add a movieclip into the parent's parent?as3 - 如何将影片剪辑添加到父母的父母?
【发布时间】:2015-12-22 12:45:35
【问题描述】:

我在一个名为“player”的影片剪辑中有一个枪子,而“player”在另一个名为“level one”的影片剪辑中。

所以在 gun 类中,代码生成了一个子弹。必须在父母的父母中产生。这样子弹就可以射入关卡了。

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);
    }

【问题讨论】:

  • 你不能从你的Gun 对象中触发一个自定义事件,并在子弹需要产生的任何地方捕获它吗?
  • 我刚刚尝试了一些非常相似的方法,这似乎对我有用。 Bullet 对象被添加到 LevelOne 对象中。
  • @Crook 这应该可以工作(至少是可见的代码)。你的fire() 函数执行了吗?

标签: actionscript-3


【解决方案1】:

您错过了强输入变量并添加括号 尝试 var b:Bullet = new Bullet();

为什么不保留对 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);
}

【讨论】:

    【解决方案2】:

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

    您可以使用侦听器解决此问题(如 cmets 所述,这是传递游戏引用的示例。每个实例都接收对游戏的引用,因此每个实例都可以在游戏上调用公共函数:

    Game.as

    myPlayer = new Player(this);
    public function addBulletToWorld(){
    }
    

    Player.as

    public function Player(game){
        myGun = new Gun(game);
    }
    

    Gun.as

    public function Gun(game){
        game.addBulletToWorld();
    }
    

    【讨论】:

    • 这就是一种代码味道,不仅让子对象知道他们的父母,而且让一些子对象只知道父母,这样他们就可以将该信息传递给他们的自己的孩子。
    • 是的,尽管可以假设玩家也需要了解游戏。我在这里选择了我能想到的最简单的解决方案,没有向初学者介绍新概念。
    • 我不想在每个级别都写这个,因为我有多个级别。所以我更喜欢使用parent.parent。 parent.parent 有解决方案吗?
    • 你可以试试 parent.parent.spawnBullet();,然后在主类中放置函数 spawnBullet() { addChild(new Bullet());
    • 我认为事件监听器是避免在每个级别都写的最好方法。 @Kokodoko,我认为让初学者养成这样的习惯对他们没有任何好处,即使在 Flash 中,他们也会留下意大利面条式的代码和有限的职业前景。
    【解决方案3】:

    如果您绝对坚持使用 parent.parent 东西,只需在该行设置一个断点并查看 parent.parent 实际是什么,然后根据需要进行调整以匹配您的实际结构。但除了这只是一种不好的做法之外,它还会限制你在除了那个深度之外不能在任何地方使用这个类的地方。

    我建议您在想要发射子弹时只生成一个自定义事件,并让祖父母处理它。

    在枪里:

    功能火(e:MoudeEvent):无效{ dispatchEvent(new Event('fire!', true));//设置为真让它冒泡到父级 }

    在游戏中

    受保护的 var 子弹:矢量。 =新向量(); 公共功能游戏(){ addEventListener('fire!', fire); } //注意我使用 Flex 的时间太长而不能经常使用私有方法 受保护的功能火(e:事件){ var bullet:Bullet = new Bullet(); bullet.x = MoveClip(e.target).x); bullet.y = MoveClip(e.target).y); addChild(子弹); bullets.push(bullet);//我假设你要移动这个什么的,所以我们需要存储它来管理它 }

    【讨论】:

    • 我试过这个,但子弹仍然没有在游戏中显示。我更新了我的代码以向您展示我所做的。
    • 好像添加了子弹,但无法添加到枪所在的区域。我试过 b.x = player.gun.x(...) 但似乎游戏类无法将子弹产生到枪的位置,因为它在另一个电影剪辑内?有解决办法吗?
    • 处理这个问题的一种方法是让播放器监听枪上的鼠标事件,然后发出“开火!”听到它们时的事件。那么 x 和 y 将相对于玩家。我可以想出两三个其他方法来解决这个问题,但先尝试那个。我不想让你感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    相关资源
    最近更新 更多