• 无法正确加载@2x的解决办法

    为使用retina显示,我们一般把图片的高分辨率版本存为@2x的形式,但是iOS 4.1以前的版本,如果使用imageWithContentsOfFile是无法保证@2x文件正确加载的。我使用如下方法解决此问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    // UIImage+Extras.h
    @interface UIImage (Extras)

    - (id)initWithContentsOfResolutionIndependentFile:(NSString *)path;
    + (UIImage*)imageWithContentsOfResolutionIndependentFile:(NSString *)path;

    @end

    // UIImage+Extras.m
    - (id)initWithContentsOfResolutionIndependentFile:(NSString *)path {
        if ( [[[UIDevice currentDevice] systemVersion] intValue] >= 4 && [[UIScreen mainScreen] scale] == 2.0 ) {
            NSString *path2x = [[path stringByDeletingLastPathComponent]
                                stringByAppendingPathComponent:[NSString stringWithFormat:@"%@@2x.%@",
                                                                [[path lastPathComponent] stringByDeletingPathExtension],
                                                                [path pathExtension]]];
           
            if ( [[NSFileManager defaultManager] fileExistsAtPath:path2x] ) {
                return [self initWithCGImage:[[UIImage imageWithData:[NSData dataWithContentsOfFile:path2x]] CGImage] scale:2.0 orientation:UIImageOrientationUp];
            }
        }
       
        return [self initWithData:[NSData dataWithContentsOfFile:path]];
    }

    + (UIImage*)imageWithContentsOfResolutionIndependentFile:(NSString *)path {
        return [[[UIImage alloc] initWithContentsOfResolutionIndependentFile:path] autorelease];
    }
     
  • pdf渲染的小窍门

    我们都知道,在iPhone/iPad显示pdf的基本方法有两个,一个是使用UIWebView直接加载pdf文件,另一个是使用Core Graphics进行渲染(姑且称之为CGPDF方法)。UIWebView的方法是简单,只需加载pdf,其他诸如放大翻页等问题通通交给UIWebView去头痛吧。但其缺点是性能较慢,功能有限,比如要实现搜索,添加笔记等功能就比较难。而使用CGPDF方法,功能就没有限制(虽然pdf解析方面,苹果提供的文档实在有限),使用Core Graphics进行渲染,性能上也比UIWebView要提高许多,只不过翻页,放大缩小等功能都需要自己实现。

    读文章 »

     
  • Cocos2d实现简单动画

    最近实在很忙,没有时间写整篇文章,就分享一下一些简单的实例吧。

    首先介绍一篇博客文章:cocos2d HOWTO系列之:如何创建帧动画。我初学cocos2d时就发现这篇文章,不过里面的一些内容已经过时了,所以自己又写了一个动画的例子。

    我把要点说一下:

    1. 制作动画需要的一系列动画图片(比如png文件)。要制作动画png,可根据上面介绍的文章使用Adobe Flash将fla转换为png。也可以使用一些免费软件,将swf转换为png。这里有一些软件:SpriteSheetCreator,SWFSheet,SWFToPNG。大家可以网上搜索一下。
    2. 生成png动画系列后,要将其整合成一个png(也就是所谓的sprite sheet)。这里使用的软件就是Zwoptex。使用此软件生成一个png和一个plist,plist记录了每个sprite的x,y,高,宽数据。Cocos2d支持Zwoptex生成的plist格式。不过遗憾的是最近Zwoptex开始收费了。这里提供以前的一个版本,也可以满足我们的要求。Zwoptex-0.4b10.app下载
    3. 我的程序就是播放一个电扇的动画,按一下就进行动画,再按一下动画就停止。我是修改了HelloWorld程序,添加了一个Object类进行动画处理。唯一要说明的是addSpriteFramesWithFile中要使用的路径是相对路径,我开始一直遇到问题就是因为使用了绝对路径。

    源代码下载

     
  • cocos2d-iphone 0.99.5 Xcode 静态库模板

    最近一个项目需要用到opengles,由于实在没有时间无法完成自己的引擎,因此开始对cocos2d-iphone引擎进行了研究。经过研究发现一个问题,其模板生成的项目每次都会把整个cocos2d的源代码拷贝进新项目中,这样每次cocos2d-iphone进行更新时都会带来麻烦,而且如果多个项目使用cocos2d-iphone,非常的不方便。我在网上搜索了一下,发现了了这个网站,介绍了怎样将cocos2d-iphone编译成静态库的方法,与我的想法不谋而合。不过该网站中的模板只适用于0.99.4,于是我修改了一下,让其可以运行于0.99.5。下面是主要步骤:

    1. 下载cocos2d-iphone 0.99.5 template模板。

    2. 解压到/$HOME/Library/Application Support/Developer/Shared/Xcode下

    3. 下载cocos2d-iphone 0.99.5,解压到你想要的地方。

    3. 在Xcode Preferences中找到Source Tree,输入新变量COCOS2D_SOURCE,让其指向cocos2d-iphone 0.99.5的源代码处。

    这样,下次你打开Xcode,你就可以使用我的模板创建cocos2d项目了(注意不要安装随cocos2d-iphone下载的模板),以后每次cocos2d-iphone进行更新,你仅仅需要修改COCOS2D_SOURCE变量(当然前提是cocos2d-iphone的编程接口没有改变)。

     
  • Cocos 2d基本概念

    开发cocos2d程序前有必要对一些基本概念进行介绍:


    • 场景(Scenes)
    • 主控器(Director)
    • 层(Layers)
    • 精灵(Sprites)



    读文章 »

     
  • CALayer简单教程

    前一阵子读到一篇介绍CALayer(这里简单地称其为层)的教程,比较简单易懂,适合初学者,我在这里就不完全翻译了,只是把要点说明一下。

    读文章 »

     
  • 怎样减小png图像文件的尺寸

    有两种方法:

    1. 直接使用preview打开png文件,然后选择”另存为”,覆盖原文件.
    2. 使用pngcrush开源软件,这种方法能使png文件更小,但由于pngcrush仅提供源代码需要自己编译.不过这也不是什么问题.

    编译pngcrush的步骤:

    1. 下载pngcrush
    2. 解压
    3. 编译.非常简单,使用
    4. make

    5. 进行编译
    6. 复制到用户bin目录下
    7. sudo mv pngcrush /usr/local/bin/

    使用pngcrush也非常简单,例如:

    pngcrush -reduce -brute -d output image.png image.png

    就是将图像文件image.png减小尺寸,输出到output目录下.非常遗憾,pngcrsh并不支持目录操作.不过反正有源代码,自己改一下也不是什么大问题吧?

     
  • Open source CoverFlow

    使用OpenGL ES的开源Cover Flow,据说有好几个上架程序中都有使用,见http://www.chaosinmotion.com/flowcover.m

     
  • 不通过App Store发布程序

    在一些情况下,我们需要不通过App Store发布程序,比如:


    1. 发布前的测试
    2. 企业内部自用软件,不需要发布到App Store


    非正规的做法当然是“越狱”,但是更为正式的做法是使用Ad-Hoc。至于怎样创建Ad-Hoc provision文件,不在本文讨论的范围内。本文讨论的是怎样安装Ad-hoc发布的程序。通常的做法是:


    1. 开发者将Xcode编译的Ad-Hoc程序.app文件压缩后与.mobileprovision一起传给用户。
    2. 用户拖动.mobileprovision文件到iTunes下的资料库应用程序
    3. 将压缩的.app文件解压,然后将整个.app文件夹拖动到iTunes下的资料库应用程序


    通常这对于Mac用户没有什么问题,但有时Windows用户会遇到一些问题。所以更好的做法是将.app制作成.ipa与.mobileprovision文件一同寄给用户。下面是制作ipa的步骤:


    mkdir Payload
    cp -rp MyApplication.app Payload/
    zip -r MyApplication.ipa iTunesArtwork Payload
    


    需要注意的是这里使用的是zip命令而不是Find中“Compress”选项,因为它会添加一些额外的内容。另外iTunesArtwork是一个512×512的png文件(注意无后缀),它将在iTunes中增加一个图标,所以这并不是必需的。

     
  • 从零开始学习OpenGL ES之七 – 变换和矩阵

    今天的主题是我一度谈之色变的。概念上讲,它是3D编程中最为困难的部分。


    首先,你应该理解 3D 几何和笛卡尔坐标系他。你还应该理解由顶点构成的三角形组成的OpenGL虚拟世界的物体,各顶点定义了三维空间的特定点,你还应理解怎样使用这些信息在 iPhone上使用OpenGL ES进行绘制。如果你不理解这些概念,我建议你回头再看看我的前六篇文章。


    为在交互式程序如游戏中使用这些虚拟世界中的物体,必须要有一种方法来改变物体间的相对位置以及物体与观察者之间的相对位置。要有一种方法不但可以移动,而且可以旋转和改变物体的大小。

    还必须要有一种方法将虚拟的三维坐标转换成电脑屏幕的二维坐标。所有这些都是通过所谓变换来实现的。实现变换的内部机制是就是矩阵


    尽管你不需要懂得太多有关矩阵和矩阵的数学知识就可以实现许多OpenGL的功能,但对这些观念的基本理解有很大的帮助。

    读文章 »