Fork me on GitHub

XCODE快速开发ANE步骤和一些常见错误的解决

Publish: September 5, 2014 Category: as3/flash

使用adobe air制作的移动应用,在对接第三方平台的时候,需要使用ANE来包装本机代码,在对接过程中,我积累了一些打包ANE的经验,记录下来,希望对看到的人有些帮助。
吐槽一下,ANE太难对付了,各种坑,调试也比较麻烦。

1、安装mac版本的AIR SDK
下载地址:http://www.adobe.com/devnet/air/air-sdk-download-mac.html

2、安装xcode的ANE项目模板(好东西~)
下载地址:https://github.com/divijkumar/xcode-template-ane

»» 点击浏览全文 »»»»»»

C#简单实现泛型数组QSort

Publish: September 1, 2014 Category: C#

Talk is cheap,show me the code

public class UIPanel
{
    public int depth;
}

public class Test
{
    /***************快速排序功能****************/
    public delegate int QSortCompareFunction<T>(T a,T b);
    public static void QSort<T>(T[] array,QSortCompareFunction<T> compareFunc)
    {
        //排序算法: 插入排序
        for(int i = 1; i < array.Length; i++)
        {  
            T t = array[i];  
            int j = i;
            while( (j>0) && compareFunc(array[j-1] , t) > 0 )
            {
                array[j] = array[j-1];
                --j;
            }
            array[j] = t;
        }
    }
    /************快速排序功能结束***************/

    static int UIPanelSortBy(UIPanel a,UIPanel b)
    {
        if(a.depth > b.depth)return 1;
        if(a.depth < b.depth)return -1;
        return 0;
    }

    static void PrintArray(UIPanel[] panels)
    {
        System.Console.Write("[");
        for(int i = 0; i < panels.Length; i++)
        {
            if(i != 0)System.Console.Write(",");
            System.Console.Write(panels[i].depth);
        }
        System.Console.Write("]\n");
    }

    static void Main(string[]args)
    {
        UIPanel[] panels = {
            new UIPanel(){depth = 6},new UIPanel(){depth = 2},new UIPanel(){depth = 1}
            ,new UIPanel(){depth = 4},new UIPanel(){depth = 5},new UIPanel(){depth = 3}
            ,new UIPanel(){depth = 2},new UIPanel(){depth = 5},new UIPanel(){depth = 7}
        };

        PrintArray(panels);

        QSort<UIPanel>(panels,UIPanelSortBy);

        PrintArray(panels);
    }
}

PNG2JPG——一种在保留透明度的前提下压缩PNG为JPG的工具

Publish: August 30, 2014 Category: project

