• OpenGL ES粒子发生器

    译者注:此代码虽然有这样那样的问题,但仍然值得参考。

    IMG_0038

    我在360 iDev会议中汇总了粒子发生器的代码。由于我又要开始进行有收入的工作所以我必须将之处之高阁了,但我准备在这里分享给有兴趣者。

    IMG_0020

    首先,我要说我并不是一个OpenGL的专家,我撰写此文能够帮助我更好地学习OpenGL 和粒子系统,所以可以肯定还有很多地方需要改进。

    IMG_0038

    其次,此代码还有许多bug,并不适用于最终产品。最重要的一个bug是试图释放粒子时造成的死循环。粒子内存没有被释放,它不断被重用。有两个链接表,一个用于保存可见的粒子,另一个保存不再可见的粒子。当一个粒子生存期到达时,它将被从一个列表移动到另一个。当需要一个新的粒子时,就从列表中提取一个。此方法可以避免不断的内存分配和释放的开销 。但是,当粒子发射后,我需要一个选项来释放内存,现在它会造成死循环。

    IMG_0005

    第三,示例程序将所有的发生器放入一个数组中。当你轻触屏幕时,当前发生器会停止发射,下一个发生器开始启动。当最后一个发生器结束时,第一个发生器循环启动。此时,会遇到pthread锁竞争问题,两个线程会等待另一个线程,引起程序锁住。由于我并非手工建立线程,所以跟踪此问题可能有相当的难度。

    IMG_0004

    可在Google Code project 下载。如果你不想使用subversion,你也可以直接下载zip文件Particles_03_06_2008.

     
  • iPhone 3.0新特性系列教程之四 – 临近监测

    去年当Google发布了一款iPhone应用程序时引起了一段辩论:他们的程序使用了未公开的API来检测是否电话靠近说话者的耳朵。

     

    而在iPhone 3.0 SDK中,此API可以被任何程序使用了。本文展示怎样使用此API:

     

    读文章 »

     
  • 跨平台代码分享之三 – XML解析器

    XML格式使用越来越广泛,不论是游戏还是普通应用软件都有使用。而我喜欢用xml作为配置文件。XML解析的方法实在很多,最根本的两种是SAX和DOM。SAX需要一边读取文件一边解析,速度较快;而DOM采用树状结构保存解析文件,使用方便。iPone自带的XML解析器一则无法跨平台,一则使用不便,还有一些bug(我是指SDK 2.0,新版本SDK 3.0的XML解析器没用过,所以没有发言权),所以我决定使用其他开源XML解析器。开源的XML解析器也有很多种,比如libxml2,TouchXML(iPhone版),tinyxml等。其中tinyxml简单易用,如果你不要求诸如DTD等功能,那么tinyxml绝对应该是你的首选。我采用的是ticpp(tinyxml的cpp版本,采用DOM方法)。

     

    读文章 »

     
  • iPhone 3.0新特性系列教程之一 – 使用UIPasteboard复制/粘帖

    今天的主题是怎样读/写粘帖板。

     

    读文章 »

     
  • 运行系统应用程序

    iPhone集成了许多应用程序,比如说浏览器,email,电话拨号等,但怎样在你的应用程序中调用这些程序呢?简单的方法是使用openURL。方法如下:

    1. 打开网页:

    1
    2
    [[UIApplication sharedApplication]
        openURL:[NSURL URLWithString:@"http://www.iphone-geek.cn"]];

    2. 拨号:

    1
    2
    [[UIApplication sharedApplication]
        openURL:[NSURL URLWithString:@"tel://13788102299"]];

    3. SMS:

    1
    2
    [[UIApplication sharedApplication] openURL:
        [NSURL URLWithString:@"sms:13312345678"]];

    4. Email:

    1
    2
    3
    [[UIApplication sharedApplication]
        openURL:[NSURL URLWithString:
        @"mailto:emailAdress?subject=你好&body=我的邮件"]];
     
  • 最简单的获取文档目录的方法

    应该不需要解释了吧。见以下代码:

    1
    2
    NSString * docs = [NSHomeDirectory()
           stringByAppendingPathComponent:@"Documents"];
     
  • UILabelz子类 – 随意对齐文本

    有人问到怎样正确地对齐UILabel的文字。他们需要UILabel容纳多行文本,但也需要调整文本,他们遇到的问题是单行文本在垂直方向总是居中对齐。 

     

    读文章 »

     
  • 代码段 – NSTimer示例

    简介

     

    今天我们带来的是一个有关NSTimer的小项目。我们将要建立一个赛马的应用程序。我们将在屏幕下方创建一个由6个带有蓝色背景色的小UIView方框组成的视图,然后使用定时器随意移动其中一个任意的距离。开动!

    读文章 »

     
  • 怎样从core graphics获取UIImage

    从core graphics获取UIImage的方法:

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    - (void)viewDidLoad
    {
        [super viewDidLoad];

        UIGraphicsBeginImageContext(CGSizeMake(20,20));
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextBeginPath(ctx);
        CGContextAddArc(ctx, 10, 10, 10, 0, 2*M_PI, 1);
        CGContextSetRGBFillColor(ctx, 1,0, 0, 1);
        CGContextFillPath(ctx);
        UIImage *redBall = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        UIImageView *redBallView = [[UIImageView alloc] initWithImage:redBall];
        redBallView.center = CGPointMake(160,330);
        [self.view addSubview:redBallView];
    }