cocos2d-x的TestCpp分析

时间:2021-07-21 10:07:51

最近,我刚开始学coco2d-x 我会写我的学习经验来 首先TestCppproject有许多例子文件夹,而在这些文件夹以外的其他文件 。我首先研究这些文件:

controller.h/cpp:管理方案,所有演示样品菜单      

AppDelegate.h/cpp:程序控制类

tests.h:实例总头文件       

testBasic.h/cpp:演示样例场景基类

testResource.h:文件资源名称

VisibleRect.h/cpp:屏幕大小

接下来我将一一分析以上的文件

1.AppDelegate.h/cpp:

AppDelegate.h

class  AppDelegate : private cocos2d::CCApplication
{
public:
AppDelegate();
virtual ~AppDelegate();
virtual bool applicationDidFinishLaunching();//实现CCDirector和CCScene的初始化。假设失败则终止
virtual void applicationDidEnterBackground();//函数被调用时。应用进入后台
virtual void applicationWillEnterForeground();//函数被调用是,应用显示在前台
};

AppDelegate.cpp

#include "AppDelegate.h"

#include "cocos2d.h"
#include "controller.h"
#include "SimpleAudioEngine.h"
#include "cocos-ext.h" USING_NS_CC;
using namespace CocosDenshion; AppDelegate::AppDelegate()
{
} AppDelegate::~AppDelegate()
{
// SimpleAudioEngine::end();
cocos2d::extension::CCArmatureDataManager::purge();//清空数据
} bool AppDelegate::applicationDidFinishLaunching()
{
// As an example, load config file
// XXX: This should be loaded before the Director is initialized,
// XXX: but at this point, the director is already initialized
CCConfiguration::sharedConfiguration()->loadConfigFile("configs/config-example.plist");//载入配置文件 // initialize director
CCDirector *pDirector = CCDirector::sharedDirector();//获得导演对象
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());//设置OpenGL视窗 CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize();//获取屏幕大小 CCSize designSize = CCSizeMake(480, 320);//设置设计分辨率大小 CCFileUtils* pFileUtils = CCFileUtils::sharedFileUtils();//使用文件资源
std::vector<std::string> searchPaths;//声明一个string类型的向量 if (screenSize.height > 320) //下面都是设置屏幕分辨率。这个是高分辨率
{
CCSize resourceSize = CCSizeMake(960, 640);//设置资源分辨率大小
searchPaths.push_back("hd");
searchPaths.push_back("hd/scenetest");
pDirector->setContentScaleFactor(resourceSize.height/designSize.height);//设置屏幕比例系数
}
else//低分辨率
{
searchPaths.push_back("scenetest");
}
pFileUtils->setSearchPaths(searchPaths); #if (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionShowAll);
#else
CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionNoBorder);
#endif CCScene * pScene = CCScene::create();//创建场景
CCLayer * pLayer = new TestController();//创建层
pLayer->autorelease();//使用内存管理器自己主动回收 pScene->addChild(pLayer);//将层加入进场景中
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
void AppDelegate::applicationWillEnterForeground()//应用显示在前台
{
CCDirector::sharedDirector()->startAnimation();
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
SimpleAudioEngine::sharedEngine()->resumeAllEffects();
}

2.testBase.h/cpp  

testBase.h:

#ifndef _TEST_BASIC_H_
#define _TEST_BASIC_H_ #include "cocos2d.h"
#include "VisibleRect.h" USING_NS_CC;
using namespace std; class TestScene : public CCScene
{
public:
TestScene(bool bPortrait = false);//设置标志是否实例化TestScene
virtual void onEnter();//场景被载入时被调用 virtual void runThisTest() = 0;//用于执行场景 // The CallBack for back to the main menu scene
virtual void MainMenuCallback(CCObject* pSender);//回调MainMenuCallback()返回主界面
}; typedef CCLayer* (*NEWTESTFUNC)();//定义NEWTESTFUNC()指针函数为CCLayer
#define TESTLAYER_CREATE_FUNC(className) \ //定义定义createclassName()函数为TESTAYER_CREATE_FUNC
static CCLayer* create##className() \ //返回className()
{ return new className(); } #define CF(className) create##className //定义createclassName为CF(classname) #endif

testBase.cpp

