利用cocos2dx 3.2开发消灭星星(五)update与触摸事件

上一节我们一直在讲星星有两个位置,当前位置与目标位置。究竟是什么,有什么用。这一节为你解答。
所谓的当前位置,就是星星当前所处的位置,是可以改变的。
所谓的目标位置,就是星星要到达的位置,如果星星的当前位置不等于目标星星,星星的当前位置会不断地改变,直到移动到目标位置。
但是说起来简单,设置了这两个位置,到底怎么实现星星从当前位置移动到目标位置?

这里我们重新看之前被我们忽略的GameLayer中的update函数

void GameLayer::update(float delta){
    if(matrix){
        matrix->updateStar(delta);
    }
}

```

看到没有,GameLayer中的update其实就是调用内置星星矩阵matrix的updateStar方法。
之前我们介绍StarMatrix的时候可能还没有加入updateStar这个函数,没关系,在StarMatrix类中加入就好
void StarMatrix::updateStar(float delta){
    
    for(int i = 0;i < ROW_NUM;i++){
        for(int j = 0;j< COL_NUM;j++){
            if(stars!=nullptr){
                stars->updatePosition();
            }
        }
    }    
}

```

同样的StarMatrix的update方法也是调用比他更小的Star的updatePosition方法(其实就是在Layer层开启update,一层一层向下传递)
void Star::updatePosition(){
    if(desPosition.y != getPositionY()){
        setPositionY(getPositionY() - MOVE_SPEED);
        if(getPositionY() < desPosition.y){
            setPositionY(desPosition.y);
        }
    }
    if(desPosition.x != getPositionX()){
        setPositionX(getPositionX() - MOVE_SPEED);
        if(getPositionX() < desPosition.x){
            setPositionX(desPosition.x);
        }
    }
}

```

到这里还不清晰吗?updatePosition就会判断当前位置跟目标位置desPosition是否一样,从而逐渐改变Star的position,使之逐渐移动到desPosition
以后我们在对Star赋值的时候,只要Star的当前位置与desPosition位置不一样,Star就会自动向desPosition移动。

这里的update是从GameLayer一层一层地往下传到Star。

触摸事件也同样。
在GameLayer中的init函数中开启触摸事件。
EventListenerTouchOneByOne* listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan,this);

```

onTouchBegan函数:
bool GameLayer::onTouchBegan(Touch* touch,Event* event){
    Point p = touch->getLocationInView();
    p = Director::getInstance()->convertToGL(p);
    CCLOG("x=%f y=%f",p.x,p.y);
    if(matrix){
        matrix->onTouch(p);
    }
    return true;
}

```

看到没,这里把得到的触摸点传给了StarMatrix

但是StarMatrix可不会将触摸点又传给单个星星Star,应为单个星星是孤立的,传给它没用。。。
总之,我们的StarMatrix已经接受到触摸点了,具体怎么根据触摸点对自己本身的Star*二维数组进行操作,以后再说吧。

update方法中的delta是指什么啊?

在头文件中声明 virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) override; 或是 virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) ; 都报错。。。 , 这是为什么?

命名空间问题吗? 试试USING_NS_CC

具体怎么根据触摸点对自己本身的Star*二维数组进行操作??求大神解答。