工具名称:png压缩工具
使用说明:命令行方式使用,如:png2jpg.exe a.png b.png c.png
(或可直接拖动多个png到图标上)
---by yoyo(http://yoyo.play175.com)

png格式因为是无损压缩,所以文件相比于jpg格式会大很多,而jpg把对人眼不太敏感的像素去除,可以把图片压缩的很小,而jpg的缺陷就是没有alpha通道,不能作为半透明图片的存储格式。
我采用了网上广为流传的一种处理方式,那就是把RGB通道使用JPG压缩,然后再把alpha通道使用JPG压缩,放到一张2倍大小的图片里。
在使用时,代码中把RGB和alpha通道合起来,就得到了我们需要的半透明图片了。

未处理前PNG大小:8.36KB
1.png

处理后JPG大小:4.22KB
1_png.jpg

可以看到图片存储所需空间缩小了一倍,图片越大,压缩效果越明显。

下载地址:png2jpg.zip

JPG2PNG——jpg转png命令行工具

Publish: August 30, 2014 Category: project

工具名称:JPG转PNG工具(jpg2png.exe)
使用说明:命令行方式使用,如:jpg2png.exe a.png b.png c.png
(或可直接拖动多个文件到图标上)
---by yoyo(http://yoyo.play175.com)

这款工具可以去除jpg图片中的黑色背景,并以增加模式改善图片原有的通道亮度,在提取游戏中的特效资源中,这款工具非常有用。

转换前jpg图片:

jpg2png-1.jpg

转换后png图片:

jpg2png-2.jpg

下载地址:jpg2png.zip

ICO2PNG——ico图标转png图片小工具

Publish: August 30, 2014 Category: project

工具描述:ico转PNG工具(ico2png.exe)
使用说明:只支持命令行方式使用,如:ico2png.exe a.ico b.ico c.ico
(或可直接拖动多个文件到图标上)
---by yoyo(http://yoyo.play175.com)

可以把ico文件中的所有格式的图标转为png图片存储到ico文件所在的目录下,如下图所示:

ico2png.jpg

下载地址:ico2png.zip

adobe AIR iOS/Android app 设置不允许旋转屏幕

Publish: July 25, 2014 Category: as3/flash

代码如下:

stage.autoOrients = false;
stage.setOrientation(StageOrientation.ROTATED_LEFT);
stage.setAspectRatio(StageAspectRatio.LANDSCAPE);

FlashDevelop不能在64位系统启动调试的解决方案

Publish: June 23, 2014 Category: as3/flash

FlashDevelop不能在64位系统启动调试,查看输出,报错如下:

Debugger startup error. For troubleshooting see: http://www.flashdevelop.org/wikidocs/index.php?title=F.A.Q
Error details: System.BadImageFormatException: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
在 net.sf.jni4net.jni.JNI.Dll.JNI_GetDefaultJavaVMInitArgs(JavaVMInitArgs* args)
在 net.sf.jni4net.jni.JNI.Init()
在 net.sf.jni4net.jni.JNI.CreateJavaVM(JavaVM& jvm, JNIEnv& env, Boolean attachIfExists, String[] options)
在 net.sf.jni4net.Bridge.CreateJVM()
在 net.sf.jni4net.Bridge.CreateJVM(BridgeSetup setup)
在 FlashDebugger.DebuggerManager.Start(Boolean alwaysStart)

点进:http://www.flashdevelop.org/wikidocs/index.php?title=F.A.Q#Does_FD_run_in_64-bit_systems.3F,找到如下信息:

Does FD run in 64-bit systems?
Yes, but requires Java 1.6+ 32-bits to be installed.

所以,解决方案:
1、安装32位的jre,且版本需要至少1.6以上;
2、安装之后重新启动flashdevelop;
3、如果还不行,请查看系统环境变量里的JAVA_HOME是不是设置对了,它应该被设置成(最后的jre7取决于你安装的jre版本):

C:\Program Files (x86)\Java\jre7

env_jre.png

从swf中提取图片

Publish: November 13, 2013 Category: project,as3/flash

 闪客精灵和asv都可以从swf中提取图片,但是图片和导出as类链接的对应关系没有导出,最近看了一下swf文件格式,除了doabc代码比较复杂,其他tag导出还是比较简单的,swf中和图片关联的tag有:DefineBitsLossless,DefineBitsJPEG2,DefineBitsLossless2,DefineBitsJPEG3,参照了网上其他开源项目的代码,用C写了一个工具:swfread.exe,代码写的比较乱,等后面整理一下再放出来,后面会增加替换swf中图片,和增加图片到swf的功能,主要是doabc比较头疼。

11月15日更新:支持中文类名

12月25日更新:支持zws为标识的lzma压缩算法

工具名称:提取swf中的图片
使用说明:swfread.exe a.swf b.swf c.swf
(或可直接拖动多个swf到图标上)

附件下载:swfread.zip(133KB)

 (注意:本程序并没有病毒或其他破坏性的代码,请注意chrome浏览器中下载时会提示:不是常见的下载类型,可能存在危险)

zlib出现Z_BUF_ERROR的原因

Publish: November 8, 2013 Category: C/C++

  1. uncompress (Bytef *dest,   uLongf *destLen, 
  2.                                    const Bytef *source, uLong sourceLen) 

 zlib出现Z_BUF_ERROR的原因是输出缓冲区不够大,那么zlib怎么判断输出缓冲区,就是通过destLen参数来判断的,这个destLen的用法很特别,它既用来表示你给输出缓冲区分配了多大,又通知你它最终输出的结果是多大,所以,在调用这个函数之前一定要把destLen赋值为dest的大小,而不能默认为0

对于lzma库的函数调用也是一样需要这样做的。

AS3从未知编码的二进制流中自适应编码读取文本

Publish: September 9, 2013 Category: as3/flash

给你一个文件或者二进制,不知道编码是gb2312还是utf8的情况下怎么正确读取出文本呢?

以下代码是as3的,其他编程语言只要稍微改动一下即可。

上代码,请直接用!

(感谢C++ BLOG提供的判断utf8的方法:http://hi.baidu.com/xingyan126/item/4abec1c1c2143755bcef6956)

  1. /** 
  2.  * 从未知编码的二进制流中读取文本 
  3.  * @param   ba 
  4.  * @param   len 读取长度,默认为-1,则读取至文件尾 
  5.  * @return 
  6.  */ 
  7. public static function readString(ba:ByteArray,len:int = -1):String 
  8.     if ((len != -1 && len > ba.bytesAvailable) || (len == -1)) len = ba.bytesAvailable; 
  9.     var encode:String = 'gb2312'
  10.     //先判断头三个字节是不是utf bom 
  11.     if (ba.bytesAvailable >= 3
  12.     { 
  13.         //0xEF 0xBB 0xBF 
  14.         var chkarr:Array = []; 
  15.         var a:int = 0xffffffEF
  16.         var b:int = 0xffffffBB
  17.         var c:int = 0xffffffBF
  18.         chkarr.push(ba.readByte()); 
  19.         chkarr.push(ba.readByte()); 
  20.         chkarr.push(ba.readByte()); 
  21.         if ((chkarr[0] == a && chkarr[1] == b && chkarr[2] == c)) 
  22.         { 
  23.             //utf-8 bom 
  24.             encode = 'utf-8'
  25.             return ba.readMultiByte(len - 3, encode); 
  26.         } 
  27.         else 
  28.         { 
  29.             ba.position -= 3
  30.         } 
  31.     } 
  32.      
  33.     //逐个字节判断是否有UTF8的编码 
  34.     if (isUTF8(ba, len)) 
  35.     { 
  36.         encode = 'utf-8'
  37.     } 
  38.      
  39.     return ba.readMultiByte(len - 3, encode); 
  40.  
  41. /** 
  42.  * 判断文本是否是UTF8编码 
  43.  * @param   ba 
  44.  * @param   len 读取长度,默认为-1,则读取至文件尾 
  45.  * @return 
  46.  */ 
  47. public static function isUTF8(ba:ByteArray,len:int = -1):Boolean 
  48.     if ((len != -1 && len > ba.bytesAvailable) || (len == -1)) len = ba.bytesAvailable; 
  49.     var score:int = 0
  50.     var i:int
  51.     var goodbytes:int = 0, asciibytes:int = 0
  52.     // Maybe also use UTF8 Byte Order Mark: EF BB BF 
  53.     // Check to see if characters fit into acceptable ranges 
  54.     var oldpos:int = ba.position; 
  55.     var byte:int, byte1:int, byte2:int
  56.     var curlen:int = len; 
  57.     while(curlen>0
  58.     { 
  59.         ba.position = oldpos + (len - curlen); 
  60.         byte = ba.readByte(); 
  61.         curlen -= 1
  62.         if (curlen >= 1) byte1 = ba.readByte(); 
  63.         if (curlen >= 2) byte2 = ba.readByte(); 
  64.          
  65.         //0x7f = 127 = 01111111 
  66.         if ((byte & 0x7F) == byte)  
  67.         {  
  68.              // 最高位是0的ASCII字符 
  69.              asciibytes++; 
  70.              // Ignore ASCII, can throw off count 
  71.         }  
  72.         else if (-64 <= byte && byte <= -33 
  73.              //-0x40~-0x21 
  74.              && // Two bytes 
  75.              curlen >= 1 && -128 <= byte1 
  76.              &&  
  77.              byte1<= -65)  
  78.         { 
  79.              goodbytes += 2
  80.              curlen -= 1
  81.         }  
  82.         else if (-32 <= byte 
  83.             && byte <= -17 
  84.             && // Three bytes 
  85.             curlen >= 2 && -128 <= byte1 
  86.             && byte1 <= -65 && -128 <= byte2 
  87.             && byte2 <= -65)  
  88.         { 
  89.             goodbytes += 3
  90.             curlen -= 2
  91.         } 
  92.     } 
  93.      
  94.     ba.position = oldpos; 
  95.      
  96.     if (asciibytes == len)  
  97.     { 
  98.         return false
  99.     } 
  100.     score = 100 * goodbytes / (len - asciibytes); 
  101.     // If not above 98, reduce to zero to prevent coincidental matches 
  102.     // Allows for some (few) bad formed sequences 
  103.     if (score > 98) { 
  104.         return true
  105.     } else if (score > 95 && goodbytes > 30) { 
  106.         return true
  107.     } else { 
  108.         return false
  109.     }