cocos2d-x 2.x01基础入门

来源:互联网 发布:java陈芸 编辑:程序博客网 时间:2024/06/04 20:06



1 运行第一个游戏项目

1.1 问题

Cocos2d-x是目前最流行的手机游戏引擎,本案例将学习如何创建Cocos2d-x项目,如图-1所示:

图-1

1.2 方案

首先通过Xcode创建一个Cocos2d-x项目,在选择项目对话框中选择Cocos2d-x项目。

在创建好的项目中可以看到系统已经写好的代码的,程序员编写的源代码主要在Classes文件目录下面。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建项目

首先通过Xcode创建一个Cocos2d-x项目,在选择项目对话框中选择Cocos2d-x项目,如图-2所示:

图-2

在创建好的项目中可以看到系统已经写好的代码的,程序员编写的源代码主要在Classes文件目录下面,如图-3所示:

图-3

步骤二:运行项目

分析系统生成的代码,在AppDelegate类的applicationDidFinishLaunching方法中首先获取导演,然后创建HelloWorldScene场景对象,代码如下所示:

  1. boolAppDelegate::applicationDidFinishLaunching()
  2. {
  3. CCDirector *pDirector = CCDirector::sharedDirector();
  4. pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
  5. pDirector->setDisplayStats(true);
  6. pDirector->setAnimationInterval(1.0 / 60);
  7. CCScene *pScene = HelloWorld::scene();
  8. pDirector->runWithScene(pScene);
  9. return true;
  10. }

自动生成的HelloWorldScene类继承至CCLayer, HelloWorldScene类中的场景方法中创建层,并添加到场景中方法中,代码如下所示:

  1. CCScene* HelloWorld::scene()
  2. {
  3. CCScene *scene = CCScene::create();
  4. HelloWorld *layer = HelloWorld::create();
  5. scene->addChild(layer);
  6. return scene;
  7. }

然后在HelloWorldScene类中的init方法中看到分别创建了一个菜单项、文字和精灵,代码如下所示:

  1. boolHelloWorld::init()
  2. {
  3. if ( !CCLayer::init() )
  4. {
  5. return false;
  6. }
  7. //创建一个菜单项,类型为图片菜单类型
  8. CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
  9. "CloseNormal.png",//正常状态下的图片
  10. "CloseSelected.png",//单击状态下的图片
  11. this,
  12. //单击菜单项时,回调函数
  13. menu_selector(HelloWorld::menuCloseCallback) );
  14. pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );
  15. //创建菜单
  16. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
  17. pMenu->setPosition( CCPointZero );
  18. this->addChild(pMenu, 1);
  19. //创建一个标签
  20. CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);
  21. CCSize size = CCDirector::sharedDirector()->getWinSize();
  22. pLabel->setPosition( ccp(size.width / 2, size.height - 20) );
  23. this->addChild(pLabel, 1);
  24. CCSprite* pSprite = CCSprite::create("HelloWorld.png");
  25. pSprite->setPosition( ccp(size.width/2, size.height/2) );
  26. this->addChild(pSprite, 0);
  27. return true;
  28. }

直接运行该项目效果如图-4所示:

图-4

1.4 完整代码

本案例中,AppDelegate.cpp文件中的完整代码如下所示:

  1. #include "AppDelegate.h"
  2. #include "cocos2d.h"
  3. #include "SimpleAudioEngine.h"
  4. #include "HelloWorldScene.h"
  5. USING_NS_CC;
  6. using namespace CocosDenshion;
  7. AppDelegate::AppDelegate()
  8. {
  9. }
  10. AppDelegate::~AppDelegate()
  11. {
  12. }
  13. boolAppDelegate::applicationDidFinishLaunching()
  14. {
  15. // initialize director
  16. CCDirector *pDirector = CCDirector::sharedDirector();
  17. pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
  18. // turn on display FPS
  19. pDirector->setDisplayStats(true);
  20. // set FPS. the default value is 1.0/60 if you don't call this
  21. pDirector->setAnimationInterval(1.0 / 60);
  22. // create a scene. it's an autorelease object
  23. CCScene *pScene = HelloWorld::scene();
  24. // run
  25. pDirector->runWithScene(pScene);
  26. return true;
  27. }
  28. // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
  29. void AppDelegate::applicationDidEnterBackground()
  30. {
  31. CCDirector::sharedDirector()->stopAnimation();
  32. SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
  33. SimpleAudioEngine::sharedEngine()->pauseAllEffects();
  34. }
  35. // this function will be called when the app is active again
  36. voidAppDelegate::applicationWillEnterForeground()
  37. {
  38. CCDirector::sharedDirector()->startAnimation();
  39. SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
  40. SimpleAudioEngine::sharedEngine()->resumeAllEffects();
  41. }

本案例中,HelloWorldScene.h文件中的完整代码如下所示:

  1. #ifndef __HELLOWORLD_SCENE_H__
  2. #define __HELLOWORLD_SCENE_H__
  3. #include "cocos2d.h"
  4. classHelloWorld : public cocos2d::CCLayer
  5. {
  6. public:
  7. // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
  8. virtual bool init();
  9. // there's no 'id' in cpp, so we recommend to return the class instance pointer
  10. static cocos2d::CCScene* scene();
  11. // a selector callback
  12. void menuCloseCallback(CCObject* pSender);
  13. // preprocessor macro for "static create()" constructor ( node() deprecated )
  14. CREATE_FUNC(HelloWorld);
  15. };
  16. #endif // __HELLOWORLD_SCENE_H__

本案例中,HelloWorldScene.cpp文件中的完整代码如下所示:

  1. #include "HelloWorldScene.h"
  2. #include "SimpleAudioEngine.h"
  3. using namespace cocos2d;
  4. using namespace CocosDenshion;
  5. CCScene* HelloWorld::scene()
  6. {
  7. // 'scene' is an autorelease object
  8. CCScene *scene = CCScene::create();
  9. // 'layer' is an autorelease object
  10. HelloWorld *layer = HelloWorld::create();
  11. // add layer as a child to scene
  12. scene->addChild(layer);
  13. // return the scene
  14. return scene;
  15. }
  16. // on "init" you need to initialize your instance
  17. boolHelloWorld::init()
  18. {
  19. //////////////////////////////
  20. // 1.superinit first
  21. if ( !CCLayer::init() )
  22. {
  23. return false;
  24. }
  25. /////////////////////////////
  26. // 2.add a menu item with "X" image, which is clicked to quit the program
  27. // you may modify it.
  28. // add a "close" icon to exit the progress. it's an autorelease object
  29. CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
  30. "CloseNormal.png",
  31. "CloseSelected.png",
  32. this,
  33. menu_selector(HelloWorld::menuCloseCallback) );
  34. pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );
  35. // create menu, it's an autorelease object
  36. CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
  37. pMenu->setPosition( CCPointZero );
  38. this->addChild(pMenu, 1);
  39. /////////////////////////////
  40. // 3.add your codes below...
  41. // add a label shows "Hello World"
  42. // create and initialize a label
  43. CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);
  44. // ask director the window size
  45. CCSize size = CCDirector::sharedDirector()->getWinSize();
  46. // position the label on the center of the screen
  47. pLabel->setPosition( ccp(size.width / 2, size.height - 20) );
  48. // add the label as a child to this layer
  49. this->addChild(pLabel, 1);
  50. // add "HelloWorld" splash screen"
  51. CCSprite* pSprite = CCSprite::create("HelloWorld.png");
  52. // position the sprite on the center of the screen
  53. pSprite->setPosition( ccp(size.width/2, size.height/2) );
  54. // add the sprite as a child to this layer
  55. this->addChild(pSprite, 0);
  56. return true;
  57. }
  58. void HelloWorld::menuCloseCallback(CCObject* pSender)
  59. {
  60. CCDirector::sharedDirector()->end();
  61. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  62. exit(0);
  63. #endif
  64. }

2.1 问题

本案例将在上一个案例的基础上完成,分别在界面上添加CCLabelTTF、CCLabelAtlas、CCLabelBMFont文字,如图-5所示:

图-5

2.2 方案

将上一个案例中的HelloWorldScene类中的init方法中的代码删除,然后分别在init方法中创建CCLabelTTF、CCLabelAtlas、CCLabelBMFont文字添加到层中。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建CCLabelTTF文字标签

TTF字体格式算的上是使用最为广泛字体格式,CCLabelTTF就是对该格式的支持,首先使用create()方法创建一个CCLabelTTF对象,然后分别设置文字内容,字体大小和屏幕上的位置,代码如下所示:

  1. CCLabelTTF *pLabel1 = CCLabelTTF::create();
  2. pLabel1->setString("哈哈哈");
  3. pLabel1->setFontSize(36);
  4. pLabel1->setPosition(ccp(50,160));
  5. pLabel1->setAnchorPoint(ccp(0, 0.5));
  6. this->addChild(pLabel1);

步骤二:创建CCLabelAtlas文字标签

CCLabelAtlas可以将纹理图片按照矩形区域分割显示,它可以有灵活可变的样式以及尺寸。使用create方法通过一张纹理图片创建一个CCLabelAtlas对象,并添加到层中,代码如下所示:

  1. CCLabelAtlas* pLabel2 = CCLabelAtlas::create("CCLabelAtlas", "testfont.png", 48, 64, ' ');
  2. pLabel2->setPosition(ccp(50, 380));
  3. this->addChild(pLabel2);

步骤三:创建CCLabelBMFont文字标签

BMFont标签类是引擎当中最快最自由的字体,但也是最麻烦的,需要使用字体编辑器,如图-6所示:

图-6

使用create方法通过文字编辑器生成的fnt文件创建CCLabelBMFont对象,代码如下所示:

  1. CCLabelBMFont* bmFont = CCLabelBMFont::create("CCLabelBMFont", "day01.fnt");
  2. bmFont->setPosition(ccp(350, 300));
  3. this->addChild(bmFont);

2.4 完整代码

本案例中,HelloWorldScene.cpp文件中的完整代码如下所示:

  1. #include "HelloWorldScene.h"
  2. #include "SimpleAudioEngine.h"
  3. using namespace cocos2d;
  4. using namespace CocosDenshion;
  5. CCScene* HelloWorld::scene()
  6. {
  7. // 'scene' is an autorelease object
  8. CCScene *scene = CCScene::create();
  9. // 'layer' is an autorelease object
  10. HelloWorld *layer = HelloWorld::create();
  11. // add layer as a child to scene
  12. scene->addChild(layer);
  13. // return the scene
  14. return scene;
  15. }
  16. // on "init" you need to initialize your instance
  17. bool HelloWorld::init()
  18. {
  19. //////////////////////////////
  20. // 1.superinit first
  21. if ( !CCLayer::init() )
  22. {
  23. return false;
  24. }
  25. CCLabelTTF* pLabel = CCLabelTTF::create("CCLabelTTF", "Helvetica", 24);
  26. pLabel->setPosition(ccp(150, 270));
  27. this->addChild(pLabel);
  28. CCLabelTTF* pLabel1 = CCLabelTTF::create();
  29. pLabel1->setString("哈哈哈");
  30. pLabel1->setFontSize(36);
  31. pLabel1->setPosition(ccp(50, 160));
  32. pLabel1->setAnchorPoint(ccp(0,0.5));
  33. this->addChild(pLabel1);
  34. CCLabelAtlas* label = CCLabelAtlas::create("CCLabelAtlas", "testfont.png", 48, 64,' ');
  35. label->setPosition(ccp(50, 60));
  36. this->addChild(label);
  37. CCLabelAtlas* label1 = CCLabelAtlas::create("LabelAtlas", "testfont.plist");
  38. label1->setPosition(ccp(50, 260));
  39. this->addChild(label1);
  40. return true;
  41. }

3 创建游戏中的菜单

3.1 问题

菜单是游戏不可或缺的一部分。在Cocos2d-x中,菜单由两部分组成,分别是菜单项和菜单本身。本案例将学习如何创建菜单和不同的菜单项,如图-7所示:

图-7

3.2 方案

CCMenu用于存放和管理各种子菜单,各种“菜单项”都是以CCMenuItem开头的类,每种菜单项都可以“响应点击事件”,可以在创建菜单项时指定“回调函数”。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:创建菜单项

首先创建一个CCMenuItemFont类型的对象,即文字菜单项,并设置好屏幕位置,代码如下所示:

  1. //通过文字创建菜单项
  2. CCMenuItemFont* itemFont = CCMenuItemFont::create("开始游戏", this, menu_selector(HelloWorld::menu_itemFont_CallBack));
  3. itemFont->setPosition(ccp(-300,200));
  4. //文字菜单项的回调函数
  5. void HelloWorld::menu_itemFont_CallBack(CCObject* sender){
  6. CCLog("menu_itemFont_Call");
  7. }

其次创建一个CCMenuItemImage类型的对象,即图片菜单项,并设置好屏幕位置,代码如下所示:

  1. //通过图片创建菜单项
  2. CCMenuItemImage* itemImage = CCMenuItemImage::create("main_button1_1.png", "main_button1_2.png", this, menu_selector(HelloWorld::menu_itemImage_CallBack));
  3. itemImage->setPosition(ccp(300,200));
  4. //图片菜单项的回调函数
  5. void HelloWorld::menu_itemImage_CallBack(CCObject* sender){
  6. CCLog("menu_itemImage_Call");
  7. }

接下来创建一个CCLabelBMFont类型的对象,即标签菜单项,并设置好屏幕位置,代码如下所示:

  1. //通过标签创建菜单项
  2. CCLabelBMFont* label = CCLabelBMFont::CCLabelBMFont::create("start", "day01.fnt");
  3. CCMenuItemLabel* itemLabel = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menu_itemLabel_CallBack));
  4. //标签菜单项的回调函数
  5. voidHelloWorld::menu_itemLabel_CallBack(CCObject* sender){
  6. CCLog("menu_itemLabel_Call");
  7. }

然后创建一个CCMenuItemSprite类型的对象,即精灵菜单项,该对象需要通过两个精灵对象创建,代码如下所示:

  1. //通过精灵创建菜单项
  2. CCSprite* sprite1 = CCSprite::create("yanghuashi.png");
  3. CCSprite* sprite2 = CCSprite::create("dongxiang.png");
  4. CCMenuItemSprite *itemSprite = CCMenuItemSprite::create(sprite1, sprite2, this, menu_selector(HelloWorld::menu_itemSprite_CallBack));
  5. itemSprite->setPosition(ccp(-300,-100));
  6. //精灵菜单项的回调函数
  7. void HelloWorld::menu_itemSprite_CallBack(CCObject* sender){
  8. CCLog("menu_itemSprite_Call");
  9. }

最后创建一个菜单开关,通过两个精灵创建一个菜单开关项,一个精灵表示开的状态,另一个表示关的状态,代码如下所示:

  1. //创建菜单开关
  2. CCSprite* itemToggle_sp = CCSprite::create("yanghuashi.png");
  3. CCMenuItemSprite* itemToggle_Sprite = CCMenuItemSprite::create(itemToggle_sp, NULL);
  4. CCSprite* itemToggle_sp1 = CCSprite::create("dongxiang.png");
  5. CCMenuItemSprite* itemToggle_Sprite1 = CCMenuItemSprite::create(itemToggle_sp1, NULL);
  6. CCMenuItemToggle* itemToggle = CCMenuItemToggle::createWithTarget(this, menu_selector(HelloWorld::menu_itemToggle_CallBack), itemToggle_Sprite,itemToggle_Sprite1,NULL);
  7. itemToggle->setPosition(ccp(-200, -200));
  8. //菜单开关的回调函数
  9. void HelloWorld::menu_itemToggle_CallBack(CCObject* sender){
  10. int index = ((CCMenuItemToggle*)sender)->getSelectedIndex();
  11. switch (index) {
  12. case 0:
  13. CCLog("我是画师音乐开");
  14. break;
  15. case 1:
  16. CCLog("我是东香音乐关");
  17. break;
  18. }
  19. }

步骤二:创建菜单

通过上面的菜单项使用create(CCMenuItem* item, ...)方法创建菜单,代码如下所示:

  1. //创建菜单
  2. CCMenu* menu = CCMenu::create(itemFont,itemImage,itemLabel,itemSprite,itemToggle,NULL);
  3. this->addChild(menu);

3.4 完整代码

本案例中,HelloWorldScene.cpp文件中的完整代码如下所示:

  1. #include "HelloWorldScene.h"
  2. #include "SimpleAudioEngine.h"
  3. using namespace cocos2d;
  4. using namespace CocosDenshion;
  5. CCScene* HelloWorld::scene()
  6. {
  7. // 'scene' is an autorelease object
  8. CCScene *scene = CCScene::create();
  9. // 'layer' is an autorelease object
  10. HelloWorld *layer = HelloWorld::create();
  11. // add layer as a child to scene
  12. scene->addChild(layer);
  13. // return the scene
  14. return scene;
  15. }
  16. // on "init" you need to initialize your instance
  17. boolHelloWorld::init()
  18. {
  19. //////////////////////////////
  20. // 1.superinit first
  21. if ( !CCLayer::init() )
  22. {
  23. return false;
  24. }
  25. //通过文字创建菜单项
  26. CCMenuItemFont* itemFont = CCMenuItemFont::create("开始游戏", this, menu_selector(HelloWorld::menu_itemFont_CallBack));
  27. itemFont->setPosition(ccp(-300,200));
  28. //通过图片创建菜单项
  29. CCMenuItemImage* itemImage = CCMenuItemImage::create("main_button1_1.png", "main_button1_2.png", this, menu_selector(HelloWorld::menu_itemImage_CallBack));
  30. itemImage->setPosition(ccp(300,200));
  31. //通过标签创建菜单项
  32. CCLabelBMFont* label = CCLabelBMFont::CCLabelBMFont::create("start", "day01.fnt");
  33. CCMenuItemLabel* itemLabel = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menu_itemLabel_CallBack));
  34. itemLabel->setPosition(ccp(0, 0));
  35. //通过精灵创建菜单项
  36. CCSprite* sprite1 = CCSprite::create("yanghuashi.png");
  37. CCSprite* sprite2 = CCSprite::create("dongxiang.png");
  38. CCMenuItemSprite *itemSprite = CCMenuItemSprite::create(sprite1, sprite2, this, menu_selector(HelloWorld::menu_itemSprite_CallBack));
  39. itemSprite->setPosition(ccp(-300,-100));
  40. /*-------------------创建菜单开关------------------*/
  41. CCSprite* itemToggle_sp = CCSprite::create("yanghuashi.png");
  42. CCMenuItemSprite* itemToggle_Sprite = CCMenuItemSprite::create(itemToggle_sp, NULL);
  43. CCSprite* itemToggle_sp1 = CCSprite::create("dongxiang.png");
  44. CCMenuItemSprite* itemToggle_Sprite1 = CCMenuItemSprite::create(itemToggle_sp1, NULL);
  45. CCMenuItemToggle* itemToggle = CCMenuItemToggle::createWithTarget(this, menu_selector(HelloWorld::menu_itemToggle_CallBack), itemToggle_Sprite,itemToggle_Sprite1,NULL);
  46. itemToggle->setPosition(ccp(-200, -200));
  47. //创建菜单
  48. CCMenu* menu = CCMenu::create(itemFont,itemImage,itemLabel,itemSprite,itemToggle,NULL);
  49. this->addChild(menu);
  50. // CCSprite* sprite = CCSprite::create("home.png");
  51. // sprite->setPosition(ccp(240,160));
  52. // this->addChild(sprite);
  53. return true;
  54. }
  55. void HelloWorld::menu_itemFont_CallBack(CCObject* sender){
  56. CCLog("menu_itemFont_Call");
  57. }
  58. void HelloWorld::menu_itemImage_CallBack(CCObject* sender){
  59. CCLog("menu_itemImage_Call");
  60. }
  61. void HelloWorld::menu_itemLabel_CallBack(CCObject* sender){
  62. CCLog("menu_itemLabel_Call");
  63. }
  64. void HelloWorld::menu_itemSprite_CallBack(CCObject* sender){
  65. CCLog("menu_itemSprite_Call");
  66. }
  67. void HelloWorld::menu_itemToggle_CallBack(CCObject* sender){
  68. int index = ((CCMenuItemToggle*)sender)->getSelectedIndex();
  69. switch (index) {
  70. case 0:
  71. CCLog("我是 画师 音乐开");
  72. break;
  73. case 1:
  74. CCLog("我是 东香 音乐关");
  75. break;
  76. }
  77. }
  78. void HelloWorld::menuCloseCallback(CCObject* pSender)
  79. {
  80. CCDirector::sharedDirector()->end();
  81. #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
  82. exit(0);
  83. #endif
  84. }

0 0
原创粉丝点击