我仍在努力完成一些非常基本的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>
现在我正在进行模块化以实现我真正的最终目标,这确保了解事件,对象和事件对象的工作原理。
答案 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));
}
这应该有效