Fork me on GitHub

Unity3D截屏

Publish: November 1, 2014 Category: 游戏开发

void OnClick ()
{
    StartCoroutine(CaptureScreen());
}

IEnumerator CaptureScreen()
{
    yield return new WaitForEndOfFrame();

    Texture2D t = new Texture2D(Screen.width, Screen.height);
    //截取的区域,使用像素空间坐标 (0,0)是屏幕左下角
    t.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
    t.Apply();
    //把纹理数据转换为PNG格式
    byte[] bytes = t.EncodeToPNG();
    //保存
    System.IO.File.WriteAllBytes(Application.dataPath + "/" + Time.time + ".png", bytes);
}

主要用到了Texture2D.ReadPixels这个API,看一下来自ceeger的API说明

Texture2D.ReadPixels 读取像素
function ReadPixels (source : Rect, destX :
int, destY : int, recalculateMipMaps : bool = true) : void

Read screen pixels into the saved texture data.

读取屏幕像素信息并存储为纹理数据

This will copy a rectangular pixel area from the currently active
RenderTexture or the view (specified by /source/) into the position
defined by destX and destY. Both coordinates use pixel space - (0,0)
is lower left.

这将从当前处于激活状态的 RenderTexture
或视图(由/source/指定)复制一个由destX和destY指定的矩形像素区域。这两个坐标使用像素空间坐标 (0,0)是屏幕左下角。

If recalculateMipMaps is set to true, the mip maps of the texture will
also be updated. If recalculateMipMaps is set to false, you must call
Apply to recalculate them.

如果 recalculateMipMaps 设置为真,这个贴图的mipmaps就会更新

如果 recalculateMipMaps设置为假,你需要调用Apply重新计算它们

This function works only on ARGB32 and RGB24 texture formats. The
texture also has to have Is Readable flag set in the import settings.

这个函数只工作在格式为ARGB32 和 RGB24纹理上,另外这个纹理的导入设置需要设置为 Is Readable(可读)

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库的函数调用也是一样需要这样做的。