【问题标题】:Problem with instance names inside ButtonButton 中的实例名称存在问题
【发布时间】:2011-11-09 01:50:49
【问题描述】:

我在 Flash 中创建了一个按钮,其中有一个 TextField 和一个 MovieClip,两者都设置了实例名称。它们覆盖了按钮的所有 4 帧,没有关键帧。

我发现我无法使用我设置的实例名称访问对象,所以我使用这段代码来查看发生了什么:

var obj:DisplayObject = this.m_graphics.btnChange.upState;
for ( var i:int = 0; i < obj.numChildren; i++ )
{
    trace( "We have an object at " + i + " - " + obj.getChildAt( i ) + ": " + obj.getChildAt( i ).name );
    var t:TextField = obj.getChildAt( i ) as TextField;
    if ( t == null )
        continue;

    trace( "  The textfield has text '" + t.text + "' );
}

我得到这个作为输出:

We have an object at 0 - [object Shape]: instance195
We have an object at 1 - [object TextField]: instance199
  The textfield has text 'Change'
We have an object at 2 - [object MovieClip]: instance203

所以它们 TextField 和 MovieClip 就在那里,它们只是将它们的实例名称重置为通用的“instance###”。

有人知道问题出在哪里吗?如果我将按钮设为 MovieClip,它就可以正常工作(尽管我必须自己控制帧)。

我知道我可以使用不同的方法来解决这个问题,但这意味着要改变很多东西,我想知道为什么 SimpleButton 会忽略 Flash 中设置的实例名称

编辑

进一步研究,似乎即使 Flash IDE 中的按钮中没有关键帧,Flash 也会为每个项目创建 4 个实例(例如,通过 upState 跟踪会给我一个 TextField 和实例名称为“instance2”,而在downState 中,实例名称为“instance4”)。如果我在一种状态下更改文本,它不会反映在其他状态中。

我在想,当 Flash 创建对象时,它并没有正确复制所有属性(即实例名称)

编辑

我同意 Shane 的回答是一种解决方法 - 我自己说过,我知道解决问题的不同方法 - 但它忽略了问题,它没有解决它(这是我的唯一原因没有接受)。我首先来到 SO 看看是否有人可能首先知道它为什么会发生(tbh,这似乎是 SDK 中的一个错误)。

我也理解“您不应该在 SimpleButton 中访问子项;如果您想要更多控制,请使用 Sprite 或 MovieClip”这一论点背后的原因,但我不同意。 Flash IDE 允许您在其中创建带有命名实例的按钮,而 SimpleButton 文档使您可以访问不同的状态,因此对我来说,这是可以接受的行为。如果 SimpleButton 只能用于非常基本的、不可更改的静态按钮(也可以考虑本地化),那么它就毫无用处了。你可以使用 Sprite 和 MovieClip,但是你必须自己控制不同的状态,这很尴尬。我有自己的 Button 类来处理样板,但我不应该重写基本的 SDK 功能,这就是为什么对我来说这是一个错误。

我会一直开放赏金,直到它在那里。如果我什么也得不到,那我就给谢恩。

【问题讨论】:

  • shanethehat 是绝对正确的,您无法访问 Button 内的对象。
  • @Hardik 你可以访问按钮内的对象,我在上面的代码中做到了。如果是我不应该,那就另当别论了
  • 好的,如果你想对按钮的状态做一些动画效果,试着在按钮内创建MovieClip。在 UP OVER DOWN 上单独的 MovieClip。
  • 我仍然有同样的问题(在这种情况下访问 MovieClip) - 它没有尝试动画或任何东西 - 这就是为什么当我从 Flash IDE 导出 SimpleButton 时,它会清除实例我设置的名称

标签: flash actionscript-3 textfield


【解决方案1】:

这是因为 flash.display.SimpleButton 类没有继承自 DisplayObjectContainer,并且状态容器也不是 DisplayObjectContainers:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/SimpleButton.html

基本上,简单的按钮按其定义是简单的。如果您想对内部对象进行更复杂的控制,则必须使用将 buttonMode 设置为 true 的 Sprite 或 MovieClip。

【讨论】:

  • SimpleButtons 本身不是 DisplayObjectsDisplayObjectContainers,但它们的 up、over、down 和 hit 状态是,这就是你首先在其中搜索对象的方式
  • SimpleButton 一个显示对象。它的继承是 SimpleButton -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object。
  • 抱歉,我要澄清的是,我正在搜索 SimpleButton 状态(upState、downState 等)内的对象。它们存在,只是没有设置实例名称
  • Shane 是对的,如果您想搜索按钮内的对象,请使用 Sprites 而不是 SimpleButtons。这就像试图从 Shape 实例(不是 InteractiveObject)中获取鼠标事件,你可以破解它,但你应该使用 Sprite 来代替。
  • 我不反对 Shane 的回答 - 感谢您的帮助 - 我已经更新了我的问题以解释为什么我还没有接受它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2013-01-03
  • 1970-01-01
相关资源
最近更新 更多