#include "testBasic.h"
#include "controller.h" TestScene::TestScene(bool bPortrait)//构造函数
{ CCScene::init();
} void TestScene::onEnter()//场景载入时的函数
{
CCScene::onEnter(); //add the menu item for back to main menu
//#if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
// CCLabelBMFont* label = CCLabelBMFont::create("MainMenu", "fonts/arial16.fnt");
//#else
CCLabelTTF* label = CCLabelTTF::create("MainMenu", "Arial", 20);//显示一个文字标签
//#endif
CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestScene::MainMenuCallback)); //添加一个菜单标签 并添加了回调函数 CCMenu* pMenu =CCMenu::create(pMenuItem, NULL);//将菜单标签添加菜单中 pMenu->setPosition( CCPointZero );
pMenuItem->setPosition( ccp( VisibleRect::right().x - 50, VisibleRect::bottom().y + 25) ); addChild(pMenu, 1); //将菜单添加场景中
} void TestScene::MainMenuCallback(CCObject* pSender)
{
CCScene* pScene = CCScene::create(); //新创建一个场景
CCLayer* pLayer = new TestController();//实例化一个主菜单的层
pLayer->autorelease(); pScene->addChild(pLayer);
CCDirector::sharedDirector()->replaceScene(pScene);//用主菜单的场景和层用以替换之前的场景
}

3.controller.h/cpp

controller.h

#ifndef _CONTROLLER_H_
#define _CONTROLLER_H_ #include "cocos2d.h" USING_NS_CC; class TestController : public CCLayer
{
public:
TestController();
~TestController(); void menuCallback(CCObject * pSender); //菜单项响应回调函数
void closeCallback(CCObject * pSender); //关闭程序回调函数 virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);//按下触点响应函数
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);//按下状态移动触点响应函数 private:
CCPoint m_tBeginPos;//按下状态移动触点的開始位置
CCMenu* m_pItemMenu;//主菜单
}; #endif

controller.cpp

