2007年9月28日 星期五

AS3 影格控制与时间轴预置对象的问题   [+/-]

Ticore's Blog

ActionScript 3.0 的时间轴预置对象 (Timeline-Placed DisplayObject) 有一个很怪异的问题
当用 AS3 控制 MovieClip 跳格之后,没有办法立即取得新影格上预先放置的对象
必须要等到下一个 Frame 才可以取得,很不方便

这个问题之前就有人发现了
现在做个纪录~~

Document Timeline 结构:

Document Class:Main.as

package {
 import flash.display.*;
 import flash.events.*;
 
 public class Main extends MovieClip {
  public function Main():void{
   trace("Main(); start");
   gotoAndStop(2);
   trace(mc, getChildAt(0)); // null null
   gotoAndStop(1);
   gotoAndStop(2);
   trace(mc, getChildAt(0)); // null null
   trace("Main(); end");
   
   this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
  public function onEnterFrame(evtObj:Event):void{
   trace("onEnterFrame();");
   trace(mc, getChildAt(0)); // [object MovieClip] [object MovieClip]
   this.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
 }
}

Output:

Main(); start
null null
null null
Main(); end
onEnterFrame();
[object MovieClip] [object MovieClip]

相关连结:
AS3 时间轴预置图像对象的特性

Read more...

2007年9月26日 星期三

Flex 2 List 利用键盘作非连续性多选   [+/-]

Ticore's Blog

想要在 List 作多重选择没有什么特别
但是要做到光靠键盘作非连续性的多重选择可就难了
不光是实作上难,操作起来也有些复杂
Flash 内建的 List 没有支持这功能
不过 Flex 2 ListBase 系列的 UIComponent 居然都有支持呢!

基本上,Flex 2 List 键盘非连续性的多重选择操作方式与 Windows 相同
要先按住 [Ctrl] + [Alt],然后利用箭头键浏览对象
用 [Space] 选择或是取消
以下以实际图片说明过程

首先运行 Flex List App

按下 [Tab] 键,Focus 到 List

按住 [Ctrl] + [Alt] 不放,进入选择模式

继续按住 [Ctrl] + [Alt] 不放,同时单击 [Space] 选定第一个项目

继续按住 [Ctrl] + [Alt] 不放,按三次 [Down],移动到第四个项目

继续按住 [Ctrl] + [Alt] 不放,同时单击 [Space] 选定第四个项目

放开 [Ctrl] + [Alt],这样就完成键盘非连续性的多重选择,选定第一、四个项目
之后便可以用 [Tab] 切换到其它 UIComponent 作其它动作

MXML Code:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="horizontal" backgroundColor="#FFFFFF"
 height="200" width="200">
 <mx:List width="100" height="100%"
  allowMultipleSelection="true" textAlign="center" rowHeight="18">
  <mx:dataProvider>
   [0, 1 ,2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
  </mx:dataProvider>
 </mx:List>
</mx:Application>
Read more...

Adobe 网站改版,改用 SWFObject   [+/-]

Ticore's Blog

最近发现 Adobe 网站大改版
也许画面上改变没那么大
不过内部 CSS、JavaScript 却是改了很多
变的比较简洁 (创建脱机浏览页面简单多了 ^_^)
网页读取速度似乎也变快了
最重要的是 Adobe 网站自己也舍弃 AC_RunActiveContent.js,改用 SWFObject

有图有真相~~

除此之外,还用了好几个其它非官方 JS Lib.

http://wwwimages.adobe.com/www.adobe.com/lib/com.adobe/Rel.js
http://wwwimages.adobe.com/www.adobe.com/lib/com.adobe/swfobject.js
http://wwwimages.adobe.com/www.adobe.com/lib/com.adobe/swfobject.addon.js
http://wwwimages.adobe.com/www.adobe.com/lib/com.adobe/remedy/button-value.js
http://wwwimages.adobe.com/www.adobe.com/lib/com.adobe/sIFR2.0.2/sifr.js
http://wwwimages.adobe.com/www.adobe.com/lib/com.adobe/sIFR2.0.2/sIFR-print.css
....

Read more...

2007年9月25日 星期二

AS3 时间轴预置图像对象的特性   [+/-]

Ticore's Blog

时间轴预置图像对象 (Timeline-Placed DisplayObject)
即是透过 Flash IDE 在时间轴预先放置好的 DisplayObject
与 AS3 动态添加的 DisplayObject 行为有些不太一样
以下条列说明之

  1. Timeline-Placed DisplayObject 不能改变名称,否则会出现 Error:
    Error: Error #2078: 无法更改 Timeline-placed 对象的名称属性。
    Error: Error #2078: The name property of a Timeline-placed object cannot be modified.

  2. 即使将 Timeline-Placed DisplayObject Reparenting,也不能改变其名称。

  3. 以 AS3 将 Timeline-Placed DisplayObject Reparenting 之后,可以免于被 Timeline Remove。

  4. Timeline-Placed DisplayObject 被 Timeline Rmove 之后,
    该对象的 parent 属性依然指向原本的 parent DisplayObjectContainer 对象,
    而且无法再被添加到任何 DisplayObjectContainer 之下 (Reparenting)。

  5. 被 Timeline Rmove 的 DisplayObject,所包含的 Child DisplayObject 仍可以做 Reparenting 动作。

相关连结:
AS3 DisplayObject 四大变动属性
AS3 影格控制与时间轴预置对象的问题

Read more...

2007年9月23日 星期日

新玩具 Cast Puzzle - Duet   [+/-]

Ticore's Blog

昨天逛台隆手创馆的时候
突然在益智玩具区发现有趣东西
像是小时候玩过的金属益智玩具 S&S、鹿角、....同系列产品
而且多了很多新样式
都是日本进口的,看起来很精致
每个售价大约是三百多
难度从等级一到等级六不等
像是鹿角属于等级六的

而我最后选了难度五的『Cast Duet 磁』
结果在路上边逛边玩就解开了 ><"
感受三百多白花了
其实后来发现想要原封不动装回去反而更难呢

解开之前

解开之后

Cast Puzzle 网站

Read more...

2007年9月22日 星期六

Flex 2 各种有趣的边框变化   [+/-]

Ticore's Blog

Flex 2 内的容器支持 Border 样式设置
其中以 Solid Border 变化最多
可以做出圆角、半圆、......等有趣变化

Flex 2 Border Styles:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="#FFFFFF">
 <mx:Tile width="100%" height="100%" verticalGap="30" horizontalGap="30">
  <mx:Container width="50" height="50"
   cornerRadius="10" borderStyle="solid" borderThickness="6" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderSides="top left right" borderStyle="solid"
   borderThickness="6" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderSides="top left" borderStyle="solid" borderThickness="6" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderSides="top" borderStyle="solid" borderThickness="6" />
  <mx:Container width="50" height="40"
   cornerRadius="20" borderSides="top left right" borderStyle="solid"
   borderThickness="25" />
  <mx:Container width="50" height="50"
   cornerRadius="20" borderSides="top left" borderStyle="solid"
   borderThickness="25" />
  <mx:Container width="50" height="50"
   cornerRadius="50" borderSides="top left" borderStyle="solid"
   borderThickness="20" />
  <mx:Container width="50" height="50"
   cornerRadius="50" borderSides="top left" borderStyle="solid"
   borderThickness="50" />
  <mx:Container width="60" height="30"
   cornerRadius="30" borderSides="top left right" borderStyle="solid"
   borderThickness="30" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderSides="top left right" borderStyle="solid"
   borderThickness="10" backgroundColor="#808080" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderSides="left right" borderStyle="solid"
   borderThickness="10" backgroundColor="#808080" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderStyle="solid" borderThickness="40" />
  <mx:Container width="50" height="50"
   cornerRadius="10" borderStyle="solid" borderThickness="60" />
  <mx:Container width="50" height="50"
   cornerRadius="30" borderStyle="solid" borderThickness="60" />
  <mx:Container width="50" height="50"
   cornerRadius="1" borderStyle="solid" borderThickness="50" />
  <mx:Container width="50" height="50"
   cornerRadius="1" borderStyle="solid" borderThickness="60" />
  <mx:Container width="50" height="50"
   borderSides="top left" borderStyle="solid" borderThickness="60" />
  <mx:Container width="65" height="65"
   borderStyle="solid" borderThickness="55"  borderSides="top left right bottom"
   cornerRadius="12"/>
  <mx:Container width="80" height="80"
   borderStyle="solid" borderThickness="55"  borderSides="top left right bottom"
   cornerRadius="12" backgroundColor="#808080"/>
 </mx:Tile>
</mx:Application>
Read more...

2007年9月20日 星期四

Flex 2 技巧 - 圆角容器遮罩   [+/-]

Ticore's Blog

Flex 2 很多容器都有支持圆角边框的设置 cornerRadius
不过容器的对象却会超出圆角边界
使用上不太方便~~

以下利用另一个圆角对象当作 Mask,遮住超出圆角的对象

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
 <mx:HBox>
  <mx:Label text="Border Thickness"/>
  <mx:NumericStepper id="step1" maximum="100" value="6"/>
  <mx:Label text="Corner Radius"/>
  <mx:NumericStepper id="step2" maximum="100" value="16"/>
 </mx:HBox>
 <mx:Canvas width="80%" height="80%" id="c1"
  borderStyle="solid" borderThickness="{step1.value}" cornerRadius="{step2.value}">
  <mx:Canvas width="100%" height="100%" id="c2"
   borderStyle="solid" borderThickness="0" cornerRadius="{step2.value - step1.value}"
   backgroundColor="#0" cacheAsBitmap="true"/>
  <mx:Canvas width="100%" height="100%" mask="{c2}" cacheAsBitmap="true">
   <mx:Button x="-32" y="-45" width="100" height="100" label="Button"/>
   <mx:Button x="228" y="-45" width="100" height="100" label="Button"/>
   <mx:Button x="390" y="119" width="100" height="100" label="Button"/>
   <mx:Button x="10" y="119" width="100" height="100" label="Button"/>
   <mx:Button x="218" y="263" width="100" height="100" label="Button"/>
   <mx:Button x="598" y="323" width="100" height="100" label="Button"/>
   <mx:Button x="598" y="-37" width="100" height="100" label="Button"/>
   <mx:Button x="-45" y="280" width="100" height="100" label="Button"/>
  </mx:Canvas>
 </mx:Canvas>
</mx:Application>

运行效果:

Read more...

2007年9月8日 星期六

Flash Player MovieStar 与 NetStream.VideoCodec 代码   [+/-]

Ticore's Blog

Flash Player MovieStar 开始支持 H.264、AAC 解码
忽然想到 ActionScript 3.0 NetStream 有一些关于 Codec 的未公开属性
以下就是用官方的那只 mp4 影片测试得到的结果

videoCodec : 7, audioCodec : 10, decodedFrames : 1174

由于当前 Flash Player 9.0.60.184 没有提供 Debug 版下载
所以只好克难点,把消息直接打在画面上
与之前的测试结果合起来~

videoCodec = 0:No Video Codec
videoCodec = 2:Sorenson Spark Codec
videoCodec = 4:On2 VP6 Codec
videoCodec = 7:H.264 Codec

至于 audioCodec 为什么跳成 10 就搞不清楚了~

相关连结:
Flash Player 9 Update 支持 H.264
ActionScript 3.0 - NetStream 未公开的 Codec 函式

Read more...

AS3 技巧 - 快速取得 LoaderInfo.url   [+/-]

Ticore's Blog

在 ActionScript 3.0 已经无法像以前一样
直接取用 _url 就可以得到本身 SWF 的 URL 位置
必须要从 DisplayObject.loaderInfo.url 获得
对于一个非 DisplayObject 对象来说
要得到 url 实在很麻烦
要先取得一个 DisplayObject,还要确保该对象有 loaderInfo ......

以下介绍一个关于 LoaderInfo 的高级技巧
可以直接取得当前 SWF URL 位置
不管在什么位置,不管是否可以取得 DisplayObject.loaderInfo
直接 new LoaderInfo,然后取得该对象 url 便是了

trace(new flash.display.LoaderInfo().url);

这是根据 LoaderInfo.url 变动性而来
以下配合实际例子示范:

Main Document Class:Main.as

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;

 public class Main extends MovieClip {
  
  public var app:ApplicationDomain = ApplicationDomain.currentDomain;
  
  public var ldr:Loader = new Loader();
  public var lcxt:LoaderContext = new LoaderContext(false, app);
  public var req:URLRequest = new URLRequest("Lib.swf");
  
  public function Main() {
   ldr.contentLoaderInfo.addEventListener(Event.INIT, onLibInit);
   ldr.load(req, lcxt);
  }
  
  public function onLibInit(evtObj:Event):void {
   var fun:* = app.getDefinition("Fun");
   trace(fun());
  }
 }
}

Lib Document Class:Lib.as

package {
 import flash.display.*;
 
 public class Lib extends MovieClip {
  (Fun);
 }
}

Package Function:Fun.as

package {
 import flash.display.*;
 public function Fun():String {
  return new LoaderInfo().url;
 }
}

Lib.as 只是一个外壳,主要是将 Fun.as 编译到 SWF 内

分别将 Main、Lib 编译为 SWF 之后
运行 Main.swf,便会动态装入 Lib.swf
并调用定义在 Lib.swf 内的 Package Function - Fun
得到 Lib.swf URL

需要注意 new LoaderInfo() 动作无法在之后的 Flash Player 版本运行
Flash Player 9.0.64.0
Flash Player 9.0.60.120
Flash Player 9.0.60.184
Flash Player 9.0.60.235
Flash Player 9.0.115.0
Flash Player 9.0.124.0

Flash Player update 3 之后可以改用新方法 LoaderInfo.getLoaderInfoByDefinition 取得

相关连结:
AS3 DisplayObject 四大变动属性
AS3 诡谲多变的 LoaderInfo (1)
AS3 诡谲多变的 LoaderInfo (2)

Read more...

AS3 诡谲多变的 LoaderInfo (2)   [+/-]

Ticore's Blog

在前一篇介绍了 LoaderInfo 固定性与变动性
接下来再进一步考虑比较复杂的情况

假如 MC3 Class 继承 MC2 Class,MC2 Class 又继承 MC1 Class
而这三个 Class 定义分别来自三个不同的 SWF
对于一个 MC3 Instance 调用定义在 MC1、MC2、MC3 Function 测试 LoaderInfo.url 会有什么结果?

Lib1 Document Class:

package {
 import flash.display.*;
 public class Lib1 extends MovieClip {
  (MC1);
 }
}

MC1 Class:

package {
 import flash.display.*;
 public class MC1 extends MovieClip {
  
  public function showURL():void {
   trace("MC1.loaderInfo();");
   trace(" url:" + loaderInfo.url);
   trace(" loaderURL:" + loaderInfo.loaderURL);
   trace(" width:" + loaderInfo.width);
  }
 }
}

Lib2 Document Class:

package {
 import flash.display.*;
 public class Lib2 extends MovieClip {
  (MC2);
 }
}

MC2 Class:

package {
 import flash.display.*;
 public class MC2 extends MC1 {
  
  public override function showURL():void {
   super.showURL();
   trace("MC2.loaderInfo();");
   trace(" url:" + loaderInfo.url);
   trace(" loaderURL:" + loaderInfo.loaderURL);
   trace(" width:" + loaderInfo.width);
  }
 }
}

Lib3 Document Class:

package {
 import flash.display.*;
 public class Lib3 extends MovieClip {
  (MC3);
 }
}

MC3 Class:

package {
 import flash.display.*;
 public class MC3 extends MC2 {
  
  public override function showURL():void {
   super.showURL();
   trace("MC3.loaderInfo();");
   trace(" url:" + loaderInfo.url);
   trace(" loaderURL:" + loaderInfo.loaderURL);
   trace(" width:" + loaderInfo.width);
  }
 }
}

Main Document Class:

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;
 import flash.utils.*;

 public class Main extends MovieClip {
  
  var app:ApplicationDomain;

  var ldr1:Loader;
  var ldr2:Loader;
  var ldr3:Loader;
  
  var req1:URLRequest;
  var req2:URLRequest;
  var req3:URLRequest;
  
  var lcxt1:LoaderContext;
  var lcxt2:LoaderContext;
  var lcxt3:LoaderContext;
  
  public function Main() {
   
   init();
   loadLib1();

  }
  
  public function init() {
   
   app = ApplicationDomain.currentDomain;
   
   ldr1 = new Loader();
   ldr2 = new Loader();
   ldr3 = new Loader();
   
   req1 = new URLRequest("Lib1.swf");
   req2 = new URLRequest("Lib2.swf");
   req3 = new URLRequest("Lib3.swf");
   
   lcxt1 = new LoaderContext(false, app);
   lcxt2 = new LoaderContext(false, app);
   lcxt3 = new LoaderContext(false, app);
   
   ldr1.contentLoaderInfo.addEventListener(Event.INIT, onLib1Init);
   ldr2.contentLoaderInfo.addEventListener(Event.INIT, onLib2Init);
   ldr3.contentLoaderInfo.addEventListener(Event.INIT, onLib3Init);
   
  }
  public function loadLib1() {
   trace("loadLib1();");
   ldr1.load(req1, lcxt1);
   stop();
  }
  
  public function loadLib2() {
   trace("loadLib2();");
   ldr2.load(req2 ,lcxt2);
   stop();
  }
  
  public function loadLib3() {
   trace("loadLib3();");
   ldr3.load(req3 ,lcxt3);
   stop();
  }
  
  public function onLib1Init(evtObj:Event):void {
   trace("onLib1Init();");
   loadLib2();
  }
  
  public function onLib2Init(evtObj:Event):void {
   trace("onLib2Init();");
   loadLib3();
  }
  
  public function onLib3Init(evtObj:Event):void {
   trace("onLib3Init();");
   
   var mcClass:* = app.getDefinition("MC3");
   var mcIns:* = new mcClass();
   this.addChild(mcIns);
   mcIns.showURL();
   
  }
 }
}

以上 Lib 1~3 都是用来承载 MC 1~3 Class
需要注意最好将 Libs 分别放在不同的 Folder
Lib1 输出 SWC 添加 Lib2 Classpath
Lib2 输出 SWC 添加 Lib3 Classpath
避免 Class 重复编译

运行 Main.swf 可以得到输出结果

loadLib1();
onLib1Init();
loadLib2();
onLib2Init();
loadLib3();
onLib3Init();
MC1.loaderInfo();
 url:file:///C|/......../Lib1.swf
 loaderURL:file:///C|/......../Lib1.swf
 width:400
MC2.loaderInfo();
 url:file:///C|/......../Lib2.swf
 loaderURL:file:///C|/......../Lib2.swf
 width:400
MC3.loaderInfo();
 url:file:///C|/......../Lib3.swf
 loaderURL:file:///C|/......../Lib3.swf
 width:400

由输出结果可以发现,对于同一个 MC3 Instance 而言
调用 Super Class 方法测试自身同一个 LoaderInfo 对象
得到结果是依据 Class Definition 位置而变

相关连结:
AS3 DisplayObject 四大变动属性
AS3 诡谲多变的 LoaderInfo (1)
AS3 技巧 - 快速取得 LoaderInfo.url

Read more...

AS3 诡谲多变的 LoaderInfo (1)   [+/-]

Ticore's Blog

之前已经在 AS3 DisplayObject 四大变动属性
介绍过 DisplayObject.loaderInfo 变动性
不过 LoaderInfo 诡异特性可不祇这样而已~

依据 LoaderInfo 本身变动性,还可以分为「固定的 LoaderInfo」与「不固定的 LoaderInfo」两种

所谓固定的 LoaderInfo,指对于同一个 LoaderInfo 实体而言
LoaderInfo.url 属性不会变动
反之,不固定的 LoaderInfo,LoaderInfo.url 属性则会随着 caller 位置变动

一般情况下取得 LoaderInfo 大多是不固定的
而透过 Loader.contentLoaderInfo 也就是 Loader.content.loaderInfo 取得的
则是固定的 LoaderInfo

说到这,可能让一些人非常震惊
因为文档上并没有提到这特性
结果都当作一般对象行为处里

以下做个简单的测试

Main Document Class:Main.as

package {
 import flash.display.*;
 import flash.net.*;
 import flash.events.*;
 import flash.system.*;

 public class Main extends MovieClip {
  
  public var app:ApplicationDomain = ApplicationDomain.currentDomain;
  
  public var ldr:Loader = new Loader();
  public var lcxt:LoaderContext = new LoaderContext(false, app);
  public var req:URLRequest = new URLRequest("Lib.swf");
  
  public function Main() {
   this.addChild(ldr);
   ldr.contentLoaderInfo.addEventListener(Event.INIT, onLibInit);
   ldr.load(req, lcxt);
  }
  
  public function onLibInit(evtObj:Event):void {
   
   ldr.content["test"]("Lib Test Main.loaderInfo", root.loaderInfo);
   // Lib Test Main.loaderInfo
   // url : file:///C|/........../Lib.swf
   // loaderURL : file:///C|/........../Lib.swf
   
   var ldrInfo:LoaderInfo = new LoaderInfo();
   
   test("Main Test Main.new loaderInfo", ldrInfo);
   // Main Test Main.new loaderInfo
   // url : file:///C|/........../Main.swf
   // loaderURL : file:///C|/........../Main.swf
   
   ldr.content["test"]("Lib Test Main.new loaderInfo", ldrInfo);
   // Lib Test Main.new loaderInfo
   // url : file:///C|/........../Lib.swf
   // loaderURL : file:///C|/........../Lib.swf
   
  }
  
  public function test (msg:String, ldrInfo:LoaderInfo):void {
   trace(msg);
   trace("url : " + ldrInfo.url);
   trace("loaderURL : " + ldrInfo.loaderURL);
  }
 }
}

Lib Document Class:Lib.as

package {
 import flash.display.*;
 import flash.events.Event;
 
 public class Lib extends MovieClip {
  
  public function Lib () {
   this.addEventListener(Event.ADDED_TO_STAGE, onAddStage);
  }
  
  public function onAddStage (evtObj:Event):void {
   
   parent.parent["test"]("Main Test Lib.loaderInfo", loaderInfo);
   // url : file:///C|/........../Lib.swf
   // loaderURL : ffile:///C|/........../Main.swf
   
  }
  
  public function test (msg:String, ldrInfo:LoaderInfo):void {
   trace(msg);
   trace("url : " + ldrInfo.url);
   trace("loaderURL : " + ldrInfo.loaderURL);
  }
 }
}

需要注意 new LoaderInfo() 动作无法在新的 Flash Player Beta 版运行
Flash Player 9.0.60.120
Flash Player 9.0.60.184
Flash Player 9.0.115.0
Flash Player 9.0.124.0

相关连结:
AS3 DisplayObject 四大变动属性
AS3 诡谲多变的 LoaderInfo (2)
AS3 技巧 - 快速取得 LoaderInfo.url

Read more...

2007年9月4日 星期二

AS3 valueOf 的妙用   [+/-]

Ticore's Blog

最近在使用 ActionScript 3.0 Proxy 类别时
忽然发现 valueOf 非常方便
使用 Proxy 层层嵌套对象之后,需要作脱壳动作时
valueOf 就可以派上用场
一般情况下,几乎不用额外撰写程序码
以下是简单的例子~

Main Class:

package {
 import flash.display.*;
 
 public class Main extends MovieClip {
  
  public function Main () {
   
   var obj:Object = {name: "Object 01"};
   var sehll1:Shell = new Shell(obj);
   var sehll2:Shell = new Shell(sehll1);
   trace(sehll2.name); // Object 01
   trace(sehll2.valueOf().valueOf() == obj); // true
   
  }
  
 }
}

Shell Class:

package {
 import flash.utils.*;
 
 public dynamic class Shell extends Proxy {
  
  private var obj:Object;
  
  public function Shell (obj:Object) {
   this.obj = obj;
  }
  
  flash_proxy override function callProperty(name:*, ...rest):* {
   return obj[name].apply(obj, rest);
  }
  
  flash_proxy override function deleteProperty(name:*):Boolean {
   return delete obj[name];
  }
  
  flash_proxy override function getProperty(name:*):* {
   return obj[name];
  }
  
  flash_proxy override function setProperty(name:*, value:*):void {
   obj[name] = value;
  }
  
 }
}
Read more...

AS3 MouseEvent.relatedObject   [+/-]

Ticore's Blog

ActionScript 3.0 的 MouseEvent 与 FocusEvent 增加了好用的属性 - relatedObject
可以直接在处理该事件同时获得前后相对应的对象
类似的功能想要在 AS 2.0 上实做,就要花不少功夫了~

把之前的程序 AS3 - MouseOver 与 RollOver 差异性 (3) 加上 relatedObject 资料输出
可以得到以下输出结果

eventPhase : 1, currentTarget : null, target : MC1, type : rollOver
eventPhase : 1, currentTarget : root1, target : MC1, type : rollOver
eventPhase : 2, currentTarget : MC1, target : MC1, type : rollOver
eventPhase : 1, currentTarget : null, target : root1, type : rollOver
eventPhase : 2, currentTarget : root1, target : root1, type : rollOver

eventPhase : 1, currentTarget : null, target : MC1, type : mouseOver
eventPhase : 1, currentTarget : root1, target : MC1, type : mouseOver
eventPhase : 2, currentTarget : MC1, target : MC1, type : mouseOver
eventPhase : 3, currentTarget : root1, target : MC1, type : mouseOver
eventPhase : 3, currentTarget : null, target : MC1, type : mouseOver

eventPhase : 1, currentTarget : null, target : MC1, type : mouseOut, relatedObject : MC2
eventPhase : 1, currentTarget : root1, target : MC1, type : mouseOut, relatedObject : MC2
eventPhase : 2, currentTarget : MC1, target : MC1, type : mouseOut, relatedObject : MC2
eventPhase : 3, currentTarget : root1, target : MC1, type : mouseOut, relatedObject : MC2
eventPhase : 3, currentTarget : null, target : MC1, type : mouseOut, relatedObject : MC2

eventPhase : 1, currentTarget : null, target : MC2, type : rollOver, relatedObject : MC1
eventPhase : 1, currentTarget : root1, target : MC2, type : rollOver, relatedObject : MC1
eventPhase : 1, currentTarget : MC1, target : MC2, type : rollOver, relatedObject : MC1
eventPhase : 2, currentTarget : MC2, target : MC2, type : rollOver, relatedObject : MC1

eventPhase : 1, currentTarget : null, target : MC2, type : mouseOver, relatedObject : MC1
eventPhase : 1, currentTarget : root1, target : MC2, type : mouseOver, relatedObject : MC1
eventPhase : 1, currentTarget : MC1, target : MC2, type : mouseOver, relatedObject : MC1
eventPhase : 2, currentTarget : MC2, target : MC2, type : mouseOver, relatedObject : MC1
eventPhase : 3, currentTarget : MC1, target : MC2, type : mouseOver, relatedObject : MC1
eventPhase : 3, currentTarget : root1, target : MC2, type : mouseOver, relatedObject : MC1
eventPhase : 3, currentTarget : null, target : MC2, type : mouseOver, relatedObject : MC1

eventPhase : 1, currentTarget : null, target : MC2, type : mouseOut
eventPhase : 1, currentTarget : root1, target : MC2, type : mouseOut
eventPhase : 1, currentTarget : MC1, target : MC2, type : mouseOut
eventPhase : 2, currentTarget : MC2, target : MC2, type : mouseOut
eventPhase : 3, currentTarget : MC1, target : MC2, type : mouseOut
eventPhase : 3, currentTarget : root1, target : MC2, type : mouseOut
eventPhase : 3, currentTarget : null, target : MC2, type : mouseOut

eventPhase : 1, currentTarget : null, target : root1, type : rollOut
eventPhase : 2, currentTarget : root1, target : root1, type : rollOut
eventPhase : 1, currentTarget : null, target : MC1, type : rollOut
eventPhase : 1, currentTarget : root1, target : MC1, type : rollOut
eventPhase : 2, currentTarget : MC1, target : MC1, type : rollOut
eventPhase : 1, currentTarget : null, target : MC2, type : rollOut
eventPhase : 1, currentTarget : root1, target : MC2, type : rollOut
eventPhase : 1, currentTarget : MC1, target : MC2, type : rollOut
eventPhase : 2, currentTarget : MC2, target : MC2, type : rollOut

Mouse Event relatedObject 1

Mouse Event relatedObject 2

相关连结:
MouseEvent.relatedObject
FocusEvent.relatedObject

Read more...

2007年9月1日 星期六

Flex 2 Drag and Drop 练习   [+/-]

Ticore's Blog

以下是 Flex 2 Drag & Drop 练习
可以在 Canvas 容器内拖拉放对象
也可以跨 Canvas 容器拖放对象

Flex 2 Cross Canvas Drag & Drop

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
   creationComplete="init();" layout="horizontal" >
 <mx:Script>
  <![CDATA[
   import mx.core.*;
   import mx.containers.*;
   import mx.managers.*;
   import mx.events.*;
   
   [SWF(frameRate=30)]
   
   public function init():*{
    
    genSqr();
    
    cont1.addEventListener(DragEvent.DRAG_ENTER, onDragEnter);
    cont2.addEventListener(DragEvent.DRAG_ENTER, onDragEnter);
    
    cont1.addEventListener(DragEvent.DRAG_DROP, onDragDrop);
    cont2.addEventListener(DragEvent.DRAG_DROP, onDragDrop);
    
   }
   
   public function genSqr():*{
    var sqr:Canvas;
    for (var i:Number = 0 ; i < 10 ; ++i) {
     sqr = new Canvas();
     sqr.setStyle("backgroundColor", Math.random() * 0xFFFFFF);
     sqr.x = Math.random() * 150;
     sqr.y = Math.random() * 150;
     sqr.width = 50;
     sqr.height = 50;
     sqr.addEventListener(MouseEvent.MOUSE_MOVE, doDrag);
     sqr.addEventListener(DragEvent.DRAG_COMPLETE, onDragComplete);
     cont1.addChild(sqr);
    }
   }
   
   public function doDrag(evtObj:MouseEvent):void{
    
    if (!evtObj.buttonDown) {
     return;
    }
    
    var dragInitiator:Canvas = Canvas(evtObj.currentTarget);
    var ds:DragSource = new DragSource();
    ds.addData(dragInitiator, "item");
    ds.addData(evtObj.localX, "offsetX");
    ds.addData(evtObj.localY, "offsetY");
    
    var canvasProxy:Canvas = new Canvas();
    canvasProxy.width = 50;
    canvasProxy.height = 50;
    canvasProxy.setStyle("backgroundColor", dragInitiator.getStyle("backgroundColor"));
    DragManager.doDrag(dragInitiator, ds, evtObj, canvasProxy);
    
   }
   
   public function onDragEnter(evtObj:DragEvent):void{
    
    var dropTarget:Canvas = Canvas(evtObj.currentTarget);
    
    if (evtObj.dragSource.hasFormat("item")) {
     DragManager.acceptDragDrop(dropTarget);
    }
    
   }
   
   public function onDragDrop(evtObj:DragEvent):void{
    var dropTarget:Canvas = Canvas(evtObj.currentTarget);
    var dropItem:Canvas = Canvas(evtObj.dragSource.dataForFormat("item"));
    
    dropItem.x = evtObj.localX - Number(evtObj.dragSource.dataForFormat("offsetX"));
    dropItem.y = evtObj.localY - Number(evtObj.dragSource.dataForFormat("offsetY"));
    
    dropItem.parent.removeChild(dropItem);
    dropTarget.addChild(dropItem);
   }
   
   public function onDragComplete(evtObj:DragEvent):void{
    //trace(evtObj.target);
   }
   
  ]]>
 </mx:Script>
 <mx:Canvas id="cont1" width="200" height="200" backgroundColor="0xFFFFFF">
 </mx:Canvas>
 <mx:Spacer width="50" />
 <mx:Canvas id="cont2" width="200" height="200" backgroundColor="0xFFFFFF">
 </mx:Canvas>
</mx:Application>

线上示范 Demo:

Read more...

AUG 网聚 Flash 3D引擎:Papervision 3D (PV3D)   [+/-]

Ticore's Blog

网聚报名网址:
http://mmug.com.tw/forum/mmug_meet.php?join_id=42

function 活动主题( ) {
 //Adobe User Group
 //九月份网聚
 //进入真正的 Flash 3D 世界
 //使用 Papervision 3D
}

function 日期时间( ) {
 var 日期 = "2007/09/09 (周日)";
 var 时间 = "13:00~17:00";
}

function 地点( ) {
 var 地点 = "天行者多媒体休闲概念馆";
 //靠近民生东路与松江路口
 var 地址 = "台北市民生东路二段119号B1";
 var 电话 = "02-2537-6111";
}

function 讲师( ) {
 //PV3D 程序简介
 var 讲师1 = "邦邦";
 //集成既有的3D模型
 var 讲师2 = "savia";
}

function 适合对象( ) {
 if((有兴趣 && 有点程序背景)
    || 没看过邦邦blog的教学
    || 懒得看邦邦blog的教学
    || 看不懂邦邦blog的教学)
  欢迎( );
 else
  别浪费时间跑这一趟( ); 
}
Read more...