ccc1.6.1
有两个node,都挂在canvas上,一个是摄像机,另外一个nodeA,如果设置了摄像机的position,那么,nodeA使用convertTouchToNodeSpaceAR接口后,发现返回的坐标被平移了,偏移量正好是摄像机的相对于canvas的位置,请问这是对的吗??我打印nodeA的位置,发现并没有变化,按我的理解,既然nodeA相对于canvas的坐标没有变化,那点击相对于nodeA的点,就不应该有偏移,感觉屏幕坐标的基点被摄像机影响了
摄像机不会改变节点坐标,你获取摄像机移动前和移动后 nodeA 的世界坐标看看变了没
另外,我已经决定不用camera了,因为这里需要自己维护targets,很麻烦,比如场景中有很多动态生成的node,比如子弹,血瓶这些,那你就要随时剔除和添加到targets里,这等于把引擎的摄像机剔除逻辑放到了游戏逻辑层里,这很不友好。
建议参考3d引擎里的场景管理和摄像机剔除,把这些内部细节隐藏在引擎底层,其实摄像机是可以知道,viewport中需要关心的node的
只要把 root 挂到 targets 上就好了啊,children 都是自动处理的
不是自动处理的呀,我addtarget一个node,然后再这个node里加入了很多tilednode,发现并没有被显示出来
convertTouchToNodeSpaceAR 里面用的是世界矩阵来算的,你节点的世界矩阵没变,但是输入的 touch location 变了,得到的结果当然会变了
如果用了camera要先用 getCameraToWorldPoint 将屏幕坐标转到世界坐标上,看修改后的代码
onTouchBegan(event) {
// 点击nodeMap上的一点,比如双眼中间下部的黑色尖尖,,此时nodeMap.convertTouchToNodeSpaceAR得到的坐标是posInMap
// 设置摄像机跟随主角
// 然后再次点击屏幕上吉祥物双眼下方的黑色尖尖,nodeMap.convertTouchToNodeSpaceAR得到的posInMap,却不是原来的posInMap
let touchInScreen = event.getTouches()[0];
let nodeMap = cc.find("Canvas/map");
let camera = cc.find('Canvas/camera').getComponent(cc.Camera);
let touchLocation = camera.getCameraToWorldPoint(touchInScreen.getLocation());
let nodeHero1 = cc.find("Canvas/map/hero1");
let posInMap = nodeMap.convertToNodeSpaceAR(touchLocation);
nodeHero1.position = posInMap;
cc.log(posInMap);
}
还是上个 demo 看看
getCameraToWorldPoint这个函数文档里没有啊,请问哪里可以看到ccc的源码?
希望可以补充到文档,否则怎么都试不出来
其实很简单,就是可以创建几个tiledmap,挂在一个root上,然后只显示在窗口内的,窗口外的被裁掉了,然后移动摄像机,发现被裁掉的tiledmap并没有再次显示出来,只有把这些tiledmap手动addtarget才可以
https://github.com/cocos-creator/engine/ 可以看到 engine 的源码
那个应该是 api 文档有错误,会尽快修复
tiledmap 那个 physics_examples 里面也会相关demo,没发现什么问题呢