jsfl 初探

首先看一下何为jsfl(摘自官方):

利用 Flash JavaScript API 可以编写在 Flash 创作环境中(即用户保持 Flash 程序打开期间)执行多个动作的脚本。此功能与 ActionScript 语言不同,利用 ActionScript 语言可以编写能够在 Flash Player 环境中(即播放 SWF 文件期间)执行动作的脚本。此功能与 JavaScript 命令也不同,JavaScript 命令可以在用 Web 浏览器显示的页面中使用。

利用 JavaScript API,您可以编写有助于简化创作过程的 Flash 应用程序脚本。例如,您可以编写脚本来自动执行重复性任务,或向“工具”面板添加自定义工具。

Flash JavaScript API 在设计上类似于 Adobe ® Dreamweaver® 和 Adobe® Fireworks® JavaScript API(它们基于 Netscape JavaScript API 而设计)。Flash JavaScript API 基于文档对象模型 (DOM),该模型允许使用 JavaScript 对象访问 Flash 文档。Flash JavaScript API 包含 Netscape JavaScript API 及 Flash DOM 的所有元素。本文档将对这些新增的对象及其方法和属性进行说明。您可以在 Flash 脚本中使用本地 JavaScript 语言的任何元素,但只有在 Flash 文档上下文中有意义的元素才有效。

此外,JavaScript API 还包含一些方法,使您可组合使用 JavaScript 和自定义 C 代码来实现可扩展性。有关详细信息,请参阅 C 级可扩展性

Flash 中的 JavaScript 解释程序采用的是 Mozilla SpiderMonkey 引擎 1.6 版,该版本可从网络中找到:www.mozilla.org/js/spidermonkey/。SpiderMonkey 是 Mozilla.org 开发的 JavaScript 语言的两种引用实现之一。它与嵌入 Mozilla 浏览器中的引擎相同。

SpiderMonkey 按照 ECMAScript (ECMA-262) 版本 3 语言规范中的定义,实现了核心 JavaScript 语言,并完全符合该规范的要求。只有那些特定于浏览器的主机对象(未包含在 ECMA-262 规范中)不受支持。同样,许多 JavaScript 参考指南都区分核心 JavaScript 和客户端(与浏览器相关的)JavaScript。只有核心 JavaScript 才适用于 Flash JavaScript 解释程序。

下面测试 将库中元件开头为SK的加linkage,导出类.  这样就不必每个元件都打开都去选择linkage.非常方便:

?View Code ACTIONSCRIPT
var doc = fl.getDocumentDOM(); //取得当前文档
var itemes = doc.library.items;//取得库中所有的元素
for(var i = 0; i < itemes.length; i++)
{
	var item = itemes[i];
	var name = item.name; //元素的名字
	if(/^SK/.test(name))//判断开头是否是SK
	{
		item.linkageExportForAS = true;
		item.linkageIdentifier = item.name; //设置导出类名
	}
 
}
 
var lib = doc.library;
lib.selectAll();
lib.updateItem();
lib.selectNone();
doc.save(); //保存fla
doc.testMovie(); //测试 编译swf

在flash ide中新建 javascript 文件 将以上代码复制到新建的文件中, 在新建的fla文件. commands-> ‘你的jsfl文件’
就可以执行了看到效果了..确实很方便.好多功能在学习中.

利用AIR的ServerSocket类让 AIR 做socket服务器

新的air sdk 新增了 ServerSocket类, 利用它我们做一些简单的局域网应用,比如小型的办公聊天软件,以及一些基于socket的服务应用.这样as程序员可以自己搞定服务器端,不在去求于java程序员.在一下大型应用还没有尝试过.期待有人能做一下大型应用的尝试.小型的办公应用足够能满足了.

首先看服务器端代码:

