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 onMouseScroll(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 #endif
13 }

最后是触摸事件回调和滚轮事件回调,因为触摸事件和滚轮事件回调很相似,所以滚轮事件回调我就不贴代码了:

 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 }

这里可能有点难理解,但是多想想其实也就不难了,无非就是把把移动距离转换为菜单滚动距离。

时间: 2024-11-07 11:39:57

Cocos2d-x_3.2 Demo学习的相关文章

spring security 安全框架remember me,demo学习

本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/50018001未经博主允许不得转载. 博主地址是:http://blog.csdn.net/freewebsys 1,spring security Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架. 在安全框架这边使用最多的就是spring security. 论坛资料比较充实. 一个哥们写的例子,使

[Unity3D]做个小Demo学习Input.touches

[Unity3D]做个小Demo学习Input.touches 学不如做,下面用一个简单的Demo展示的Input.touches各项字段,有图有真相. 本项目已发布到Github,地址在(https://github.com/bitzhuwei/AndroidTouchDemo). 制作Demo 很简单,只需拉一个Text,然后添加一个脚本. 脚本如下. 1 using UnityEngine; 2 using System.Collections; 3 4 public class Disp

ObjectInputStream || ObjectOutputStream 序列化对象输入输出流Demo 学习

A:Api 说明: ObjectOutputStream 写入的基本数据和对象 *(内存 到 硬盘 对象的 存储!!) ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化. ObjectOutputStream 和 ObjectInputStream 分别与 FileOutputStream 和 FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储.ObjectInputStream 用于恢复那些以

ShadowGun Demo学习(非技术向)

主要针对拿来主义,并对一些使用范围广的shader进行研究.虽然是4,5年前的demo,但还是有学习价值的 1.GodRays MADFINGER/Transparent/GodRays 传统的上帝之光效果,有顶点变形,适用范围非常广. 另外维京村落demo中,还有一个粒子用的近处消隐效果:http://www.cnblogs.com/hont/p/5705240.html 2.Blinking GodRays MADFINGER/Transparent/Blinking GodRays 非顶点

unity商店demo学习:俯视视角RPG游戏

一下所有素材和源码都来自unity商店的实例 Top-Down RPG Starter Kit ,这个demo是unity商店上最好的入门级rpg游戏实例,麻雀虽小,五脏俱全,想要弄清楚一个标准的rpg游戏的方方面面,这个是很好的选择. ps:demo写得很高深,看得不是很懂,准备慢慢研究. 来一张工程全貌图. 这是一个俯视视角(可以调整视角)的卡通风格3D角色扮演游戏,配着动听又欢快的背景音乐,还有那萌萌哒的怪物,仿佛又回到了初中时玩冒险岛online的时候~~,额,不废话,主要模块如下: 游

unity3d入门 Demo 学习记录

闲来学习一下 unity3d 的Demo,记录如下. 官方 Demo,名字为 Roll-A-Ball,如图 场景比较简单,包含地面.玩家精灵.主摄像机.墙壁.可拾取的方块.分数为示 text.平行光源. 资源目录下,包含材质.预制件.脚本. 材质:定义了背景.小方块所需的材质. 预制件:场景中共有12个小方块,所以先做一个 PickUp 的预制件.制作一个预制件,先向场景中创建一个3d对象cube,为该cube对象添加钢体组件.脚本组件,然后把该 cube 对象拖进一个空的预制作,这样便可方批量

如何写好demo——学习感悟

文章标题:教你如何写好Demo应用 如何制作出最有用的demo呢? 简,易 在demo中,我们要专注于单一的主题.我们的教学覆盖了很大的知识范围,因此,化整为零是非常必要的. 例如,我们要说明Android或iOS中的一个新特性,那只讲这一个话题就好了.别跟我说你的demo能“以一敌三”——既展示Material design中最新的UI元素,又介绍RecyclerView,同时还讨论RxJava的新特性.真想好好讲上面这些知识的话,那你就应该为每个知识点分别写demo. 共情 共情是所有这些建

webpack-demo引出的demo学习法

一直以来我的观点是学习的产物一定有两样东西:一样是正向的知识体系,也就是教程:一类是逆向训练的产物也就是试卷.练习题. 一直到最近看到阮一峰老师的GitHub,上面一直还有几年前的webpack-demos,虽然webpack已经快到5了.于是有了自己写体系性demos的想法. 我的GitHub的webpack-demo的地址:https://github.com/mstzhen/webpack-demo. 从01-16从webpack的基本使用到webpack的loader和插件开发. 除了以

Cocos2d-x_3.2 Demo学习之VisibleRect类

这个类主要提供屏幕各个特殊位置的坐标.附上头文件代码: 1 class VisibleRect 2 { 3 public: 4 static cocos2d::Rect getVisibleRect();// 获取屏幕矩形 5 6 static cocos2d::Vec2 left(); // 左中, 7 static cocos2d::Vec2 right(); // 右中 8 static cocos2d::Vec2 top(); // 顶中 9 static cocos2d::Vec2 b