Fork me on GitHub

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.     } 

 

wmode为opaque或transparent不支持鼠标滚轮的解决

Publish: August 16, 2013 Category: as3/flash

在chrome等浏览器会有这个问题, 需要在html页面用js捕捉滚轮事件,然后传入到flash里面,难点是到flash之后该怎么办,我这里采用类类似冒泡的方式来触发事件。

js代码(参考自:http://www.denisdeng.com/?p=685)

  1. function wheel(obj, fn ,useCapture){ 
  2.   var mousewheelevt=(/Firefox/i.test(navigator.userAgent))? "DOMMouseScroll" : "mousewheel" 
  3.   //FF doesn't recognize mousewheel as of FF3.x 
  4.   if (obj.attachEvent) 
  5.   //if IE (and Opera depending on user setting) 
  6.   obj.attachEvent("on"+mousewheelevt, handler, useCapture); 
  7.   else if (obj.addEventListener) 
  8.   //WC3 browsers 
  9.   obj.addEventListener(mousewheelevt, handler, useCapture); 
  10.   function handler(event) { 
  11.     var delta = 0; 
  12.     var event = window.event || event ; 
  13.     var delta =  event.detail ?  -event.detail/3 : event.wheelDelta/120; 
  14.     if (event.preventDefault) 
  15.     event.preventDefault(); 
  16.     event.returnValue = false
  17.     return fn.apply(obj, [event, delta]); 
  18.   } 
  19.  
  20. function addMouseWheelListener(){ 
  21.   var target = document.getElementById('flashobjID'); 
  22.   wheel(target,callWheel); 
  23.  
  24. function callWheel(e,delta) { 
  25.   var target = document.getElementById('flashobjID'); 
  26.    if(target!=undefined && target && target.fireWheel) 
  27.      { 
  28.                  //调用flash的方法 
  29.          target.fireWheel(delta);   
  30.      } 
  31.  
  32. //页面加载完,附近鼠标事件侦听 
  33. window.onload = addMouseWheelListener; 

flash代码:

  1. ExternalInterface.addCallback('fireWheel', function(delta:int):void
  2.  
  3.   //获取当前鼠标下面的所有对象 
  4.   var arr:Array = stage.getObjectsUnderPoint(new Point(stage.mouseX, stage.mouseY)); 
  5.   if (arr.length == 0return
  6.   //只找最接近鼠标的那一层来触发就好了,底下的挡住了不管 
  7.   var obj:DisplayObject = arr[arr.length-1]; 
  8.   //从叶子节点,一层一层往根上找 
  9.   while (true
  10.   { 
  11.     if (obj is InteractiveObject) 
  12.     { 
  13.       var intobj:InteractiveObject = obj as InteractiveObject; 
  14.        
  15.       if (intobj is TextField) 
  16.       { 
  17.         //TextField似乎不接受外部触发的滚轮事件,只能暴力 
  18.         if ((intobj as TextField).mouseEnabled) 
  19.         { 
  20.           (intobj as TextField).scrollV -= delta; 
  21.         } 
  22.       } 
  23.       else if (obj.hasEventListener(MouseEvent.MOUSE_WHEEL)) 
  24.       { 
  25.         var me:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, falsefalse00, intobj); 
  26.         me.delta = delta; 
  27.         obj.dispatchEvent(me); 
  28.       } 
  29.     } 
  30.     if (obj == stage || (!obj.parent)) 
  31.     { 
  32.       break
  33.     } 
  34.     obj = obj.parent; 
  35.   } 
  36.  
  37. });