?View Code ACTIONSCRIPT
package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.ProgressEvent;
    import flash.events.ServerSocketConnectEvent;
    import flash.net.ServerSocket;
    import flash.net.Socket;
    import flash.text.TextField;
    import flash.text.TextFieldType;
    import flash.utils.ByteArray;
 
    public class Main extends Sprite
    {
        private var serverSocket:ServerSocket = new ServerSocket();
        private var clientSocket:Socket;
 
        private var localIP:TextField;
        private var localPort:TextField;
        private var logField:TextField;
        private var message:TextField;
	private var _clients:Array = [];
 
        public function Main()
        {
            setupUI();
        }
 
        //当客户端成功连接服务端
        private function onConnect( event:ServerSocketConnectEvent):void
        {
            clientSocket = event.socket;
            clientSocket.addEventListener( ProgressEvent.SOCKET_DATA, onClientSocketData );
	   _clients.push(clientSocket);
            log( "Connection from " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
        }
 
        //当有数据通信时
        private function onClientSocketData( event:ProgressEvent ):void
        {
            var buffer:ByteArray = new ByteArray();
            clientSocket.readBytes( buffer, 0, clientSocket.bytesAvailable );
            log( "Received: " + buffer.toString() );
 
			for (var i:int = 0; i < _clients.length; i++) 
			{
				var item:Socket = _clients[i] as Socket;
				if (!item) continue;
				item.writeObject(buffer.toString());
				item.flush();
			}
 
 
        }
        //绑定服务器ip 开始监听端口
        private function bind( event:Event ):void
        {
            if( serverSocket.bound ) 
            {
                serverSocket.close();
                serverSocket = new ServerSocket();
 
            }
            serverSocket.bind( parseInt( localPort.text ), localIP.text );
            serverSocket.addEventListener( ServerSocketConnectEvent.CONNECT, onConnect );
            serverSocket.listen();
            log( "Bound to: " + serverSocket.localAddress + ":" + serverSocket.localPort );
        }
 
        //服务器端向所有客户端发送数据
        private function send( event:Event ):void
        {
            try
            {
                if (_clients.length == 0)
				{
					log('没有连接');
					return;
				}
				for (var i:int = 0; i < _clients.length; i++) 
				{
					var item:Socket = _clients[i] as Socket;
					if (!item) continue;
					item.writeObject(message.text);
					item.flush();
				}
 
				/*if( clientSocket != null && clientSocket.connected )
                {
                    clientSocket.writeUTFBytes( message.text );
                    clientSocket.flush(); 
                    log( "Sent message to " + clientSocket.remoteAddress + ":" + clientSocket.remotePort );
                }
                else log("No socket connection.");*/
            }
            catch ( error:Error )
            {
                log( error.message );
            }
        }
 
	// 输出日志
        private function log( text:String ):void
        {
            logField.appendText( text + "\n" );
            logField.scrollV = logField.maxScrollV;
            trace( text );
        }
 
	//设置皮肤
        private function setupUI():void
        {
            localIP = createTextField( 10, 10, "Local IP", "0.0.0.0");
            localPort = createTextField( 10, 35, "Local port", "0" );
            createTextButton( 170, 60, "Bind", bind );
            message = createTextField( 10, 85, "Message", "Lucy can't drink milk." );
            createTextButton( 170, 110, "Send", send );
            logField = createTextField( 10, 135, "Log", "", false, 200 )
 
            this.stage.nativeWindow.activate();
        }
 
        private function createTextField( x:int, y:int, label:String, defaultValue:String = '', editable:Boolean = true, height:int = 20 ):TextField
        {
            var labelField:TextField = new TextField();
            labelField.text = label;
            labelField.type = TextFieldType.DYNAMIC;
            labelField.width = 100;
            labelField.x = x;
            labelField.y = y;
 
            var input:TextField = new TextField();
            input.text = defaultValue;
            input.type = TextFieldType.INPUT;
            input.border = editable;
            input.selectable = editable;
            input.width = 280;
            input.height = height;
            input.x = x + labelField.width;
            input.y = y;
 
            this.addChild( labelField );
            this.addChild( input );
 
            return input;
        }
 
        private function createTextButton( x:int, y:int, label:String, clickHandler:Function ):TextField
        {
            var button:TextField = new TextField();
            button.htmlText = "<u><b>" + label + "</b></u>";
            button.type = TextFieldType.DYNAMIC;
            button.selectable = false;
            button.width = 180;
            button.x = x;
            button.y = y;
            button.addEventListener( MouseEvent.CLICK, clickHandler );
 
            this.addChild( button );
            return button;
        }        
    }
}

