cocos2d-x 动画裁剪

2015年03月24日 14:45 0 点赞 0 评论 更新于 2025-11-21 18:26

在开发卡牌游戏项目时,我们常常会遇到动画裁剪的问题。例如,当动画为圆形动画,在 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;
}

该函数的主要作用是计算并返回裁剪框的矩形区域。具体步骤如下:

  1. 创建一个临时的 CCRect 对象 tempRect
  2. 使用 convertToWorldSpace 函数将 scissorRect 的原点转换为世界坐标,并赋值给 tempRect 的原点。
  3. 同样使用 convertToWorldSpace 函数将 scissorRect 的右上角点转换为世界坐标,存储在 sizeP 中。
  4. 根据 CC_CONTENT_SCALE_FACTOR()tempRect 的原点坐标进行缩放。
  5. 计算 tempRect 的宽度和高度,即右上角点的缩放坐标减去原点的缩放坐标。
  6. 注释部分的代码用于记录调试信息,可根据需要取消注释以查看裁剪框的详细信息。
  7. 最后返回计算好的 tempRect

通过上述两个函数的配合使用,我们可以在 Cocos2d-x 项目中实现动画的裁剪功能,解决在不同页面中动画显示的问题。

作者信息

menghao

menghao

共发布了 3994 篇文章