Cocos2dx-C++试玩(一):触摸监听+场景创建

发表于2016-05-22
评论1 2.9k浏览
  本文主要讨论如何创建一个单点触摸监听器,简单说明了场景的创建流程。

一、简单入门
  在Cocos2dx有这样四个最基本最重要的类:Director、Scene、Layer、Sprite。
  Director类(导演):控制整个游戏的运作,控制场景元素的切换等;(因此Director类使用的是单例模式。)
  Scene类(场景):本身不可见,用于设定不同的场景如[开始界面]、[游戏中]、[游戏结束]等为游戏
  Layer类(层):将不同的层组合,加入场景类中,便可构造出一个场景。(如FlappyBird:[天空层,地面层,管道]加入 [游戏中]场景)
  Sprite类(精灵):精灵可以是任何物体,能移动、旋转、缩放、还能实现各种动画行为,是cocos2dx里使用相当频繁的一个类。
  从创建一个新工程开始,目标完成一个2048小游戏。本文先从触摸反馈开始学习,打开新建工程的HelloWorldScene.h

二、触摸事件
  在HelloWorld类的定义中添加:
public:
virtual bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *unused_event);
virtual void onTouchEnded(cocos2d::Touch *touch, cocos2d::Event *unused_event);
/*
  HelloWorldScene继承自Layer,Layer类中定义了各种Touch的虚函数,为了使用单点触摸,需要完成这几个虚函数的实现。
*/
private:      
int sourceX,sourceY;  //在onTouchBegan时使用
void moveUp();//在onTouchEnded时分析触摸轨迹,触发对应的函数。
void moveDown();
void moveLeft();
void moveRight();
  接下来到HelloWorldScene.cpp中,首先将刚刚所写的俩个触摸方法添加到监听器中。
//在cocos2dx中大量使用了二段构造,因此这里将初始化代码写在init函数中。
bool HelloWorld::init()
{
    if (!Layer::init())
    {
        return false;
    }
    //添加触摸监听,OneByOne指单点触摸
    auto touchListener = EventListenerTouchOneByOne::create();
    //通过CC_CALLBACK_2宏,将HelloWorld的onTouchBegan和Ended添加到监听器事件
    touchListener->onTouchBegan = CC_CALLBACK_2(HelloWorld::onTouchBegan,this);
    touchListener->onTouchEnded = CC_CALLBACK_2(HelloWorld::onTouchEnded,this);
    //上文说过导演类是一个单例类,获得其实例指针,将触摸监听注册到事件调度器中。在此之后,每当发生触摸,便会调用对应的回调函数
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(touchListener, this);
    return true;
}
  完成了触摸监听器的添加后,实现对应的回调函数,以及相关的函数。
bool HelloWorld::onTouchBegan(Touch *touch,Event *unused_event){
    Point touchPoint = touch->getLocation();
    sourceX = touchPoint.x;
    sourceY = touchPoint.y;
    return true;
}
void HelloWorld::onTouchEnded(Touch *touch,Event *unused_event){
    //get touch point;
    Point touchPoint = touch->getLocation();
    auto distanceX = sourceX - touchPoint.x;
    auto distanceY = sourceY - touchPoint.y;
    //判断移动方向
    if (abs(distanceX) > abs(distanceY)){
        //防止误操作
        if (abs(distanceX) < 10) return;
        //需要注意的是,在cocos2dx里,左下角为坐标原点。
        if (distanceX > 0){
            moveLeft();
        }else{
            moveRight();
        }
    }else{
        if (abs(distanceY) < 10) return;
        if (distanceY > 0){
            moveDown();
        }else{
            moveUp();
        }
    }
}
//实现move的相关函数
bool HelloWorld::moveUp(){
    log("move up");
    return true;
}
//…略…
  接下来就可以运行调试触摸了,作为新手还要知道,完成这些事情,依赖于新建工程时默认写好的HelloWorld::createScene()函数,及导演类,下面就来分析一下场景是如何呈现在屏幕上的。

三、场景创建
  createScene函数做了三件事:
  创建了一个场景指针
  调用HelloWorld的create()方法生成HelloWorld实例[create()对HelloWorld进行了二段构造(创建实例+调用init()方法)]
将HelloWorld加入到了场景中,把场景指针作为返回值返回。
  随后在AppDelegate.cpp中找到
bool AppDelegate::applicationDidFinishLaunching() 方法,即可看见如下代码:
   auto scene = HelloWorld::createScene();
director->runWithScene(scene);
  也就是当应用程序加载完成时,便会创建一个HelloWorld场景,这个场景加载了一个HelloWorld层,这个HelloWorld层经由我们的艺术创造后,成了一个只含有触摸的空层,通过导演类将这个场景运行,最终呈现在了手机屏幕里。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引