blog 重新恢复了

最近项目比较忙, blog都荒废了.  域名都差点过期. 以后的经常更新了..:>

chrome下flash中文无法输入的问题

最近开发项目的时候遇到了这个问题. google拼音,搜狗均不可以.会有一闪一闪的效果.
最后发现是因为插入swf的标签属性中设置了 wmode = transparent. 导致了bug的产生.

wmode参数的作用如下:
window 模式

默认情况下的显示模式,在这种模式下flash player有自己的窗口句柄,这就意味着flash影片是存在于Windows中的一个显示实例,并且是在浏览器核心显示窗口之上的,所以flash只 是貌似显示在浏览器中,但这也是flash最快最有效率的渲染模式。由于他是独立于浏览器的HTML渲染表面,这就导致默认显示方式下flash总是会遮 住位置与他重合的所有DHTML层。

但是大多数苹果电脑浏览器会允许DHTML层显示在flash之上,但当flash影片播放时会出现比较诡异的现象,比如DHTML层像被flash刮掉一块一样显示异常。

Opaque 模式

这 是一种无窗口模式,在这种情况下flash player没有自己的窗口句柄,这就需要浏览器需要告诉flash player在浏览器的渲染表面绘制的时间和位置。这时flash影片就不会在高于浏览器HTML渲染表面而是与其他元素一样在同一个页面上,因此你就可 以使用z-index值来控制DHTML元素是遮盖flash或者被遮盖。

Transparent 模式

透 明模式,在这种模式下flash player会将stage的背景色alpha值将为0并且只会绘制stage上真实可见的对象,同样你也可以使用z-index来控制flash影片的 深度值,但是与Opaque模式不同的是这样做会降低flash影片的回放效果,而且在9.0.115之前的flash player版本设置wmode=”opaque”或”transparent”会导致全屏模式失效。
———————————————————————-
设置了wmode = tranparent 主要是为了方便

能方便的覆盖在flash上, 解决方法是去掉wmode=tranparent属性,利用iframe来挡住flash.

网上还有其他一些畸形的解决办法,利用页面的 input框,将输入的值利用js 传入到 flash中去.位置对齐就比较难掌握了.或者利用
另一个没有设置wmode=tranparent的swf来接受输入值,然后利用localconnect对象传值.

我家可乐

flashdevelop 编译参数

先看代码
CONFIG::debug
{
//加载本地测试代码
load(‘local.txt’);
}

CONFIG::release
{
//加载运程服务器数据
load(‘http:///……php’);
}

在动态切换debug和release时可以不需要来回切换注释,方便了上线.
具体可参照:
项目目录下 obj/config.xml
部分代码:
define append=”true”>
<name>CONFIG::debug</name>
<value>true</value>
</define>
<define append=”true”>
<name>CONFIG::release</name>
<value>false</value>
</define>
<define append=”true”>
<name>CONFIG::timeStamp</name>
<value>’2010/12/13′</value>
</define>

MyEclipse 快捷键大全

MyEclipse 快捷键大全

(1)Ctrl+M切换窗口的大小

(2)Ctrl+Q跳到最后一次的编辑处

(3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip Description。

F3跳到声明或定义的地方。

F5单步调试进入函数内部。

F6单步调试不进入函数内部,如果装了金山词霸2006则要把“取词开关”的快捷键改成其他的。

F7由函数内部返回到调用处。

F8一直执行到下一个断点。

(4)Ctrl+Pg~对于XML文件是切换代码和图示窗口

(5)Ctrl+Alt+I看Java文件中变量的相关信息

(6)Ctrl+PgUp对于代码窗口是打开“Show List”下拉框,在此下拉框里显示有最近曾打开的文件

(7)Ctrl+/ 在代码窗口中是这种//~注释。

Ctrl+Shift+/ 在代码窗口中是这种/*~*/注释,在JSP文件窗口中是。

(8)Alt+Shift+O(或点击工具栏中的Toggle Mark Occurrences按钮) 当点击某个标记时可使本页面中其他地方的此标记黄色凸显,并且窗口的右边框会出现白色的方块,点击此方块会跳到此标记处。

(9)右击窗口的左边框即加断点的地方选Show Line Numbers可以加行号。

(10)Ctrl+I格式化激活的元素Format Active Elements。

Ctrl+Shift+F格式化文件Format Document。

(11)Ctrl+S保存当前文件。

Ctrl+Shift+S保存所有未保存的文件。

(12)Ctrl+Shift+M(先把光标放在需导入包的类名上) 作用是加Import语句。

Ctrl+Shift+O作用是缺少的Import语句被加入,多余的Import语句被删除。

(13)Ctrl+Space 提示键入内容即Content Assist,此时要将输入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷键(用于切换英文和其他文字)改成其他的如改成Ctrl+Shift+Z,同时在“Text Service and Input Languages”对话框中删掉Chinese(PRC)下面的其他中文输入法只保留紫光输入法,此时按Ctrl+Shift+Z将在英文和紫光中文之 间切换。

Ctrl+Shift+Space提示信息即Context Information。

(14)Ctrl+D删除当前行。

(15)双击窗口的左边框可以加断点。

(16)在.jap.或.java等文件中右键选“Campare With”或“Replace With”可以找到所有操作的历史记录。

(17)在菜单中选Window-Show View-Navigator可调出导航功能窗。

(18)Ctrl+1 快速修复(最经典的快捷键,就不用多说了)

Ctrl+Alt+↓ 复制当前行到下一行(复制增加)

Ctrl+Alt+↑ 复制当前行到上一行(复制增加)

Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)

Alt+↑ 当前行和上面一行交互位置(同上)

Alt+← 前一个编辑的页面

Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)

Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性

Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后)

