cocos2d 学习 第二章

1、“HelloWorld_prefix.pch”头文件的作用是给编译过程加速。

你应该把不常变化的框架(Frameworks)头文件添加到前缀头文件(prefix header)中。这样 的话,在编译的时候,框架的代码会被预先编译,所有的类都将可以使用这些 头文件。不幸的是,这样做也有一个缺点:如果前缀头文件里其中一个头文件 发生了变化,你的所有代码将会重新编译。这就是为什么你应该只添加那些极 少或者从来都不变化的头文件到前缀头文件中。 

#ifdef __OBJC__

      #import <Foundation/Foundation.h>
      #import <UIKit/UIKit.h>
      #import "cocos2d.h"

#endif 

2、AppDelegate类:用于处理程序的全局事件和状态变化。

 

它通过在特定时间点从 iOS 接收消息来追踪应用程序的状态变化。 例如,可以通过它来处理诸如用户接到来电或内存不足时应用程序需要采取的措施。 

每个 iOS 程序都有一个 AppDelegate 类用于实现 UIApplicationDelegate 协议。

AppDelegate 中 dealloc 方法存在一个奇怪的地方:这个方法不会被调用!任何在 AppDelegate 的 dealloc 方法中设置的断点都不起作用!这是正常的。当iOS 关闭一个程序时,它只是简单的把内存清空,以加快关闭的速度。这也是为什么 AppDelegate 的 dealloc 方法中的任何代码都不会被运行。你并不需要 手动调用 dealloc 方法以“解决这个问题”。如果你确实需要在程序关闭之前在 AppDelegate 中运行代码,你可以在 applicationWillTerminate 方法中运行代码。如果你的目标 iOS 是 4 或者更高的版本,你应该使用applicationDidEnterBackground。 

3、动画间隔(Animation Interval) 

动画间隔决定了cocos2d更新屏幕的频率。此设置影响游戏可以达到的最大帧率。 不过,动画间隔并不等于多少帧每秒。正相反,它表示的是cocos2d更新屏幕的 频率。这就是为什么它的参数是1.0/60 – 因为1除以60等于0.0167秒,这是在两次屏幕更新之间的时间间隔。 

在某些时候,把帧率设为30帧每秒可能更合适。对于那些很复杂的游戏,它们 的帧率可能在30和60帧每秒之间上下浮动的很厉害,设置一个低一点的帧率会 对这样的游戏有所帮助。当你设置了一个低一点的帧率,而且游戏可以稳定的 保持在这个帧率,用户的体验会比使用一个高一些但是不稳定的帧率要好很多人的感觉是很复杂的东西。

iOS设备不支持超过60帧每秒的帧率,它的屏幕刷新率被锁定在60帧每秒(Hz)。如果强迫cocos2d以超过60帧每秒的速度进行渲染,在最好的情况下可能会不产生任何效果。在最差的情况下,你的帧率可能反而会下降。如果你想让cocos2d运行在最快的帧率下,把动画间隔设置为1.0/60。 

启用 FPS 显示后,在屏幕的左下角将会显示一个小数字。这是你程序的运行帧 率,也就是每秒屏幕会被刷新的帧数。理想状态下,你的游戏应该运行在 60 帧每秒的帧率,特别是那些动作游戏。有一些游戏,比如大多数的益智游戏,30 帧每秒就可以满足要求。 

4、“HelloWorldLayer”类:包含了所有用于显 示Hello World标签的代码。 

cocos2d是使用了多个层级的CCNode对象来决定在什么地方显示什么内容的。

所有节点的基类都是CCNode类。它包含了位置信息,但是没有显示信息。它是所有其他节点类的父类,包括两个最基本的类:CCSceneCCLayer。 

 

CCScene 类是一个抽象概念,它仅用于根据对象的像素坐标把对象放置到场景中正确的位置。所以,CCScene 节点通常是整个 cocos2d 场景体系的根节点。多数时候只有一个运行着的场景,不过从一个场景过渡到另一个场景的情况是例外。 

CCLayer 类本身几乎没有什么功能,但它可用于接收触摸和加速计输入。 它常被用作 CCScene 的第一个子节点,因为每个游戏至少都会使用触摸输入的功能。

打开 HelloWorldLayer.h 头文件,你会看到 HelloWorldLayer 类派生自 CCLayer 类。那 么,CCScene 类在什么地方发挥作用呢?

