Fork me on GitHub

android开发tips

Publish: August 28, 2015 Category: 未分类内容

最近又折腾上安卓了,开发了两个APP,相比于iOS,android的开发还是感觉更容易一点。界面layout xml非常强大。
我整理一些网上比较难找到,或者自己琢磨出来的一些经验在这个文章里列出来,不定期更新(可能就不更新了。。。)

列出系统内所有歌曲

//返回歌曲id列表
public List<Integer> querySongs(Context context) {
    ArrayList<Integer> list = null;
    String[] columns = { MediaStore.Audio.AudioColumns._ID
            ,MediaStore.Audio.AudioColumns.IS_MUSIC};  
    
    Cursor c = context.getContentResolver().query(  
            MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, columns, null,  
            null, null);  
  
    list = new ArrayList<Integer>();
    while (c.moveToNext())  
    {  
        if(c.getInt(1) != 0) {
            list.add(c.getInt(0));  
        }
    }
    return list;
}

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

Unity在非PC平台提示找不到某些IO函数的解决

Publish: June 12, 2015 Category: 游戏开发

unity5在为ios打包资源的时候,提示:

 error CS0117: `System.IO.File' does not contain a definition for `WriteAllBytes'

很奇怪的问题,后来自己写了读写函数,解决!

    /// <summary>
    /// 擦写文件(用于替换系统File的同名静态方法)
    /// </summary>
    /// <param name="file"></param>
    /// <param name="data"></param>
    /// <param name="offset"></param>
    /// <param name="length"></param>
    public static void WriteAllBytes(string file,byte[] data,int offset = 0,int length = -1)
    {
        if (length == -1) length = data.Length - offset;
        FileStream fs = new FileStream(file, FileMode.Create);
        BinaryWriter w = new BinaryWriter(fs);
        w.Write(data,offset,length);
        w.Flush();
        w.Close();
        fs.Close();
    }

    /// <summary>
    /// 读取文件(用于替换系统File的同名静态方法)
    /// </summary>
    /// <param name="file"></param>
    /// <param name="data"></param>
    /// <returns></returns>
    public static byte[] ReadAllBytes(string file)
    {
        FileStream fs = new FileStream(file, FileMode.Open);
        BinaryReader r = new BinaryReader(fs);
        byte[] data = r.ReadBytes((int)fs.Length);
        r.Close();
        fs.Close();
        return data;
    }

Hello2D——一个小巧的图形渲染引擎

Publish: April 28, 2015 Category: project,C/C++

项目开源地址:https://github.com/play175/Hello2D

简单的2D图形渲染引擎(目前采用CPU渲染),主要有以下特点

  • gnu99标准纯C,无其他依赖库
  • 从Unity3D受到启发,采用组件装饰板设计,某个节点上,需要实现什么功能就加什么功能组件
  • 采用优化的脏矩形重绘机制
  • 支持跨平台,只需要简单修改外围窗口相关代码
  • 支持lua(开发中)
  • 暂时没想到。。。

感谢以下给我启发的项目:

Unity3D、iOS UIKit、EJoy2D、Flash AS3 Core、nothings/stb、以及互联网极具分享精神的网友

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

Unity3D截取物体快照

Publish: April 7, 2015 Category: C#,游戏开发

静默截取物体快照,物体可以放在任意位置,不影响屏幕显示。和之前那个截屏不同,这次使用了RenderTexture。其中难点在于,要把相机放到合适的位置才能观察到物体的全貌,具体可以看代码注释。
另外有个技巧,如果不想要背景和其他物体,只要该物体的截图,可以在调用前把物体放置到一个非常远的位置(比如世界坐标y=-1000),调用完后再恢复位置。

