在基本actionscript程序中更新对象属性有困难

时间:2009-10-20 16:21:18

标签: flex actionscript-3 events

我仍在努力完成一些非常基本的ActionScript编程(在Flex中),而且我对事件和对象属性有点了解。

下面有3个文件,一个应用程序和两个组件。基本目标非常简单 - 从两个位置画布和一个玩家画布开始。单击一个位置画布时,播放器会将其x和y坐标更新为该画布。单击其他画布,然后将玩家的x和y坐标更新为该画布。重复。

我认为我很接近,但我无法弄清楚如何在location1或location2中点击以将他们各自的x和y坐标发送回playerX和playerY值。关于这个具体问题的任何建议,或者更容易实现这一目标的更广泛的建议,都会很棒。

这是我的主要应用程序文件:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    xmlns:ns1="components.*">

    <mx:Script>
        <![CDATA[
            [Bindable]
            private var playerX:int = 20;
            [Bindable]
            private var playerY:int = 20;

            private function clickEventHandler(evt:Event):void
            {
                playerX = evt.x;
                playerY = evt.y;
            }
        ]]>
    </mx:Script>

    <ns1:location x="139" y="168" id="location1"
        playerMove="clickEventHandler(event)"/>
    <ns1:location x="629" y="168" id="location2"
        playerMove="clickEventHandler(event)"/>
    <ns1:player x="{playerX}" y="{playerY}"/>

</mx:Application>

这是我的“位置”组件:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
    width="200" height="200"
    click="clickHandler()">
    <mx:Script>
        <![CDATA[           
            import flash.events.Events

            private function clickHandler():void
            {
                var moveClick:Event = new Event("playerMove");
                moveClick.x = target.x;
                moveClick.y = target.y;
                dispatchEvent(moveClick);
            }
        ]]>
    </mx:Script>

    <mx:Metadata>
        [Event(name="playerMove")]
    </mx:Metadata>

</mx:Canvas>

这是我的播放器组件:

<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
    width="50" height="100">    
</mx:Canvas>

更新:

我已经能够使用以下代码模拟所需的效果:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

    <mx:Script>
        <![CDATA[
            [Bindable]
            private var playerX:int = 20;
            [Bindable]
            private var playerY:int = 20;
        ]]>
    </mx:Script>

    <mx:Canvas x="139" y="168" id="location1" width="200" height="200"
        click="playerX = location1.x, playerY = location1.y" backgroundColor="#F60D0D"/>
    <mx:Canvas x="629" y="168" id="location2" width="200" height="200"
        click="playerX = location2.x, playerY = location2.y" backgroundColor="#EDE513"/>
    <mx:Canvas id="player1" x="{playerX}" y="{playerY}"
        width="100" height="100" backgroundColor="#3458F5"/>

</mx:Application>

现在我正在进行模块化以实现我真正的最终目标,这确保了解事件,对象和事件对象的工作原理。

2 个答案:

答案 0 :(得分:0)

你没有冒泡这个事件,所以父文件(应用程序)没有“听到”它。

尝试更改此内容:

var moveClick:Event = new Event("playerMove");

到此:

var moveClick:Event = new Event("playerMove", true);

添加的true将事件的bubbles属性设置为true。

答案 1 :(得分:0)

您应该定义一个名为PlayerMove的自定义事件类,其中包含x和y属性。正如埃里克所说,将bubbles属性设置为true。

public class PlayerMove extends Event {

      public static const PLAYER_MOVE : String = "playerMove";
      public var x : int;
      public var y : int;

      public function PlayerMove(x:int, y:int; type:String, bubbles:Boolean=true, cancelable:Boolean=false) {
             super(type, bubbles, cancelable);
             this.x = x;
             this.y = y;
      }
}

另外,在你的播放器画布上你有mx:Canvas xmlns:mx =“http://www.adobe.com/2006/mxml”     width =“200”height =“200”      click =“clickHandler()”您必须将事件关键字添加到 click =“clickHandler(event)”等功能中,并且与您的相同功能

private function clickHandler(event : MouseEvent) : void {
   dispatchEvent(new PlayerMove(event.target.x, event.target.y, PlayerMove.PLAYER_MOVE));
}

这应该有效