zoukankan      html  css  js  c++  java
  • Cocos2d-x 学习笔记(11.1) MoveBy MoveTo

    1. MoveBy MoveTo

    两方法都是对node的平移,MoveBy是相对当前位置的移动。MoveTo是By的子类,是移动到世界坐标位置。

    1.1 成员变量和create方法

    MoveBy的主要成员变量和create方法主要语句:

    bool _is3D; 
    Vec3 _positionDelta; // 设置的相对起点的终点坐标
    Vec3 _startPosition; // 起始坐标
    Vec3 _previousPosition; // 上一次setPosition的坐标

    ActionInterval::initWithDuration(duration));
    _positionDelta = deltaPosition;
    _is3D = true;

    MoveTo的主要成员变量和create方法主要语句:

    Vec3 _endPosition; // 设置的世界坐标系终点坐标
    bool _is3D; 
    Vec3 _positionDelta; // 设置的世界坐标转为相对的坐标
    Vec3 _startPosition; // 起始坐标
    Vec3 _previousPosition; // 上一次setPosition的坐标

    ActionInterval::initWithDuration(duration); _endPosition
    = position;

    1.2 startWithTarget方法

    MoveBy:

    ActionInterval::startWithTarget(target);
    _previousPosition = _startPosition = target->getPosition3D();

    MoveTo:

    MoveBy::startWithTarget(target);
    _positionDelta = _endPosition - target->getPosition3D();

    1.3 update方法

    MoveBy update方法主要逻辑:

    _target->setPosition3D(_startPosition + _positionDelta * time)

    MoveTo的update是父类MoveBy的update。

    MoveBy update方法中的CC_ENABLE_STACKABLE_ACTIONS:

    #if CC_ENABLE_STACKABLE_ACTIONS
            Vec3 currentPos = _target->getPosition3D();
            Vec3 diff = currentPos - _previousPosition;
            _startPosition = _startPosition + diff;
            Vec3 newPos =  _startPosition + (_positionDelta * t);
            _target->setPosition3D(newPos);
            _previousPosition = newPos;
    #else
            _target->setPosition3D(_startPosition + _positionDelta * t);
    #endif

    该宏定义默认为1,是条件编译。

    条件编译是编译器编译代码时最先处理的部分。如果宏条件符合,编译器就编译这段代码,否则,编译器就忽略这段代码而不编译。

    宏定义开启后,当多个动作作用于同一个node时,node的运动方式为多个动作的组合效果。

    首先通过当前位置和上一次本动作设置的位置计算偏差量diff,用偏差量重新计算起始坐标,使得node在之前动作的基础上再运动。

    如果只有一个动作,偏差量为0,起始坐标不会改变。

    1.4 其他

    使用MoveTo时,设置Node初始位置与Node的runAction语句先后的关系不同,可能使MoveTo变成MoveBy。

    代码如下:

    // 错误
    MoveTo *myAction = MoveTo::create(5, Vec2(50,50));
    sp->runAction(myAction);
    sp->setPosition(Vec2(50,50));
    this->addChild(tom);
    // 正确
    MoveTo *myAction = MoveTo::create(5, Vec2(50,50));
    sp->setPosition(Vec2(50,50));
    sp->runAction(myAction);
    this->addChild(tom);

    原因在于runAction会调用到MoveBy的startWithTarget:

    _positionDelta = _endPosition - target->getPosition3D(); // MoveTo

    先runAction再设置初始位置,上面的_endPosition等于_positionDelta,最终坐标又成了相对开始坐标的坐标,不是我们想要的结果。 

  • 相关阅读:
    firefox浏览器播放音频
    Font Awesome图标字体应用及相关
    PHP输出A到Z及相关
    TensorFlow安装填坑之路(Windows环境)
    Git常用命令(一)
    spring boot 入门(一)
    JHipster简介
    Spring Boot实现文件下载功能
    IntelliJ IDEA插件系列
    什么是RESTful API?
  • 原文地址:https://www.cnblogs.com/deepcho/p/cocos2dx-action-moveby-moveto.html
Copyright © 2011-2022 走看看