cocos2d-x 动画裁剪
在开发卡牌游戏项目时,我们常常会遇到动画裁剪的问题。例如,当动画为圆形动画,在 page1 页面中位置靠右,而在 page2 页面中可能会看到该动画的另一半。此时,就需要对动画进行裁剪。在 Cocos2d-x 工程里,有一个 setScissorRect 函数可用于实现动画裁剪。
setScissorRect 函数实现
以下是 setScissorRect 函数的具体实现代码:
void play::PCBaseNode::setScissorRect(const CCRect & val )
{
scissorRect = val;
haveScissorRect = true;
scissorBoxRect = freshScissorBoxRect();
}
此函数接收一个 CCRect 类型的参数 val,并将其赋值给 scissorRect。同时,将 haveScissorRect 标志设置为 true,表示启用裁剪区域。最后,调用 freshScissorBoxRect 函数更新裁剪框的矩形区域。
freshScissorBoxRect 函数实现
接下来是 freshScissorBoxRect 函数的实现:
CCRect play::PCBaseNode::freshScissorBoxRect()
{
CCRect tempRect;
tempRect.origin = this->convertToWorldSpace(scissorRect.origin);
CCPoint sizeP = this->convertToWorldSpace(ccp(scissorRect.origin.x + scissorRect.size.width, scissorRect.origin.y + scissorRect.size.height));
tempRect.origin.x *= CC_CONTENT_SCALE_FACTOR();
tempRect.origin.y *= CC_CONTENT_SCALE_FACTOR();
tempRect.size.width = sizeP.x * CC_CONTENT_SCALE_FACTOR() - tempRect.origin.x;
tempRect.size.height = sizeP.y * CC_CONTENT_SCALE_FACTOR() - tempRect.origin.y;
/*
char buf[256];
sprintf(buf, "$$$node scissor: %.2f,%.2f;%.2f;%.2f", tempRect.origin.x, tempRect.origin.y, tempRect.size.width, tempRect.size.height);
PCFileLogger* logger = AppInformation::getInstance()->getFileLogger("debug");
logger->emit(PC_LOG_DEBUG, buf);
CCLOG(buf);
*/
return tempRect;
}
该函数的主要作用是计算并返回裁剪框的矩形区域。具体步骤如下:
- 创建一个临时的
CCRect对象tempRect。 - 使用
convertToWorldSpace函数将scissorRect的原点转换为世界坐标,并赋值给tempRect的原点。 - 同样使用
convertToWorldSpace函数将scissorRect的右上角点转换为世界坐标,存储在sizeP中。 - 根据
CC_CONTENT_SCALE_FACTOR()对tempRect的原点坐标进行缩放。 - 计算
tempRect的宽度和高度,即右上角点的缩放坐标减去原点的缩放坐标。 - 注释部分的代码用于记录调试信息,可根据需要取消注释以查看裁剪框的详细信息。
- 最后返回计算好的
tempRect。
通过上述两个函数的配合使用,我们可以在 Cocos2d-x 项目中实现动画的裁剪功能,解决在不同页面中动画显示的问题。