/// <summary>
/// 保存物体快照到PNG文件
/// </summary>
/// <author>yoyo(http://yoyo.play175.com)</author>
/// <param name="targetObject">需要快照的物体</param>
/// <param name="filePath">文件路径</param>
/// <param name="imageSize">照片像素大小(正方形照片)</param>
public static void SnapshotToFile(GameObject targetObject,string filePath,int imageSize = 256)
{
    Camera cam = Camera.main;

    //记录相机位置
    Vector3 opos = cam.transform.position;
    Vector3 oscale = cam.transform.localScale;
    Quaternion orot = cam.transform.localRotation;

    //计算物体包围盒
    Renderer[] renderers = targetObject.GetComponentsInChildren<Renderer>();
    Vector3 min = targetObject.transform.position, max = targetObject.transform.position;
    for (int i = 0; i < renderers.Length; i++)
    {
        min = Vector3.Min(renderers[i].bounds.min, min);
        max = Vector3.Max(renderers[i].bounds.max, max);
    }

    //把相机放到合适位置
    Vector3 center = new Vector3((max.x + min.x) / 2, (max.y + min.y) / 2, (max.z + min.z) / 2);//中心点
    Vector3 step = (max - center).normalized;//相对于中心点的单位向量

    //先放到中心点的前右上角
    cam.transform.position = center + step;
    //拉到合适距离
    cam.transform.position = cam.transform.position + step * (max - min).magnitude * 50 / cam.fieldOfView;
    //旋转方向以便看到目标
    cam.transform.LookAt(center);

    RenderTexture rt = new RenderTexture(imageSize, imageSize, 24);
    cam.targetTexture = rt;
    cam.Render();

    RenderTexture.active = rt;//关键点,有点类似make current 的意思

    Texture2D t = new Texture2D(imageSize, imageSize, TextureFormat.RGB24, false);//false代表不需要使用mipmaps
    t.ReadPixels(new Rect(0, 0, imageSize, imageSize), 0, 0);

    RenderTexture.active = null;//置空,以免出错
    GameObject.Destroy(rt);

    //恢复相机位置
    cam.targetTexture = null;
    cam.transform.position = opos;
    cam.transform.localScale = oscale;
    cam.transform.localRotation = orot;

    //转为png数据
    byte[] b = t.EncodeToPNG();
    GameObject.Destroy(t);
    
    //保存文件
    System.IO.File.WriteAllBytes(filePath, b); 
}

//调用举例:SnapshotToFile(gameobj, Application.dataPath + "/snap.png");

Swfdump——从内存中提取swf的工具

Publish: March 30, 2015 Category: project,as3/flash

刚刚整理代码时发现以前写的从进程的内存镜像中提取swf文件的工具,现在分享出来,希望能帮到有需要的朋友。
这个小工具是命令行使用,没有界面,可以很方便的从指定进程中(比如浏览器,swf播放器等等),按swf的文件头标识来提取解压后的swf文件.
在swf运行过程中,不论zlib压缩(cws)还是lzma压缩(zws)的swf文件,在内存中都会被解压成fws的格式,所以除非你的as3代码经过混淆或者使用内存欺骗的技巧,否则一般加密方式对于这种内存提取swf的方案都是徒劳,轻松可以获取as3代码和图片资源。

