一个程序员写一个平面的游戏,一般情况下是看不到UI界面的,里面的每个控件和图像的移动和位置都是通过代码来实现,很多团队把这个数据的任务交给了美工,美工在发图的时候就把位置都拍好,并且给程序员。通常这里也有两种模式,一个是给绝对坐标的,这适用于屏幕大小不会改变的,长宽高和位置都是写死不变的。但是这种模式的程序往往比较小型,相反更多的都是相对坐标,这对于Flash版本的客户端来说其实是很容易的事情,那么这个坐标到底怎么设置,经历折磨了我很久。
首先就是直接设置
mc1.x=??; mc1.y=??;
这样mc1就设置好了,as3动态new出来的mc是没有width的,也没有height,而他的长和高本身也是不定,假设你在里面加了一张 300x200的图片,那么他的w和h就会变成300和200,如果你又加了一张400x100的图片,他的w就会变成400而h不变,这在于相对坐标上对应是复杂了很多的,比如我要让这个mc完全居中要怎么做?
如果舞台是1000的宽度,要剧中比较容易 mc1.x = (1000-400)/2; 这样就居中了,来看原理,首先我们要舞台居中,很容易就想到一个数字 1000/2 结果是500 但是x对舞台的*是不行的 x是左上角,所以这个答案还要再减去 400/2 相当于mc1再左移自己的一般的位置,这样就完全剧中了,答案就是 1000/2-400/2 那么算式就演化出来了。
所以要居中的答案似乎已经出来了 (stage.stageWidth-mc.width)/2 这个坐标一定是最中间的,但是真的如此吗?如果舞台变了呢?如果mc的大小变了呢?他还居中吗?这样想想依然是的。
我曾经也是非常理想的认为这是最好的方法,但是实践告诉我,我错了,当我需要在mc中继续增加原件图片,并且这个图片也要居中,并且这个图片要在mc内,并且这个图片可能大于mc也可能小于mc。来看看情况是怎么样的。
如果mc2在mc1里,并且mc1大于mc2,很好 mc2.x = (mc1.width-mc2.x)/2; 非常好,很显然他们对得很齐,并且mc1不需要在舞台上移动。但是另一种情况呢?通过这个算法也可以得到他们的坐标,但是这个时候mc1.width已经不在是原来的了,因为mc2的width比它大,所以显然是出错,算出来的结果是0,那么大的图片就会和小的图片”左对齐”了,而更新了舞台上mc1的位置后mc1的位置是居中了,可是里面的却错得一塌糊涂,你又要重新对齐原来的图像,2个文件就要来回对其,麻烦不错,很容易对了这个忘了那个,最终结果就是图像莫名其妙错位,痛苦。曾经思考过很多,图像越多就越麻烦。
这个时候很多程序员并不会跳出来,会一直想如何对其,然后一直修复这个问题,其实错了,我们都错了,解决问题有时候不可以死脑筋,如果换思路会如何?有想过?换过以后却是如此的简单,我们再来看看原理。
首先我们把检测他的大小,然后运算居中,但是大小会变,算了外面不能顾及里面,算了里面不能顾及外面,那能不能不算呢!答案是肯定的。其实无论如何大小变有一个点是永远对着舞台中心的,那就是mc的中心,但是width的大小在变,如何才能让中心不变呢,这时我想到了一个关键字(注册点),在FlashIDE里也许这个名词很熟悉,但是到了代码里可能很难联想到这个关键字,所以我们要做的是让mc的中心点永远是0点就可以了。也就是说00点是中间而不是左上角!这个时候我们再来对齐看看??
mc1.x = stage.stageWidth/2;
mc2.x = -(mc2.width/2);
现在再来看看,无论里里面是大是小,永远直接左移,先把自己的中心确定,然后在把这个中心对到舞台的中心,居中行为最终外美的完成了。当然左对齐右对齐都可以用这个思路,你既然设置是00点的位置,那就先让你的图像和00对齐,再让00去对别的地方,这样迭代就不容易出错了。原来就是如此简单的问题,因为开始的时候就错了,于是越来越麻烦,很多时候问题都是类似的,一定要注意。此问题经历深刻,故发表一下!最后来句废话,有兴趣转载请著名出处,谢谢!谢谢支持!谢谢大家。