【问题标题】:Remove sprite from stage in as3从 as3 的舞台上移除精灵
【发布时间】:2013-08-20 21:37:57
【问题描述】:

我有此代码,用于在玩家完成拖放时在舞台上显示一条消息。我希望在为下一帧单击按钮时删除此精灵。有人可以帮我写代码吗?

 stage.addEventListener(Event.ENTER_FRAME, EntFrame);
 function EntFrame (e:Event):void 
  {
     if (CntP1+CntP2+CntP3+CntP4+CntP5+CntP6+CntP7+CntP8 == 40)
{
    var w:int = 400, h:int = 200;
    var win:Sprite = new Sprite();
    win.name = "Mywin";
    addChild(win);


 // draw rounded rect with subtle vertical linear gradient fill and blue stroke
    win.graphics.lineStyle(4,0x0077ff);
    var mat:Matrix = new Matrix();
    mat.createGradientBox(w, h, 90 * (Math.PI / 180));
    win.graphics.beginGradientFill(GradientType.LINEAR,[0xffffff,0xeeeeee],[1.00,1.00],[0,255],mat);
    win.graphics.drawRoundRect(0,0,w,h,15,15);

    // show center "YOU WIN!" text
    var tf:TextField = new TextField();
    tf.autoSize = TextFieldAutoSize.LEFT;
    tf.antiAliasType = AntiAliasType.ADVANCED;
    tf.defaultTextFormat = new TextFormat("Arial, Verdana",36,0x454545,true);
    tf.text = "Κέρδισες!";
    tf.selectable = false;
    win.addChild(tf);
    tf.x = w/2 - tf.width/2;
    tf.y = h/2 - tf.height/2;

    // add a drop shadow
    var dropShadow:DropShadowFilter = new DropShadowFilter(3,45,0,.35,8,8,1,3);
    win.filters = [dropShadow];

    // center the graphic
    win.x = stage.stageWidth/2 - win.width/2;
    win.y = stage.stageHeight/2 - win.height/2;


}

}

【问题讨论】:

  • 您可能要删除一大堆它们,因为您要在每一帧上添加一个新的。问题是您没有保留对它们中的任何一个的引用,因此很难抓住它们来调用 removeChild()。老实说,整个函数都需要重写,但您的问题中没有足够的信息来提供建议,以便就重写它以满足总体目标的最佳方式提出建议。
  • 我在舞台上有 8 个电影剪辑。播放器单击它们,它们变得不可见,并且在不同位置的 8 个新电影剪辑变得可见。就是这样。当这个过程完成时,我希望文本消息出现,当玩家在不同的帧中移动到下一个游戏时,我希望这条消息消失。我是 Flash 新手,我是自学成才,遇到了很多困难。任何帮助表示赞赏。

标签: actionscript-3


【解决方案1】:

您的代码写得不好,需要重写以确保项目的重用或可扩展性,但这里有一个快速的出路。

制作一个持有人Sprite,类似

var messageHolder:Sprite = new Sprite();
addChild(messageHolder);

以您喜欢的任何方式将所有消息添加到该持有人。当您需要擦除该持有者的内容时,请调用以下方法:

function clearHolderContents(holder:DisplayObjectContainer):void
{
   if (holder.numChildren < 1)
   return; // no need to continue this method if the target is empty

   for (var i:int = holder.numChildren - 1; i >= 0; i--)
      removeChild(holder.getChildAt(i));
}

此方法可以清除任何 DisplayObjectContainer 的内容 => 将其用于您的 messageHolder:

clearHolderContents(messageHolder);

希望有帮助!

【讨论】:

  • 很抱歉,但我需要更多信息来理解您的意思。我应该在哪里写这段代码?如果之后?
  • 在开始的某处添加一个持有者精灵 - 在您创建消息之前。然后将消息内容添加到持有者(例如,而不是 addChild() 使用 messageHolder.addChild() )。将函数 clearHolderContents() 复制粘贴在一开始的某处,然后在任何你想要的任何持有者(例如 messageHolder)中调用它。
  • 我想我按照你说的做了,但现在我有这个错误:场景 1,图层“动作”,第 1 帧,第 165 行 1136:参数数量不正确。预期 1. 我会发布我的代码来告诉我哪里错了。谢谢你帮助我。
  • 错误表明您调用了一些参数数量不正确的方法。这是一些需要 1 个参数的函数。我只能猜测它要么是 clearContentHolder(HolderName) 要么是 addChild(ChildName)。
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多