jsb 绑定下,获取作为参数的 Node 对象的大小的问题

Creator 版本 1.8.1
运行平台: Mac 模拟器

先简单描述一下代码的结构,js 部分传递一个 cc.Node 对象给 c++c++ 需要获取一下这个对象的 BoundingBox 信息。

编辑器中,这个 cc.Node 就是一个 Node 组件加上一个 Sprite 组件,位置在 0,0,屏幕中心点 (截图中的白色方块)。

js 部分调用绑定的代码:

this.myComponent.addObstacle(this.wallNode._sgNode);

c++ 部分的绑定代码:

static bool js_mycomponent_addObstacle(se::State& s)
{
    //......
   cocos2d::Node* node = nullptr;
   seval_to_native_ptr(args[0], &node);
   CCLOG("x: %f", node->getPositionX());
   CCLOG("y: %f", node->getPositionY());
   CCLOG("anchorPointX: %f", node->getAnchorPoint().x);
   CCLOG("anchorPointY: %f", node->getAnchorPoint().y);
 
   CCLOG("originX: %f", node->getBoundingBox().origin.x);
   CCLOG("originY: %f", node->getBoundingBox().origin.y);
   CCLOG("width: %f", node->getBoundingBox().size.width);
   CCLOG("height: %f", node->getBoundingBox().size.height);
}

代码的调用执行没有任何问题,但是打印出的数值是:

x: 0.000000
y: 0.000000
anchorPointX: 0.000000
anchorPointY: 0.000000
originX: 0.000000
originY: 0.000000
width: 0.000000
height: 0.000000

可以看到这个是有问题的(但是,白色方块的位置是没有问题的):

于是我在调用绑定代码前,加上了

this.wallNode._sgNode.setAnchorPoint(this.wallNode.getAnchorPoint());
this.wallNode._sgNode.setContentSize(this.wallNode.getContentSize());
this.myComponent.addObstacle(this.wallNode._sgNode);

这次的输出是:

x: 0.000000
y: 0.000000
anchorPointX: 0.500000
anchorPointY: 0.500000
originX: -16.000000
originY: -16.000000
width: 32.000000
height: 32.000000

这次的输出完全没问题了,但是,这个节点在屏幕上的位置却偏移了:

红色节点坐标是 0, 100,可以看到,橙色的范围才是正确的节点位置。

我尝试了修改 Sprite 组件的 size mode 但是也没有用。

想要请问下,是不是我的实现方式有问题呢。。。

不支持从 js 传递 node 到 C++,请用其它方式实现。_sgNode 这只是内部临时对象,2.0 会移除。

在 Creator 中,cc.Node 和 _ccsg.Node 是两个体系,一个是逻辑树中的纯 JS 节点,一个是绑定的渲染节点。你第一次是混淆了两者,第二个 Anchor 的问题是因为逻辑树为了适应编辑器的需求,对 AnchorPoint 的概念有一点改变,参考下面的文档

http://docs.cocos.com/creator/manual/zh/getting-started/cocos2d-x-guide.html#坐标系和锚点

以上是解释一下这么做有问题的原因,我们的确不建议用户触及 sgNode 层面,否则在迁移版本过程中会遇到很大的问题,在 Cocos Creator 2.0(已经在 alpha 测试)中,我们已经彻底移除了 sgNode 渲染树,改为更高效和精简的渲染层设计,如果有兴趣尝试可以联系我。