About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Aug

    31

    Apache Flex TourDeFlex 1.0

    • 0 Comments
    • Flash Platform

    在线演示:http://flex.apache.org/tourdeflex/index.html

    源码下载:http://www.apache.org/dyn/closer.cgi/flex/tourdeflex/1.0

    从这个 Apache 最新版本的 TourDeFlex 1.0 中可以看到什么验证器、格式化器仍然全部都是 MX 的。非可视化类没有被做成 Spark 版本也就算了,当初 Flex 标准版和专业版最大的区别是图表类,居然也没有被做成 Spark 版本;从 Adobe 捐赠给 Apache 到现在冒似已经过了二年有余了,居然连最常用的 Alert、Tree、Accordion 等组件居然也没有对应的 Spark 版本,而应用中常用的 NumericStepper、TextInput 在不同环境中的常见 Bug 也未得到修复。真是 Shit !

    这么久连个 Alert 都不给做,还指望 Apache 去做类似支持表头分组,跨行、跨单元格、合并单元格等功能的重量级组件 AdvancedDataGrid ?新组件就更不要提了,唉,洗洗早点睡了吧。。。

    Aug

    28

    以下脚本可以在 Adobe CS5 以上版的 ExtendScript Toolkit 中运行(低版本的 PS 未作测试,本人使用编码与测试环境是 PS CS6,以下脚本全部参考 Photoshop JS CS5 API 手册)。如果安装的是绿色版 PS CS5 以上版本,可以将以下代码全部复制,保存到一个 *.txt 文本文件,然后将 .txt 后缀名改为 .js 或 .jsx。然后启动 PS CS5 或 CS6,选择菜单“文件——脚本——浏览”,然后选中脚本文件运行即可。

    备注:其中变量名 mySite 引用的字符串 “www.zinewow.com” 就是需要更改后显示的图层名称。

    #target photoshop
    app.bringToFront();

    var inputFolder = Folder.selectDialog("先选择一个输入文件夹");
    var fileList = inputFolder.getFiles();

    var mySite = www.zinewow.com;

    for (var i = 0; i < fileList.length; i++)
    {
        if (fileList[i] instanceof File && !fileList[i].hidden && checkPSDFile(fileList[i]))
        {
            open(fileList[i]);

            if (documents.length == 0)
            {
                alert("没有可处理的文档");
            }
            else
            {
                var layers = activeDocument.layers;
                renameLayers(layers);
                activeDocument.close(SaveOptions.SAVECHANGES);//保存并关闭源文件
            }
        }
    }

    function checkPSDFile(inFileName)
    {
        var lastDot = inFileName.toString().lastIndexOf(".");
        if (lastDot == -1)
        {
            return false;
        }
        var extension = inFileName.toString().substr(lastDot + 1);
        extension = extension.toLowerCase();

        if (extension == "psd")
        {
            return true;
        }
        return false;
    }

    function renameLayers(layers)
    {
        for (var i = 0; i < layers.length; i++)
        {
            var layer = layers[i];
            layer.name = mySite;
            if (layer.typename == 'LayerSet')
            {
                renameLayers(layer.layers);
            }
        }
    }

    Aug

    24

    现在的 ADdobe AIR SDK 最新版本(3.7 以上版本)都支持 2048 x 2048 以上的大纹理图,但当更新 ADOBE AIR SDK 后使用大纹理图时在 Flash Builder 4.7 版本中会报以下错误:

    ArgumentError: Error #3683: Texture too big (max is 2048x2048).

    这是因为 SWF 内部版本号没有修改的原因。在项目属性的编译器选项中输入 -swf-version=XX(XX 代码与 AIR SDK 对应的内部版本号)。

    最新版本的 SWF 内部版本号可以通过 Adobe 官方地址查询:

    http://www.adobe.com/devnet/articles/flashplayer-air-feature-list.html

    旧版本的 SWF 内部版本号可以查看本博客的贴子:

    http://blog.zinewow.com/post/189.html

    Aug

    20

    Flex Spark 组件种类少,BUG多,但利用它的 MXML 画图功能还是非常好使的:

    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
                   xmlns:s="library://ns.adobe.com/flex/spark"
                   xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
        <s:layout>
            <s:BasicLayout/>
        </s:layout>
        <fx:Declarations>
            <!-- 将非可视元素(例如服务、值对象)放在此处 -->
        </fx:Declarations>

        <!-- 画一个椭圆或圆 -->
        <s:Ellipse width="120" height="100" x="52" y="115">
            <s:fill>
                <s:SolidColor color="#ff0000" />
            </s:fill>
        </s:Ellipse>

        <!-- 画一个红色的椭圆或圆,描黑色的边 -->
        <s:Ellipse width="120" height="100" x="48" y="224">
            <s:fill>
                <s:SolidColor color="#ff0000" />
            </s:fill>
            <s:stroke> 
                <s:SolidColorStroke color="0x000000" weight="2"/> 
            </s:stroke>
        </s:Ellipse>

        <!-- 画一个空心的椭圆或圆,有黑色的边 -->
        <s:Ellipse width="120" height="100" x="208" y="111">
            <s:stroke> 
                <s:SolidColorStroke color="0x000000" weight="1"/> 
            </s:stroke>
        </s:Ellipse>

        <!-- 画一个长方形或正方形 -->
        <s:Rect width="100" height="80" x="432" y="134">
            <s:fill>
                <s:SolidColor color="#ff0000" />
            </s:fill> 
        </s:Rect>

        <!-- 画一个红色的直线 -->
        <s:Line width="238" x="200" y="80" >
            <s:stroke> 
                <s:SolidColorStroke color="0xff0000" weight="2"/> 
            </s:stroke> 
        </s:Line>

        <!-- 画一个颜色渐变的直线 -->
        <s:Line width="238" x="200" y="100" >
            <s:stroke>
                <s:LinearGradientStroke weight="2">
                    <s:GradientEntry color="#ff0000"/>
                    <s:GradientEntry color="#ffff00"/>
                </s:LinearGradientStroke>
            </s:stroke>
        </s:Line>
    </s:Application>

    Aug

    18

    package {

        import mx.validators.ValidationResult;
        import mx.validators.Validator;

        public class MatchValidator extends Validator{
            private var _matchSource: Object = null;
            private var _matchProperty: String = null;
            private var _noMatchError: String = "Fields did not match";

            [Inspectable(category="General", defaultValue="Fields did not match")]
            public function set noMatchError( argError:String):void{
                _noMatchError = argError;
            }
            public function get noMatchError():String{
                return _noMatchError;
            }

            [Inspectable(category="General", defaultValue="null")]
            public function set matchSource( argObject:Object):void{
                _matchSource = argObject;
            }
            public function get matchSource():Object{
                return _matchSource;
            }

            [Inspectable(category="General", defaultValue="null")]
            public function set matchProperty( argProperty:String):void{
                _matchProperty = argProperty;
            }
            public function get matchProperty():String{
                return _matchProperty;
            }

            override protected function doValidation(value:Object):Array {

                var results:Array = super.doValidation(value.ours);

                var val:String = value.ours ? String(value.ours) : "";
                if (results.length > 0 || ((val.length == 0) && !required)){
                    return results;
                }else{
                    if(val != value.toMatch){
                        results.length = 0;
                        results.push( new ValidationResult(true,null,"mismatch",_noMatchError));
                        return results;
                    }else{
                        return results;
                    }
                }
            }  

            override protected function getValueFromSource():Object {
                var value:Object = {};

                value.ours = super.getValueFromSource();

                if (_matchSource && _matchProperty){
                    value.toMatch = _matchSource[_matchProperty];
                }else{
                    value.toMatch = null;
                }
                return value;
            }
        }
    }

    Aug

    18

    public class PasswordValidator extends Validator
    {
        public function PasswordValidator()
        {
        }

        private var errors:Array;
        private var _minLength:int = 8;

        public function set minLength(value:int):void{
            _minLength = value;     
        }

        override protected function doValidation(value:Object):Array {

            var userName: String = value.userName;
            var password: String = value.password;

            var pattern:RegExp = new RegExp("^.*(?=.{"+_minLength+",})(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$");             

            errors = super.doValidation(value);     

            if(userName == password){
                errors.push(new ValidationResult(true, null,null,"Password should not be identical with the username"));
            }

            if (pattern.exec(password)==null){
                errors.push(new ValidationResult(true, null,null,"Weak password"));
            }   

            return errors;
        }
    }

    Aug

    16

    1、搜索443端口占用情况,并找到进程ID 
    netstat -ano|findstr "443"
    2、找到 PID 为720 (这里可能是其它的值)
    TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 720
    UDP 0.0.0.0:59443 *:* 7584
    3、查找 PID 为 720 对应的进程名
    tasklist|findstr "720"
    4、找到是 QQ 旋风占用,结束掉进程。
    QQDownload.exe 720 Console 1 56,156 K

    Aug

    14

    启动 “Notepad++”,点击菜单“搜索”→查找→文件查找,在查找目标中输入需要搜索的文本,并选定一个目录,就可以批量查找与搜索了(可以带上搜索子目录选项)。用 Notepad++ 批量搜索的优势是除了普通匹配模式搜索之外,还能支持转义搜索与正则表达式模式搜索,并且可以直接双击搜索结果,会自动打开并跳转到搜索结果高亮显示;它同时支持批量替换文本(批量替换需谨慎,因为这是不可逆的操作)。

    Aug

    9

    Robotlegs2 中文教程与资料

    • 0 Comments
    • Flash Platform

    Aug

    9

    Egret Engine(白鹭引擎)是一款使用 TypeScript 语言构建的开源免费的移动游戏引擎。白鹭引擎的核心定位是开放,高效,优雅。通过它,你可以快速地创建 HTML5 类型的移动游戏,也可以将游戏项目编译输出成为目标移动平台的原生游戏应用。

    开源免费

    Egret 引擎是一个基于 BSD 开源协议许可的永久免费的项目!你可以在项目中随意使用且修改它,并且拥有 100% 的控制权。你可以从 Egret 的 Github 网站获取它的源代码,从而了解和学习它的核心细节。Egret 具有完善的文档,并且易于上手学习,使用它可以让你更容易专注于游戏本身的开发。

    性能卓越

    Egret 将为你的游戏提供卓越的游戏渲染性能支撑,相对于其他移动游戏引擎,Egret 深度优化了显示对象列表处理机制和脏矩形算法,提供了强大的位图 CacheBuffer 处理功能。在未来的正式版本中,Egret还将加入所有的渲染内容均可调用基于 WebGL 的硬件加速和无缝的软件回退功能。

    简洁,优雅,跨平台

    Egret 引擎核心使用Typescript(JavaScript超集)编写,透过它,你可以很容易的在 iOS 和安卓平台的各种浏览器中轻松的运行你的 HTML5 游戏,并在不同平台浏览器里提供近乎一致的用户体验。同时, Egret 提供高效的 JS-C Binding 编译机制,满足你将游戏编译为原生格式的需求。

    灵感激发于Adobe Flash

    Adobe Flash 拥有完整的Web游戏工作流程,具有深度的开发者社区,一个出色的 ActionScript 语言和大量卓越的第三方游戏框架。这些都给与 Egret 引擎在开发中很多灵感。Egret 借鉴了很多来自ActionScript 的优点,站在巨人的肩膀上,踏上移动互联网的技术浪潮,为移动游戏领域贡献一份技术力量!