#include "controller.h"
#include "testResource.h"
#include "tests.h" #define LINE_SPACE 40//菜单项的行间距 static CCPoint s_tCurPos = CCPointZero;//触点位置变量,初始化为左下角位置 static TestScene* CreateTestScene(int nIdx)//创建演示样例的场景
{
CCDirector::sharedDirector()->purgeCachedData();//清除缓存数据 TestScene* pScene = NULL;//定义TestScene指针用于接收创建的演示样例场景 switch (nIdx) //依据索引来创建对应的演示样例场景
{
case TEST_ACTIONS:
pScene = new ActionsTestScene(); break;//动画处理
case TEST_TRANSITIONS:
pScene = new TransitionsTestScene(); break;//场景切换
case TEST_PROGRESS_ACTIONS: pScene = new ProgressActionsTestScene(); break;//进度动画
case TEST_EFFECTS: pScene = new EffectTestScene(); break;//特效
case TEST_CLICK_AND_MOVE: pScene = new ClickAndMoveTestScene(); break;//拖动測试
case TEST_ROTATE_WORLD: pScene = new RotateWorldTestScene(); break;//旋转
case TEST_PARTICLE: pScene = new ParticleTestScene(); break;//粒子系统
case TEST_EASE_ACTIONS: pScene = new ActionsEaseTestScene(); break;//多样化
case TEST_MOTION_STREAK: pScene = new MotionStreakTestScene(); break;//拖尾动画
case TEST_DRAW_PRIMITIVES: pScene = new DrawPrimitivesTestScene(); break;//基本图形
case TEST_COCOSNODE: pScene = new CocosNodeTestScene(); break;//节点
case TEST_TOUCHES: pScene = new PongScene(); break;//触屏
case TEST_MENU: pScene = new MenuTestScene(); break;//菜单
case TEST_ACTION_MANAGER: pScene = new ActionManagerTestScene(); break;//动画管理
case TEST_LAYER: pScene = new LayerTestScene(); break;//层測试
case TEST_SCENE: pScene = new SceneTestScene(); break;//场景測试
case TEST_PARALLAX: pScene = new ParallaxTestScene(); break;//视角測试
case TEST_TILE_MAP: pScene = new TileMapTestScene(); break;//瓦片地图
case TEST_INTERVAL: pScene = new IntervalTestScene(); break;//时间
case TEST_LABEL: pScene = new AtlasTestScene(); break;//文字标签
case TEST_TEXT_INPUT: pScene = new TextInputTestScene(); break;//文本输入
case TEST_SPRITE: pScene = new SpriteTestScene(); break;//精灵
case TEST_SCHEDULER: pScene = new SchedulerTestScene(); break;//预处理器
case TEST_RENDERTEXTURE: pScene = new RenderTextureScene(); break;//渲染纹理
case TEST_TEXTURE2D: pScene = new TextureTestScene(); break;//纹理
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
case TEST_CHIPMUNK: pScene = new ChipmunkAccelTouchTestScene(); break;
#endif
case TEST_BOX2D: pScene = new Box2DTestScene(); break;//Box2D物理引擎
case TEST_BOX2DBED: pScene = new Box2dTestBedScene(); break;//物体的固定于连接
case TEST_EFFECT_ADVANCE: pScene = new EffectAdvanceScene(); break;//高级效果
case TEST_ACCELEROMRTER: pScene = new AccelerometerTestScene(); break;//加速计
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA)
case TEST_KEYPAD: pScene = new KeypadTestScene(); break;//键盘处理
#endif
case TEST_COCOSDENSHION: pScene = new CocosDenshionTestScene(); break;//声效控制
case TEST_PERFORMANCE: pScene = new PerformanceTestScene(); break;//性能測试
case TEST_ZWOPTEX: pScene = new ZwoptexTestScene(); break;// bada don't support libcurl
#if (CC_TARGET_PLATFORM != CC_PLATFORM_BADA && CC_TARGET_PLATFORM != CC_PLATFORM_NACL && CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE && CC_TARGET_PLATFORM != CC_PLATFORM_EMSCRIPTEN)
case TEST_CURL:#if (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT) && (CC_TARGET_PLATFORM != CC_PLATFORM_WP8)
pScene = new CurlTestScene(); break;//网络通信
#else CCMessageBox("CurlTest not yet implemented.","Alert"); break;
#endif
#endif
case TEST_USERDEFAULT: pScene = new UserDefaultTestScene(); break;//用户日志保存
case TEST_BUGS: pScene = new BugsTestScene(); break;//Bug演示样例
case TEST_FONTS: pScene = new FontTestScene(); break;//字体
case TEST_CURRENT_LANGUAGE:
pScene = new CurrentLanguageTestScene(); break;//当前语言
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
case TEST_TEXTURECACHE: pScene = new TextureCacheTestScene(); break;
#endif
case TEST_EXTENSIONS: pScene = new ExtensionsTestScene(); break;
case TEST_SHADER:
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WP8)
pScene = new ShaderTestScene();//着色器
#else
CCMessageBox("ShaderTest not yet implemented.","Alert");
#endif break; case TEST_MUTITOUCH: pScene = new MutiTouchTestScene();//多点触控
break;#if (CC_TARGET_PLATFORM != CC_PLATFORM_MARMALADE)
case TEST_CLIPPINGNODE: pScene = new ClippingNodeTestScene(); break;
#endif
case TEST_FILEUTILS:
pScene = new FileUtilsTestScene(); break;
case TEST_SPINE:
pScene = new SpineTestScene(); break;
case TEST_TEXTUREPACKER_ENCRYPTION:
pScene = new TextureAtlasEncryptionTestScene(); break;
case TEST_DATAVISTOR:
pScene = new DataVisitorTestScene(); break;
case TEST_CONFIGURATION:pScene = new ConfigurationTestScene();break;
default: break;
}
return pScene;
}
TestController::TestController()//构造函数用于初始化场景
: m_tBeginPos(CCPointZero)
{ //加入了一个关闭菜单按钮回调closeCallback()函数 CCMenuItemImage *pCloseItem = CCMenuItemImage::create(s_pPathClose, s_pPathClose, this, menu_selector(TestController::closeCallback) );
CCMenu* pMenu =CCMenu::create(pCloseItem, NULL);//将关闭项加入到主菜单
pMenu->setPosition( CCPointZero );//设置菜单位置
pCloseItem->setPosition(ccp( VisibleRect::right().x - 30, VisibleRect::top().y - 30)); // add menu items for tests
m_pItemMenu = CCMenu::create(); //新建菜单项,全部演示样例都在这里
for (int i = 0; i < TESTS_COUNT; ++i)
{
// #if (CC_TARGET_PLATFORM == CC_PLATFORM_MARMALADE)
// CCLabelBMFont* label = CCLabelBMFont::create(g_aTestNames[i].c_str(), "fonts/arial16.fnt");
//#else
CCLabelTTF* label = CCLabelTTF::create(g_aTestNames[i].c_str(), "Arial", 24);//将字符串转换为字符常量//
#endif
CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(TestController::menuCallback));
m_pItemMenu->addChild(pMenuItem, i + 10000);//将菜单项加入主菜单。以i+10000为Z轴
pMenuItem->setPosition( ccp( VisibleRect::center().x, (VisibleRect::top().y - (i + 1) * LINE_SPACE) )); }
m_pItemMenu->setContentSize(CCSizeMake(VisibleRect::getVisibleRect().size.width, (TESTS_COUNT + 1) * (LINE_SPACE))); //总共的演示样例菜单尺寸
m_pItemMenu->setPosition(s_tCurPos); addChild(m_pItemMenu);//加入演示样例菜单 setTouchEnabled(true);//开启触屏 addChild(pMenu, 1);//加入关闭项
}
TestController::~TestController(){}
void TestController::menuCallback(CCObject * pSender){
// get the userdata, it's the index of the menu item clicked
CCMenuItem* pMenuItem = (CCMenuItem *)(pSender); int nIdx = pMenuItem->getZOrder() - 10000;//得出当前的演示样例菜单项索引
// create the test scene and run it
TestScene* pScene = CreateTestScene(nIdx);//创建菜单
if (pScene)//假设激活了当前场景
{
pScene->runThisTest();//执行当前场景
pScene->release(); }}
void TestController::closeCallback(CCObject * pSender){
#if(CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) || (CC_TARGET_PLATFORM == CC_PLATFORM_WP8)CCMessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
#else
CCDirector::sharedDirector()->end();//退出程序
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
#endif
}
void TestController::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)//触点按下时的响应
{ CCSetIterator it = pTouches->begin(); //获取第一个触点位置
CCTouch* touch = (CCTouch*)(*it);
m_tBeginPos = touch->getLocation(); //将第一个触点的位置坐标保存到m_tBeginPos中
}
void TestController::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{ CCSetIterator it = pTouches->begin();
CCTouch* touch = (CCTouch*)(*it);
CCPoint touchLocation = touch->getLocation(); //获取第一个触点位置的坐标
float nMoveY = touchLocation.y - m_tBeginPos.y; //取得这个位置与之前的位置的纵坐标上的偏移
CCPoint curPos = m_pItemMenu->getPosition(); //当前菜单的位置坐标
CCPoint nextPos = ccp(curPos.x, curPos.y + nMoveY);//菜单也移动与触点移动一样的偏移量
if (nextPos.y < 0.0f) { m_pItemMenu->setPosition(CCPointZero); //假设下一点超出了屏幕的坐标范围则菜单项不变
return;
}
if (nextPos.y > ((TESTS_COUNT + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height))
{ m_pItemMenu->setPosition(ccp(0, ((TESTS_COUNT + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height)));
return;
}
m_pItemMenu->setPosition(nextPos); //更新当前的菜单项的位置
m_tBeginPos = touchLocation;//更新当前位置坐标
s_tCurPos = nextPos;}

4.VisibleRect.h/cpp

VisibleRect.cpp

#include "VisibleRect.h"               //这个类主要是配合设置屏幕分辨率来用的

CCRect VisibleRect::s_visibleRect;

void VisibleRect::lazyInit()
{
if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f)
{
CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();//获取EGLView视图
s_visibleRect.origin = pEGLView->getVisibleOrigin();//得到视图起点
s_visibleRect.size = pEGLView->getVisibleSize(); //得到可见矩形尺寸
}
} CCRect VisibleRect::getVisibleRect() //设置可见矩形的位置尺寸的
{
lazyInit();
return CCRectMake(s_visibleRect.origin.x, s_visibleRect.origin.y, s_visibleRect.size.width, s_visibleRect.size.height);
} CCPoint VisibleRect::left() //下面是获取可见矩形9点坐标
{
lazyInit();
return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height/2);
} CCPoint VisibleRect::right()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height/2);
} CCPoint VisibleRect::top()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height);
} CCPoint VisibleRect::bottom()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y);
} CCPoint VisibleRect::center()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width/2, s_visibleRect.origin.y+s_visibleRect.size.height/2);
} CCPoint VisibleRect::leftTop()
{
lazyInit();
return ccp(s_visibleRect.origin.x, s_visibleRect.origin.y+s_visibleRect.size.height);
} CCPoint VisibleRect::rightTop()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y+s_visibleRect.size.height);
} CCPoint VisibleRect::leftBottom()
{
lazyInit();
return s_visibleRect.origin;
} CCPoint VisibleRect::rightBottom()
{
lazyInit();
return ccp(s_visibleRect.origin.x+s_visibleRect.size.width, s_visibleRect.origin.y);
}

最终完成的事情  。 我是个新手  。那里是没有希望的大神指点权, 如果一个问题可能是一个问题,我长线。