#
hello world项目之后,接着需要自己开发游戏了,涉及到的东西比较多,一些常用的基础知识整理,同时也是对原来学过的知识总结。
vs2010 + cocos2d-2.1beta3-x-2.1.1 项目结构
AppDelegate.cpp的 applicationDidFinishLaunching() 方法
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
// turn on display FPS
pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
pDirector->setAnimationInterval(1.0 / 60);//帧率
// create a scene. it's an autorelease object
CCScene *pScene = HelloWorld::scene();//初始场景
// run
pDirector->runWithScene(pScene);
return true;
}
获得导演(单例),设置了opengl、帧率,设置了初始的启动场景
HelloWorldScene.h 的一些成员
public:
cocos2d::CCSprite* target ;
void myDefine(CCNode* who);
void createTarget();
void gameLogic(float dt);
// CClayer touch事件
void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
// 定义飞镖 和 怪物的集合
// array 插入 删除效率低, 查找的效率高
// list 高 低
// 添加 : 飞镖 怪物出现
// 删除 : 碰撞
// 遍历 : 每隔fps事件 就要遍历检查(多,所以选择array)
cocos2d::CCArray *_targets;
cocos2d::CCArray *_projs;
~HelloWorld();
void update(float delta); // delta - 1.0 / fps
int _successCount;
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
//void menuCloseCallback(CCObject* pSender);
// 响应函数
void responseFunc(CCObject* pSender);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
director – scene – layer – sprite
class HelloWorld : public cocos2d::CCLayerColor // CCLayer的一个子类 ,可以设置颜色
在HelloWorld::init() 中可以初始化如下
// 初始化颜色
CC_BREAK_IF(! CCLayerColor::initWithColor(ccc4(255, 255, 255, 255))); // r g b 透明度
layer中添加label , sprite , button等基本三步骤
创建,设置位置,添加到layer, 例如
CCSprite* player = CCSprite::create("Player.png");
player->setPosition(ccp(20, size.height/2));
this->addChild(player);
menu菜单/菜单项
1 创建菜单项
2 给菜单项添加回调函数,编写回调函数
3 创建菜单时添加菜单项
4 把菜单添加到layer中
如下一个场景切换的菜单项
// 得到屏幕size
CCSize size = CCDirector::sharedDirector()->getWinSize();
// 菜单的使用
CCMenuItemImage *item = CCMenuItemImage::create(
"btn_restart.png",
"btn_restart.png",
this,
menu_selector(GameOverLayer::overCallback));
item->setPosition(ccp(0, size.height/2 - 100));
CCMenu* pMenu = CCMenu::create(item, NULL);// 加入菜单
this->addChild(pMenu);
在头文件添加响应的回调函数,编写回调函数
//重玩
void GameOverLayer::overCallback(CCObject* pSender)
{
// CCDirector::sharedDirector()->end();
CCScene *helloScene = HelloWorld::scene();
CCDirector::sharedDirector()->replaceScene(helloScene); //切换场景
}
关于切换场景时的传值
1. 首先在创建场景的时候,可以给某个layer设置tag
CCScene* GameOverLayer::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);
// 'layer' is an autorelease object
GameOverLayer *layer = GameOverLayer::create();
layer->setTag(100); //设置layer的tag
CC_BREAK_IF(! layer);
// add layer as a child to scene
scene->addChild(layer);
} while (0);
// return the scene
return scene;
}
2 在切换时,
先定义要切换的场景,该场景的getChildByTag()能够得到layer,得到layer在对layer中的控件操作
CCScene *overScene = GameOverLayer::scene(); //CCScene -> GameOverLayer ->_label
GameOverLayer *overLayer = (GameOverLayer *)overScene->getChildByTag(100);
overLayer->_label->setString("You Lost!");
CCDirector::sharedDirector()->replaceScene(overScene); //切换场景
layer的touch事件
// 打开CCLayer的touch事件
this->setTouchEnabled(true);
// 重写各个touch事件
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);
touch事件可以得到点击的position,判断点击的目标等
CCPoint touchPos = pTouch->getLocation();
CCTouch *touch = (CCTouch *)pTouches->anyObject();
CCPoint locInView = touch->getLocationInView(); // 这里是UI坐标系,需要转换成cocos坐标系
CCPoint loc = CCDirector::sharedDirector()->convertToGL(locInView);
给Sprite添加动画,动作
// 创建飞镖
CCSprite *proj = CCSprite::create("Projectile.png");
proj->setPosition(ccp(20, screenSize.height / 2.0));
this->addChild(proj);
// 添加一系列动作
CCMoveTo *move = CCMoveTo::create(D / 320, ccp(endx,endy));// move对象 速度 移动的终点
CCCallFuncN *moveFinish = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::myDefine));
CCSequence *actions = CCSequence::create(move, moveFinish, NULL);
proj->runAction(actions); // 给精灵添加actions
定时器,刷新
init()方法中设置定时器
this->schedule(schedule_selector(HelloWorld::update)); //每隔刷新周期重写
void HelloWorld::update(float delta) // delta - 1.0 / fps
{
//TODO
}
碰撞检测
// TODO
参考学习: