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场景对象,代码如下所示:
- boolAppDelegate::applicationDidFinishLaunching()
- {
- CCDirector *pDirector = CCDirector::sharedDirector();
- pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
- pDirector->setDisplayStats(true);
- pDirector->setAnimationInterval(1.0 / 60);
- CCScene *pScene = HelloWorld::scene();
- pDirector->runWithScene(pScene);
- return true;
- }
自动生成的HelloWorldScene类继承至CCLayer, HelloWorldScene类中的场景方法中创建层,并添加到场景中方法中,代码如下所示:
- CCScene* HelloWorld::scene()
- {
- CCScene *scene = CCScene::create();
- HelloWorld *layer = HelloWorld::create();
- scene->addChild(layer);
- return scene;
- }
然后在HelloWorldScene类中的init方法中看到分别创建了一个菜单项、文字和精灵,代码如下所示:
- boolHelloWorld::init()
- {
- if ( !CCLayer::init() )
- {
- return false;
- }
- //创建一个菜单项,类型为图片菜单类型
- CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
- "CloseNormal.png",//正常状态下的图片
- "CloseSelected.png",//单击状态下的图片
- this,
- //单击菜单项时,回调函数
- menu_selector(HelloWorld::menuCloseCallback) );
- pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );
- //创建菜单
- CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
- pMenu->setPosition( CCPointZero );
- this->addChild(pMenu, 1);
- //创建一个标签
- CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- pLabel->setPosition( ccp(size.width / 2, size.height - 20) );
- this->addChild(pLabel, 1);
- CCSprite* pSprite = CCSprite::create("HelloWorld.png");
- pSprite->setPosition( ccp(size.width/2, size.height/2) );
- this->addChild(pSprite, 0);
- return true;
- }
直接运行该项目效果如图-4所示:
图-4
1.4 完整代码
本案例中,AppDelegate.cpp文件中的完整代码如下所示:
- #include "AppDelegate.h"
- #include "cocos2d.h"
- #include "SimpleAudioEngine.h"
- #include "HelloWorldScene.h"
- USING_NS_CC;
- using namespace CocosDenshion;
- AppDelegate::AppDelegate()
- {
- }
- AppDelegate::~AppDelegate()
- {
- }
- boolAppDelegate::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;
- }
- // This function will be called when the app is inactive. When comes a phone call,it's be invoked too
- void AppDelegate::applicationDidEnterBackground()
- {
- CCDirector::sharedDirector()->stopAnimation();
- SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
- SimpleAudioEngine::sharedEngine()->pauseAllEffects();
- }
- // this function will be called when the app is active again
- voidAppDelegate::applicationWillEnterForeground()
- {
- CCDirector::sharedDirector()->startAnimation();
- SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
- SimpleAudioEngine::sharedEngine()->resumeAllEffects();
- }
本案例中,HelloWorldScene.h文件中的完整代码如下所示:
- #ifndef __HELLOWORLD_SCENE_H__
- #define __HELLOWORLD_SCENE_H__
- #include "cocos2d.h"
- classHelloWorld : public cocos2d::CCLayer
- {
- public:
- // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone (an object pointer)
- virtual bool init();
- // there's no 'id' in cpp, so we recommend to return the class instance pointer
- static cocos2d::CCScene* scene();
- // a selector callback
- void menuCloseCallback(CCObject* pSender);
- // preprocessor macro for "static create()" constructor ( node() deprecated )
- CREATE_FUNC(HelloWorld);
- };
- #endif // __HELLOWORLD_SCENE_H__
本案例中,HelloWorldScene.cpp文件中的完整代码如下所示:
- #include "HelloWorldScene.h"
- #include "SimpleAudioEngine.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- CCScene* HelloWorld::scene()
- {
- // 'scene' is an autorelease object
- CCScene *scene = CCScene::create();
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- // add layer as a child to scene
- scene->addChild(layer);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- boolHelloWorld::init()
- {
- //////////////////////////////
- // 1.superinit first
- if ( !CCLayer::init() )
- {
- return false;
- }
- /////////////////////////////
- // 2.add a menu item with "X" image, which is clicked to quit the program
- // you may modify it.
- // add a "close" icon to exit the progress. it's an autorelease object
- CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
- "CloseNormal.png",
- "CloseSelected.png",
- this,
- menu_selector(HelloWorld::menuCloseCallback) );
- pCloseItem->setPosition( ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20) );
- // create menu, it's an autorelease object
- CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
- pMenu->setPosition( CCPointZero );
- this->addChild(pMenu, 1);
- /////////////////////////////
- // 3.add your codes below...
- // add a label shows "Hello World"
- // create and initialize a label
- CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Thonburi", 34);
- // ask director the window size
- CCSize size = CCDirector::sharedDirector()->getWinSize();
- // position the label on the center of the screen
- pLabel->setPosition( ccp(size.width / 2, size.height - 20) );
- // add the label as a child to this layer
- this->addChild(pLabel, 1);
- // add "HelloWorld" splash screen"
- CCSprite* pSprite = CCSprite::create("HelloWorld.png");
- // position the sprite on the center of the screen
- pSprite->setPosition( ccp(size.width/2, size.height/2) );
- // add the sprite as a child to this layer
- this->addChild(pSprite, 0);
- return true;
- }
- void HelloWorld::menuCloseCallback(CCObject* pSender)
- {
- CCDirector::sharedDirector()->end();
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- }
2.1 问题
本案例将在上一个案例的基础上完成,分别在界面上添加CCLabelTTF、CCLabelAtlas、CCLabelBMFont文字,如图-5所示:
图-5
2.2 方案
将上一个案例中的HelloWorldScene类中的init方法中的代码删除,然后分别在init方法中创建CCLabelTTF、CCLabelAtlas、CCLabelBMFont文字添加到层中。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:创建CCLabelTTF文字标签
TTF字体格式算的上是使用最为广泛字体格式,CCLabelTTF就是对该格式的支持,首先使用create()方法创建一个CCLabelTTF对象,然后分别设置文字内容,字体大小和屏幕上的位置,代码如下所示:
- CCLabelTTF *pLabel1 = CCLabelTTF::create();
- pLabel1->setString("哈哈哈");
- pLabel1->setFontSize(36);
- pLabel1->setPosition(ccp(50,160));
- pLabel1->setAnchorPoint(ccp(0, 0.5));
- this->addChild(pLabel1);
步骤二:创建CCLabelAtlas文字标签
CCLabelAtlas可以将纹理图片按照矩形区域分割显示,它可以有灵活可变的样式以及尺寸。使用create方法通过一张纹理图片创建一个CCLabelAtlas对象,并添加到层中,代码如下所示:
- CCLabelAtlas* pLabel2 = CCLabelAtlas::create("CCLabelAtlas", "testfont.png", 48, 64, ' ');
- pLabel2->setPosition(ccp(50, 380));
- this->addChild(pLabel2);
步骤三:创建CCLabelBMFont文字标签
BMFont标签类是引擎当中最快最自由的字体,但也是最麻烦的,需要使用字体编辑器,如图-6所示:
图-6
使用create方法通过文字编辑器生成的fnt文件创建CCLabelBMFont对象,代码如下所示:
- CCLabelBMFont* bmFont = CCLabelBMFont::create("CCLabelBMFont", "day01.fnt");
- bmFont->setPosition(ccp(350, 300));
- this->addChild(bmFont);
2.4 完整代码
本案例中,HelloWorldScene.cpp文件中的完整代码如下所示:
- #include "HelloWorldScene.h"
- #include "SimpleAudioEngine.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- CCScene* HelloWorld::scene()
- {
- // 'scene' is an autorelease object
- CCScene *scene = CCScene::create();
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- // add layer as a child to scene
- scene->addChild(layer);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- bool HelloWorld::init()
- {
- //////////////////////////////
- // 1.superinit first
- if ( !CCLayer::init() )
- {
- return false;
- }
- CCLabelTTF* pLabel = CCLabelTTF::create("CCLabelTTF", "Helvetica", 24);
- pLabel->setPosition(ccp(150, 270));
- this->addChild(pLabel);
- CCLabelTTF* pLabel1 = CCLabelTTF::create();
- pLabel1->setString("哈哈哈");
- pLabel1->setFontSize(36);
- pLabel1->setPosition(ccp(50, 160));
- pLabel1->setAnchorPoint(ccp(0,0.5));
- this->addChild(pLabel1);
- CCLabelAtlas* label = CCLabelAtlas::create("CCLabelAtlas", "testfont.png", 48, 64,' ');
- label->setPosition(ccp(50, 60));
- this->addChild(label);
- CCLabelAtlas* label1 = CCLabelAtlas::create("LabelAtlas", "testfont.plist");
- label1->setPosition(ccp(50, 260));
- this->addChild(label1);
- return true;
- }
3 创建游戏中的菜单
3.1 问题
菜单是游戏不可或缺的一部分。在Cocos2d-x中,菜单由两部分组成,分别是菜单项和菜单本身。本案例将学习如何创建菜单和不同的菜单项,如图-7所示:
图-7
3.2 方案
CCMenu用于存放和管理各种子菜单,各种“菜单项”都是以CCMenuItem开头的类,每种菜单项都可以“响应点击事件”,可以在创建菜单项时指定“回调函数”。
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:创建菜单项
首先创建一个CCMenuItemFont类型的对象,即文字菜单项,并设置好屏幕位置,代码如下所示:
- //通过文字创建菜单项
- CCMenuItemFont* itemFont = CCMenuItemFont::create("开始游戏", this, menu_selector(HelloWorld::menu_itemFont_CallBack));
- itemFont->setPosition(ccp(-300,200));
- //文字菜单项的回调函数
- void HelloWorld::menu_itemFont_CallBack(CCObject* sender){
- CCLog("menu_itemFont_Call");
- }
其次创建一个CCMenuItemImage类型的对象,即图片菜单项,并设置好屏幕位置,代码如下所示:
- //通过图片创建菜单项
- CCMenuItemImage* itemImage = CCMenuItemImage::create("main_button1_1.png", "main_button1_2.png", this, menu_selector(HelloWorld::menu_itemImage_CallBack));
- itemImage->setPosition(ccp(300,200));
- //图片菜单项的回调函数
- void HelloWorld::menu_itemImage_CallBack(CCObject* sender){
- CCLog("menu_itemImage_Call");
- }
接下来创建一个CCLabelBMFont类型的对象,即标签菜单项,并设置好屏幕位置,代码如下所示:
- //通过标签创建菜单项
- CCLabelBMFont* label = CCLabelBMFont::CCLabelBMFont::create("start", "day01.fnt");
- CCMenuItemLabel* itemLabel = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menu_itemLabel_CallBack));
- //标签菜单项的回调函数
- voidHelloWorld::menu_itemLabel_CallBack(CCObject* sender){
- CCLog("menu_itemLabel_Call");
- }
然后创建一个CCMenuItemSprite类型的对象,即精灵菜单项,该对象需要通过两个精灵对象创建,代码如下所示:
- //通过精灵创建菜单项
- CCSprite* sprite1 = CCSprite::create("yanghuashi.png");
- CCSprite* sprite2 = CCSprite::create("dongxiang.png");
- CCMenuItemSprite *itemSprite = CCMenuItemSprite::create(sprite1, sprite2, this, menu_selector(HelloWorld::menu_itemSprite_CallBack));
- itemSprite->setPosition(ccp(-300,-100));
- //精灵菜单项的回调函数
- void HelloWorld::menu_itemSprite_CallBack(CCObject* sender){
- CCLog("menu_itemSprite_Call");
- }
最后创建一个菜单开关,通过两个精灵创建一个菜单开关项,一个精灵表示开的状态,另一个表示关的状态,代码如下所示:
- //创建菜单开关
- CCSprite* itemToggle_sp = CCSprite::create("yanghuashi.png");
- CCMenuItemSprite* itemToggle_Sprite = CCMenuItemSprite::create(itemToggle_sp, NULL);
- CCSprite* itemToggle_sp1 = CCSprite::create("dongxiang.png");
- CCMenuItemSprite* itemToggle_Sprite1 = CCMenuItemSprite::create(itemToggle_sp1, NULL);
- CCMenuItemToggle* itemToggle = CCMenuItemToggle::createWithTarget(this, menu_selector(HelloWorld::menu_itemToggle_CallBack), itemToggle_Sprite,itemToggle_Sprite1,NULL);
- itemToggle->setPosition(ccp(-200, -200));
- //菜单开关的回调函数
- void HelloWorld::menu_itemToggle_CallBack(CCObject* sender){
- int index = ((CCMenuItemToggle*)sender)->getSelectedIndex();
- switch (index) {
- case 0:
- CCLog("我是画师音乐开");
- break;
- case 1:
- CCLog("我是东香音乐关");
- break;
- }
- }
步骤二:创建菜单
通过上面的菜单项使用create(CCMenuItem* item, ...)方法创建菜单,代码如下所示:
- //创建菜单
- CCMenu* menu = CCMenu::create(itemFont,itemImage,itemLabel,itemSprite,itemToggle,NULL);
- this->addChild(menu);
3.4 完整代码
本案例中,HelloWorldScene.cpp文件中的完整代码如下所示:
- #include "HelloWorldScene.h"
- #include "SimpleAudioEngine.h"
- using namespace cocos2d;
- using namespace CocosDenshion;
- CCScene* HelloWorld::scene()
- {
- // 'scene' is an autorelease object
- CCScene *scene = CCScene::create();
- // 'layer' is an autorelease object
- HelloWorld *layer = HelloWorld::create();
- // add layer as a child to scene
- scene->addChild(layer);
- // return the scene
- return scene;
- }
- // on "init" you need to initialize your instance
- boolHelloWorld::init()
- {
- //////////////////////////////
- // 1.superinit first
- if ( !CCLayer::init() )
- {
- return false;
- }
- //通过文字创建菜单项
- CCMenuItemFont* itemFont = CCMenuItemFont::create("开始游戏", this, menu_selector(HelloWorld::menu_itemFont_CallBack));
- itemFont->setPosition(ccp(-300,200));
- //通过图片创建菜单项
- CCMenuItemImage* itemImage = CCMenuItemImage::create("main_button1_1.png", "main_button1_2.png", this, menu_selector(HelloWorld::menu_itemImage_CallBack));
- itemImage->setPosition(ccp(300,200));
- //通过标签创建菜单项
- CCLabelBMFont* label = CCLabelBMFont::CCLabelBMFont::create("start", "day01.fnt");
- CCMenuItemLabel* itemLabel = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::menu_itemLabel_CallBack));
- itemLabel->setPosition(ccp(0, 0));
- //通过精灵创建菜单项
- CCSprite* sprite1 = CCSprite::create("yanghuashi.png");
- CCSprite* sprite2 = CCSprite::create("dongxiang.png");
- CCMenuItemSprite *itemSprite = CCMenuItemSprite::create(sprite1, sprite2, this, menu_selector(HelloWorld::menu_itemSprite_CallBack));
- itemSprite->setPosition(ccp(-300,-100));
- /*-------------------创建菜单开关------------------*/
- CCSprite* itemToggle_sp = CCSprite::create("yanghuashi.png");
- CCMenuItemSprite* itemToggle_Sprite = CCMenuItemSprite::create(itemToggle_sp, NULL);
- CCSprite* itemToggle_sp1 = CCSprite::create("dongxiang.png");
- CCMenuItemSprite* itemToggle_Sprite1 = CCMenuItemSprite::create(itemToggle_sp1, NULL);
- CCMenuItemToggle* itemToggle = CCMenuItemToggle::createWithTarget(this, menu_selector(HelloWorld::menu_itemToggle_CallBack), itemToggle_Sprite,itemToggle_Sprite1,NULL);
- itemToggle->setPosition(ccp(-200, -200));
- //创建菜单
- CCMenu* menu = CCMenu::create(itemFont,itemImage,itemLabel,itemSprite,itemToggle,NULL);
- this->addChild(menu);
- // CCSprite* sprite = CCSprite::create("home.png");
- // sprite->setPosition(ccp(240,160));
- // this->addChild(sprite);
- return true;
- }
- void HelloWorld::menu_itemFont_CallBack(CCObject* sender){
- CCLog("menu_itemFont_Call");
- }
- void HelloWorld::menu_itemImage_CallBack(CCObject* sender){
- CCLog("menu_itemImage_Call");
- }
- void HelloWorld::menu_itemLabel_CallBack(CCObject* sender){
- CCLog("menu_itemLabel_Call");
- }
- void HelloWorld::menu_itemSprite_CallBack(CCObject* sender){
- CCLog("menu_itemSprite_Call");
- }
- void HelloWorld::menu_itemToggle_CallBack(CCObject* sender){
- int index = ((CCMenuItemToggle*)sender)->getSelectedIndex();
- switch (index) {
- case 0:
- CCLog("我是 画师 音乐开");
- break;
- case 1:
- CCLog("我是 东香 音乐关");
- break;
- }
- }
- void HelloWorld::menuCloseCallback(CCObject* pSender)
- {
- CCDirector::sharedDirector()->end();
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
- exit(0);
- #endif
- }
- cocos2d-x 2.x01基础入门
- Cocos2d-X 基础入门
- cocos2d-x入门篇
- cocos2d-x box2d 入门
- cocos2d-x入门介绍
- cocos2d-x入门基础知识
- Cocos2D-x 入门(1)
- cocos2d-x 3.9入门
- cocos2d-x入门
- cocos2d-x入门知识点
- cocos2d-x基础<二>
- Cocos2d-x基础:CCObject
- Cocos2d-x基础:CCNode
- cocos2d-x基础.
- cocos2d-x基础
- cocos2d-x 基础回想
- cocos2d-x/C++ 基础
- cocos2d-x基础1
- 表格练习2
- ZedGraph使用(一)
- java并发编程(三)-守护线程、线程工厂
- 程序员的发展方向
- Qt学习笔记之图片的上下左右移动
- cocos2d-x 2.x01基础入门
- php中xml数据接口如何生成及调用
- Android Studio无法在线更新
- 贷齐乐系统最新版SQL注入(无需登录绕过WAF可union select跨表查询) 公开时间: 2016-04-21 22:58
- CCF_Z 字形扫描
- PID-4220-素数难题
- 关于android数据库no such table错误的反思
- WinRAR 使用说明
- JNI - PASS ARGUMENT. string