在上一节的onEnter中我们首先是初始化设置大小和允许触摸,然后是新建主干部分的精灵的创建和初始化。初始化之后,主角的移动和变化主要是通过捕获触摸点坐标的变化来实现。触摸点的逻辑处理函数主要集中在下面这三个函数中。
//开始触摸
bool GameObjHero::ccTouchBegan(CCTouch* touch ,CCEvent* event)
{
//首先判断主角是否死亡
if (((GameMain *)this->getParent())->isover)
return false;
//判断触摸点是否在主角的矩形框中
if (!containsTouchLocation(touch))
{
return false;
}
else
{
//获得触摸偏移位置
iscontrol = true;
CCPoint touchPoint = touch->getLocationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
offset.x = touchPoint.x - this->getPosition().x;
offset.y = touchPoint.y - this->getPosition().y;
}
return true;
}
//触摸点移动
void GameObjHero::ccTouchMoved(CCTouch* touch ,CCEvent* event)
{
if (iscontrol)
{
CCPoint touchPoint = touch->getLocationInView();
touchPoint = CCDirector::sharedDirector()->convertToGL(touchPoint);
//设置左右手上下操作
float x = touchPoint.x - offset.x;
float y = touchPoint.y - offset.y;
if (x < this->getPosition().x)
{
lefthand->setFlipY(true);
righthand->setFlipY(false);
}
else
{
lefthand->setFlipY(false);
righthand->setFlipY(true);
}
this->setPosition(x , y);
}
}
//触摸结束
void GameObjHero::ccTouchEnded(CCTouch* touch ,CCEvent* event)
{
if (iscontrol)
{
iscontrol = false;
lefthand->setFlipY(false);
righthand->setFlipY(false);
}
}
知识点:
1.getLocationInView():获取点在视图中的坐标(以左上角为原点);
cocos2d-x支持的几种坐标系:
1>屏幕坐标系 原点在左上角,X轴向右,Y轴向下。
2>GL坐标系 原点在左下角,X轴向右,Y轴向上。
3>世界坐标系 指相对于整个屏幕的坐标系,(0,0)就是屏幕的左下角,(320,480)就是屏幕的右上角。
4>本地坐标系 相对于父对象的坐标。
2.convertToGL():
由于cocos2d-x引擎使用的是open gl es进行渲染的,所以其默认是用的OpenGL坐标体系,所以该函数就是将屏幕坐标系改上的位置改为GL坐标系上的位置。
3.CCFlipY:
这是一种即时动作(不需要时间或者需要时间0秒,马上就完成的动作),其效果是“垂直翻转”
其类似的还有:CCFlipX水平翻转,CCHide隐藏效果,CCShow显示效果等。
在这里就是如果下个坐标点的位置大于目前坐标位置的横坐标,说明主角相对于目前的位置向右移动,则右手抬起,反之左手抬起。这个抬起的动作只需要将图片做一个y轴翻转,也就是y轴镜像。
ps:可能是由于教材中采用的cocos2d-x版本比较早所以其中一些函数已经发生更改,书中getLocationInView()原本是locationInView(),但他们两个的功能是一样的。