首页 > 代码库 > Cocos2d-x_3.2 Demo学习
Cocos2d-x_3.2 Demo学习
一些基本的基础知识我就不说了,可以找一些材料来了解这些,我就直接进入主题了。
1 bool AppDelegate::applicationDidFinishLaunching() 2 { 3 //.....初始化设置比如刷新频率,窗口大小等 4 5 auto scene = Scene::create(); 6 auto layer = new TestController();// 主场景,显示可以测试的项目 7 8 //... 9 10 layer->autorelease();11 scene->addChild(layer);// 添加至场景12 director->runWithScene(scene);// 运行场景13 14 return true;15 }
AppDelegate.h头文件里新添加的BestTest和省略没讲到的代码,我们回头在讲,后面的每个Test都有我们现在没讲到的内容。
现在我们根据程序运行顺序进入TestController类看看有什么:
1 class TestController : public Layer 2 { 3 public: 4 TestController(); 5 ~TestController(); 6 7 void menuCallback(Ref * sender);// 菜单回调 8 void closeCallback(Ref * sender);// 关闭按钮回调 9 10 bool onTouchBegan(Touch* touches, Event *event);// 触摸开始11 void onTouchMoved(Touch* touches, Event *event);// 触摸移动12 13 void onm ouseScroll(Event *event);// 滚轮回调14 //...15 private:16 Vec2 _beginPos;// 用于保存触摸开始时坐标17 Menu* _itemMenu;// 用于滚动事临时显示的坐标18 //...19 };
这个类就是提供用于有哪些测试项,可以向上滚动,和向下滚动查看,其实就是一个可滚动菜单。效果图附上:
现在我们来看看controller.cpp里的构造函数如下:
1 TestController::TestController():_beginPos(Vec2::ZERO),_exitThread(false) 2 { 3 /* 添加关闭菜单 */ 4 auto closeItem = MenuItemImage::create(s_pathClose, s_pathClose, CC_CALLBACK_1(TestController::closeCallback, this) ); 5 auto menu =Menu::create(closeItem, nullptr); 6 7 menu->setPosition( Vec2::ZERO );// (0,0) 8 closeItem->setPosition(Vec2( VisibleRect::right().x - 30, VisibleRect::top().y - 30)); 9 10 /* 添加测试菜单 */11 TTFConfig ttfConfig("fonts/arial.ttf", /* 字号 */24);12 _itemMenu = Menu::create();13 for (int i = 0; i < g_testCount; ++i)// g_testCount用于测试项数目14 {15 auto label = Label::createWithTTF(ttfConfig, g_aTestNames[i].test_name); 16 auto menuItem = MenuItemLabel::create(label, CC_CALLBACK_1(TestController::menuCallback, this));17 18 _itemMenu->addChild(menuItem, i + 10000);19 menuItem->setPosition( Vec2( VisibleRect::center().x, (VisibleRect::top().y - (i + 1) * LINE_SPACE) ));20 }21 _itemMenu->setContentSize(Size(VisibleRect::getVisibleRect().size.width, (g_testCount + 1) * (LINE_SPACE)));22 _itemMenu->setPosition(s_tCurPos);23 addChild(_itemMenu);24 25 addChild(menu, 1);26 27 /* 注册触摸事件 */28 auto listener = EventListenerTouchOneByOne::create();29 listener->setSwallowTouches(true);// 设置其他层是否接受30 listener->onTouchBegan = CC_CALLBACK_2(TestController::onTouchBegan, this);31 listener->onTouchMoved = CC_CALLBACK_2(TestController::onTouchMoved, this);32 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);// 设置监听对象33 /* 注册滚轮事件 */34 auto mouseListener = EventListenerMouse::create();35 mouseListener->onMouseScroll = CC_CALLBACK_1(TestController::onMouseScroll, this);36 _eventDispatcher->addEventListenerWithSceneGraphPriority(mouseListener, this);// 设置监听对象37 }
第8行了用到了VisibleRet类,主要是获取屏幕的每个位置坐标,请看这里
http://www.cnblogs.com/studweijun/articles/3973600.html
还有用到了一个宏定义如下:
#define LINE_SPACE 40 // 行距40
上面代码主要是显示测试项,下面我们来看回调函数:
1 void TestController::menuCallback(Ref * sender) 2 { 3 Director::getInstance()->purgeCachedData();// 移除所有 cocos2d 缓存数据 4 5 auto menuItem = static_cast<MenuItem *>(sender); 6 int idx = menuItem->getLocalZOrder() - 10000;// 获取Z顺序 7 8 auto scene = g_aTestNames[idx].callback();// C++11 创建菜单项相对应的场景 9 10 if (scene)11 {12 scene->runThisTest();13 scene->release();14 }15 }
上面这段代码就是运行相应菜单项。
1 /* 各平台不同的关闭 */ 2 void TestController::closeCallback(Ref * sender) 3 { 4 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) 5 MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); 6 return; 7 #endif 8 9 Director::getInstance()->end();10 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)11 exit(0);12 #endif13 }
最后是触摸事件回调和滚轮事件回调,因为触摸事件和滚轮事件回调很相似,所以滚轮事件回调我就不贴代码了:
1 bool TestController::onTouchBegan(Touch* touch, Event *event) 2 { 3 _beginPos = touch->getLocation();// 获得触摸点坐标 4 return true; 5 } 6 7 void TestController::onTouchMoved(Touch* touch, Event *event) 8 { 9 auto touchLocation = touch->getLocation(); 10 float nMoveY = touchLocation.y - _beginPos.y;11 12 auto curPos = _itemMenu->getPosition();// 获得菜单坐标13 auto nextPos = Vec2(curPos.x, curPos.y + nMoveY);14 /* 滑到最顶端禁止滑动 */15 if (nextPos.y < 0.0f)16 {17 _itemMenu->setPosition(Vec2::ZERO);18 return;19 }20 /* 滑动最低端禁止滑动 */21 if (nextPos.y > ((g_testCount + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height))22 {23 _itemMenu->setPosition(Vec2(0, ((g_testCount + 1)* LINE_SPACE - VisibleRect::getVisibleRect().size.height)));24 return;25 }26 27 _itemMenu->setPosition(nextPos);28 _beginPos = touchLocation;29 s_tCurPos = nextPos;30 }
这里可能有点难理解,但是多想想其实也就不难了,无非就是把把移动距离转换为菜单滚动距离。
Cocos2d-x_3.2 Demo学习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。