工具名称:swfdump
工具功能:从进程中读取swf
使用说明:swfdump.exe 进程名
示例:swfdump.exe chrome.exe
作者:yoyo(http://yoyo.play175.com)

下载地址:swfdump.zip (47KB,来自:http://yoyo.play175.com

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

GLFW 3.x的MAKEFILE脚本(mingw)

Publish: March 28, 2015 Category: C/C++

下载下来的GLFW需要使用CMAKE编译,但我电脑上只有mingw环境,所以把CMAKE的脚本翻译成MAKEFILE,希望对你有用!

APP = simple
OBJS = src/context.o src/init.o src/input.o src/monitor.o src/window.o  \
    src/win32_init.o src/win32_monitor.o src/win32_time.o src/win32_tls.o \
    src/win32_window.o src/winmm_joystick.o src/wgl_context.o \
    examples/simple.o

INCLUDE = -I. -I./include -I./deps 
LIB = -L. -lopengl32 -lgdi32 -lglu32

CFLAGS = -std=gnu99 -DWIN32 -D_GLFW_USE_OPENGL -D_GLFW_WIN32 -D_GLFW_WGL -DUNICODE
WARNS = -Wno-unknown-pragmas -Wl,--subsystem,console
LDFLAGS = ${LIB} ${WARNS}

all: ${APP}.exe

${APP}.exe : ${OBJS}
    ${CC} -o $@ ${OBJS} ${LDFLAGS}

clean :
    $(RM) src/*.o -f
    $(RM) examples/*.o -f

%.o : %.c ${HEADERS}
    ${CC} ${CFLAGS} ${INCLUDE} -c $< -o $@

求数组中前两个最大数的算法

Publish: March 27, 2015 Category: C/C++

前段时间在捣鼓图像二值化的时候学到的算法(来源网页已经找不到了,,,汗),然后自己优化了一下(后面会再写一篇文章记录一下图像二值化的各种算法)。

#include <stdio.h>

void max2index(int *arr, int n, int *first_idx, int *second_idx) {
    //第 0 个最大数,第 1 个次大数
    int max2idx[2] = { 0 ,-1};//考虑两个以上相同最大数,只取第一次匹配到的数
    //int max2idx[2] = { 0 ,0};//如果不需要考虑有两个以上相同最大数
    int i;
    for(i = 1; i < n; ++i) {
        //printf("%d,%d,%d,%d\n",i,arr[i],max2idx[0],max2idx[1]);
        if(arr[i] > arr[max2idx[0]]) {
            //如果比最大数还要大,则最大数取它,之前的最大数移入次大数
            int t = max2idx[0];
            max2idx[0] = i;
            max2idx[1] = t;
        } else if (arr[i] < arr[max2idx[0]]){
            if (-1 == max2idx[1] || arr[i] > arr[max2idx[1]]) {
                //如比最大数小:如次大数没有设置,则设为次大数;否则比次大数大才设为最大数
                max2idx[1] = i;
            }
        }
    }
    *first_idx = max2idx[0];
    if(max2idx[1] == -1) max2idx[1] = max2idx[0];//如果数组全是一样的数的情况,次大数则为没设置状态
    *second_idx = max2idx[1];
}

void printarr(int *arr,int n) {
    while(n-- > 1)printf("%d,",*(arr++));
    printf("%d\n",*arr);
}

int main() {
    int arr[] = {10,2,3,4,5,6,7,8,9,10};
    //int arr[] = {1,1,1,1,1,1,1,1,1,1};
    printarr(arr,10);

    int first_idx,second_idx;
    max2index(arr,10,&first_idx,&second_idx);
    printf("first index:%d,second index:%d\n",first_idx,second_idx);
    printf("first:%d,second:%d",arr[first_idx],arr[second_idx]);
}

大文件快速分析和查找

Publish: March 17, 2015 Category: C/C++

有时候有这种需求,需要从一个二进制大文件中查找是否有某种格式的文件,由于大文件是二进制,且非常大,几百M,一般的手工查找方式不太现实了。可以可以通过代码来遍历二进制,查找是否有该文件格式的关键字数据(一般文件头都会有标识,比如dds文件首三个字节是DDS,png、jpg、swf等文件都会有自己的标识头)。

关于搜索算法,我一开始想到的是字符串匹配算法,Google了一下,关于字符串匹配算法有很多种,其中称为Sunday的算法速度非常快,且非常容易理解。关于该算法的具体实现,可以查看本文末尾提供的参考资料,特别是那个PPT,看那个例子非常浅显明了。

字符串匹配算法只能从固定长度内存中匹配,几百M几G的文件不可能一次性全部读取到内存中,所以我使用了分块读取,而在读取下一块文件时,文件指针向后滑动一个窗口,重叠读取,避免这部分内容漏掉匹配。

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

不重复随机数列的生成即随机打乱一个数组的算法

Publish: December 11, 2014 Category: 未分类内容

假设一个长度为10的数组arr:

1,2,3,4,5,6,7,8,9,10

假设m=10
1、用系统随机函数得到一个小于m的随机数n
2、将arr[n]和数组最后一个元素即下标m-1所在的元素arr[m-1]交换,并将m减1
3、依次进行1、2这样的循环操作,直到m=0时终止操作

假设第 1 次操作后,倒数第 1 个和随机到的第 5 个元素交换:

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

关于汉堡包图标的一点收集

Publish: December 5, 2014 Category: 未分类内容

先留个坑,有时间了补上。。。
就是这个图标:
hamburger.gif

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