由于 CCScene 类是抽象概念,因此创建场景的默认方式是通过类中的静态初始化方法 “+(id) scene”来完成的。该方法创建了一个普通的 CCScene 对象,并把 HelloWorldLayer 类的一个实例添加到刚创建的 CCScene 对象中。CCScene 几乎永远都是用这种方式创建并 使用的。下面列举一个通用的“+(id) scene”方法示例:

+(CCScene *) scene  // 首先运行它

{

  CCScene *scene = [CCScenenode];           // 定义一个场景 scene

  HelloWorldLayer *layer = [HelloWorldLayernode];    // 定义一个Layer

  [scene addChild: layer];                   // Layer加入 scene

  return scene;

}

首先,用 CCScene 类的静态初始化器“+(id) node”创建一个 CCScene 对象。然后用 同样的方法创建一个 HelloWorldLayer 对象,并把它添加到刚创建的 CCScene 对象中。最 后把这个 CCScene 对象返回给调用者。 

 5、在 Objective-C 中,我们 必须手动调用父类的 init 方法,该操作不会自动完成。我们之所以用 self 来接收返回值, 是为了防止返回值为 nil 的情况发生。 

-(id) init

{

  if ((self = [super init]))

  {

    CCLabelTTF* label = [CCLabelTTF labelWithString:@"Hello World"

                                      fontName:@"Marker Felt"
                                      fontSize:64];

    CGSize size = [[CCDirector sharedDirector] winSize];

    label.position = CGPointMake(size.width / 2, size.height / 2);

      [self addChild:label];
 }
return self;
}

CCLabelTTF 类使用 TrueType 字体在屏幕上绘制文本。 

CCLabelTTF 对象是通过它的一个静态初始化方法创建的,该方法会返回一个 新创建的 CCLableTTF 实例,并把该对象添加到自动释放池中。为了防止该对象在 init 方 法结束后从内存中释放,必须调用[self addChild:label]消息把它添加为 self 的子节点。同时, 该标签的 position 属性被设置为屏幕中央。注意,既可以在调用 addChild 方法前对 position 属性赋值,也可以在调用后进行赋值。 

 6、

CCNode 类的静态初始化方法是“+(id) node”。以下代码将向 self 发送 alloc 消息,这 等效于在 CCNode 的实现中调用[CCNode alloc]:

+(id) node

{

       return [[[self alloc] init] autorelease];
}

上面对 self 的调用方法更加普遍,而且对于 C++程序员来说应该也更容易接受。

现在可以用静态初始化方法来重写 CCNode 的生成方法。不出所料,代码变得很简洁: // allocate a new instance of CCNode

    CCNode* myNode = [CCNode node];
    // do something with myNode ...

这就是使用自动释放对象的妙处。你不必再记着给对象发送释放消息。每一次 cocos2d 进入下一帧,那些不再使用的自动释放对象将被自动地释放。但这样做也有一个缺点:如 果使用上述代码,然后在下一帧或者以后想要访问 myNode 对象时,你就会发现它已经不 在内存中了。如果这时发送消息给它,将导致程序出现 EXC_BAD_ACCESS 错误而崩溃。

简单地把 CCNode* myNode 变量当作类成员变量并不意味着对象使用的内存会被自动 保留下来。如果想在下一帧或者以后的帧中访问自动释放对象,就必须保留它。并且,如 果没有显式地将其添加为子节点,那么之后还是需要对其进行手动释放。

有一种可以更好地使用自动释放对象的方法,并且不需要显式地调用 retain 方法——可 以将生成的CCNode对象作为子节点添加到另一个派生自CCNode 的对象中,甚至可以删 除成员变量而直接依赖 cocos2d 来保存对象:

-(void) init
{

        myNode = [CCNode node];
        myNode.tag = 123;
        [self addChild:myNode];
    }
    -(void) update:(ccTime)delta
    {

    CCNode* myNode = [self getChildByTag:123];

        // do something with myNode
    }

 

7、iSimulate 应用程序(www.vimov.com/isimulate)是一个宝贵的开发工具,它允许 iOS 设 备向运行在 iOS 模拟器中的应用程序发送加速计、GPS、罗盘和多点触摸事件。 

8、CCLOG 宏对苹果的 NSLog 方法进行了封装,所以 CCLOG 只在调试构建时才被编译, 在发布构建时被删除。 



posted @ 2013-01-08 09:18  diablo大王  阅读(300)  评论(0编辑  收藏  举报