1.摄像机移动时,GameOver图片不会移动,导致GameOver半屏显示,怎么办?
解决思路:改变camera的culling mask,使得主相机不渲染UI,另外设置一个静止相机渲染UI。
步骤:
- 将包括GameOver在内的所有不会移动的UI的Group设置为“UI”(自己命名)。
- 在main camera的culling mask中,去掉“UI”层级。
- 新建一个camera,命名“UI Camera”,在它的culling mask中,只勾选“UI”层级。
2.如何在一个脚本中调用另一个脚本中的函数?(例:我要在“shootControl”脚本中调用“cameraControl”的Init()方法)
解决思路:在"shootControl"中获得"cameraControl",然后直接调用。
步骤:
- 此时shootControl和cameraControl分别被绑定在两个不同的Node上(也可以在同一个node上啦,看情况)。
- 导入cameraControl类,使得shootControl可以识别cameraControl类型。
var cameraControl = require("cameraControl");
- 设置cameraControl类型的变量,在属性检查器面板上,将脚本拖拽上去。
cameraControl:{default:null,type:cameraControl},
- 可以直接调用cameraControl里面的函数了
this.cameraControl.SmoothCameraPos(this.startPos,this.correctPos); //更改相机位置
3.如何使得摄像机平滑移动到另一个位置?
解决思路:使用动作系统,给定targetPos和时间,调用API即可。
SmoothCameraPos(startPos){ var tartgetPos=cc.v2(startPos.x+this.addX,startPos.y+this.addY);var action = cc.moveTo(this.perMoveTime,tartgetPos);this.node.runAction(action);},
4.如何使得某物体始终处于摄像机的某个位置(非中央)?
(1)已知该物体的世界坐标:this.startPos
(2)已知摄像机的世界坐标为(0,0),在属性检查器上改anchor值是没有用的。在场景中也看不出来摄像机的渲染平面有多大,可以推测出width和height暂时和设计分辨率相同,机型不同,相应也会变化。而默认anchor在(0.5,0.5)。
(3)若直接将摄像机的position设置为该物体的position,可以看到该物体为于相机正中央(1/2height、1/2width),好像是(0.5,0.5)锚点和该物体锚点重合了。
(4)我希望在外面暴露出来两个参数:posRatioX、posRatioY,分别代表该物体始终占据屏幕X轴、Y轴的比例位置。比如填写(0.5,0.25)时,位置如图:
onLoad(){this.addX=this.canvas.width*(0.5-this.posRatioX);this.addY=this.canvas.height*(0.5-this.posRatioY);},InitCameraPos(startPos,nextPos){this.node.x=startPos.x+this.addX;//若不加 add值,则 起点处于相机正中央this.node.y=startPos.y+this.addY;},
老实说,上面这个相加公式是我猜出来的。我们来看看,设置posRatioY为x,addY为y。则已知,x=0.5,y=0; x=0.25,y=0.25*height;x=0.75,y=-0.25*height。就这样,根据这三组值,我猜出了这个公式。(自己的几何比较差,于是用代数解出了这道题的感觉。)
5.如何判断鼠标/触摸点和场景中物体的距离?
解决思路:先搞清楚触摸点的坐标系和场景中物体的坐标系之间的差异,再将它们转换到同一个坐标系下。
具体解决步骤:
(1)鼠标触摸点的坐标系:看了官方关于摄像机的坐标转换的解释之后,我发现,触摸点所处的是摄像机坐标系,即不管相机在场景中如何移动,它的坐标系都是以屏幕左下角为原点。
(2)根节点的position是世界坐标。子节点的position是本地坐标,以父节点的anchor位置为坐标原点。
(3)将鼠标触摸点和物体的坐标都统一到世界坐标下:
A.触摸点:
this.cameraControl.node.getComponent(cc.Camera).getCameraToWorldPoint(event.touch.getLocation(), this.mousePos);
B.物体坐标:
将我要操作的物体的父物体的anchor设置在世界坐标系的原点处。