本文按时间倒序
前言
找死!《ios5 cocos2d游戏开发实战(第2版)》是objC写的,
项目用C++,肿么办?
老师说,改!那就改呗!
第5章 主要讲CCLayer的使用。
头文件部分
创建后的代码只有一点,大部分要自己写!
鲁迅说,为了忘却的纪念。
我们来纪念一下。
生成代码如下:
#ifndef __MyScenes04__GameLayer__
#define __MyScenes04__GameLayer__
#include <iostream>
#endif /* defined(__MyScenes04__GameLayer__) */
通常插入
#ifndef __MyScenes04__GameLayer__
#define __MyScenes04__GameLayer__
#include <iostream>
#include "cocos2d.h"
USING_NS_CC;
class GameLayer :public CCLaye{
public:
GameLayer();//构造函数
~GameLayer();//销毁方法,相当于dealloc
CREATE_FUNC(GameLayer);//这样层子类就默认有create方法了
virtual bool init();//实例方法,init,和objC不同,返回布尔值,
static CCScene *scene();//静态方法,对应的场景,场景是层的父容器
CCPoint gameLayerPosition;
CCPoint lastTouchLocation;
};
#endif /* defined(__MyScenes04__GameLayer__) */
多些废话,多些沟通
1)为什么要有scene静态方法呢?因为一个层正好对应一个场景嘛,场景加层,是层的父。添加场景,不是添加层,是添加层的父。有点像objC里面的控制器和View吧。为什么不继承自Scence呢?不知道。
2)注意,一旦 virtual bool init(); 必须按照上面结构返回bool,如果弄反了会报错。
接下来,一个个看实现。
cpp文件部分
方法惯例
1) C++的所有方法实现部分,都要加命名空间::fun
2)使用命名空间,using namespace cocos2d; 不然要敲全称,谁傻啊。
实例方法init
1) init的返回值不同:
objC是类实例自身(层
-(id) init.....return self;
bool FirstScene::init().....return true或者false
返回布尔值,最简是
bool BuildingController::init()
{
if (!CCLayer::init())
{
return false;
}
return true;
}
2) 生成方法不同:
objC是self初始化,C++写成父类的同名方法,实例的父类是层,所以写成CCLayer->init(),不是CCScene->create()方法。
if ((self = [super init]))
if (CCLayer::init()) {
CCLayer的原文件是,C++的布尔含义,理解成是否创建了,当没有时,创建,返回true, 没有创建时,返回false。
bool CCLayer::init()
{
bool bRet = false;
do
{
.......
// success
bRet = true;
} while(0);
return bRet;
}
3) 设置点击:C++是方法,用前缀set,不用前缀is——is表示属性布尔。
self.isTouchEnabled = YES;
this->setTouchEnabled(true);
代码惯例
1)CG开头的类,一律改成CC开头。比如CGSize==》CCSize
2)静态方法 [XX XX] 改成 XX::XX
3)实例方法 [xx XX] 改成 xx->XX();
4)[XX node] 改成 XX::create();
5)@"" 改成 ""
6)CGPointMake(...) 改成 ccp(...);
7)self 改成 this
8)[CCSprite spriteWithFile 改成 CCSprite::create
9)CCMoveBy actionWithDuration 改成 CCMoveBy::create
10)CCSequence actions 改成 CCSequence::create
11)[CCTouchDispatcher sharedDispatcher] 改成 CCDirector::sharedDirector()->getTouchDispatcher()
12)CCRectContainsPoint(node->boundingBox(), touchLocation); 改成 node->boundingBox().containsPoint(touchLocation);
13)[self schedule:@selector(countBullets:) interval:3]; 改成
典型错误
1)子类没有写触摸事件
2)没有写命名空间
正确是
创建地图
tileMap = CCTMXTiledMap::create("bigMap.tmx");