Shift+Ctrl+Enter 在当前行插入空行(原理同上条)

Ctrl+Q 定位到最后编辑的地方

Ctrl+L 定位在某行 (对于程序超过100的人就有福音了)

Ctrl+M 最大化当前的Edit或View (再按则反之)

Ctrl+/ 注释当前行,再按则取消注释

Ctrl+O 快速显示 OutLine

Ctrl+T 快速显示当前类的继承结构

Ctrl+W 关闭当前Editer

Ctrl+K 参照选中的Word快速定位到下一个

Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示)

Ctrl+/(小键盘) 折叠当前类中的所有代码

Ctrl+×(小键盘) 展开当前类中的所有代码

Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替)

Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作)

Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了)

Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查)

Ctrl+Shift+F4 关闭所有打开的Editer

Ctrl+Shift+X 把当前选中的文本全部变味小写

Ctrl+Shift+Y 把当前选中的文本全部变为小写

Ctrl+Shift+F 格式化当前代码

Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)

下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了)

Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力)

Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用)

Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定)

Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候)

Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能)

Alt+Shift+I 合并变量(可能这样说有点不妥Inline)

Alt+Shift+V 移动函数和变量(不怎么常用)

Alt+Shift+Z 重构的后悔药(Undo)

FLASHCS5中应用RSL共享库~

FLASHCS5中应用RSL共享库~ – L4cd.Net 简单工作.

【猴姆独家】我靠!比原唱还好听!牛人Boyce Avenue深情翻唱Bruno Mars冠单

将swf转化成gif动画

实现原理利用gifEncoder类包 (地址:http://www.bytearray.org/?p=93),将逐帧的BitmapData转化成gif格式.

遇到问题有两个:

1.如何快速将movieClip的每帧能快速draw成BitmapData,因为有些动画很长,如果按照动画逐帧draw的会很慢,所以我这里使用了动态更改帧频的办法,将帧频瞬间增大的200,此时只做draw工作,cpu不是很高.

2.有些动画层级比较深如何将整体的swf暂停以及播放 ,我自己写了一个MovieClipManger主要是利用递归将所有MovieClip暂停然后按需要播放动画.

需要说明的是必须是flash9以上制作的动画,而且逐时间轴必须在最上层,单帧动画就没辙了.

用途:将动画师制作的swf人物元素能批量生成gif动画,在大型游戏中使用gif可以有效降低cpu,至于如何让gif在flash中播放,看这里:http://www.bytearray.org/?p=95

主要代码:
测试主类 Main:加载了一个测试swf文件,并将转化后gif保存到了本地