Flash as3:絕對(duì)坐標(biāo)與相對(duì)坐標(biāo)
2020-07-17 13:18:39
供稿:網(wǎng)友
一個(gè)程序員寫一個(gè)平面的游戲,一般情況下是看不到UI界面的,里面的每個(gè)控件和圖像的移動(dòng)和位置都是通過代碼來實(shí)現(xiàn),很多團(tuán)隊(duì)把這個(gè)數(shù)據(jù)的任務(wù)交給了美工,美工在發(fā)圖的時(shí)候就把位置都拍好,并且給程序員。通常這里也有兩種模式,一個(gè)是給絕對(duì)坐標(biāo)的,這適用于屏幕大小不會(huì)改變的,長寬高和位置都是寫死不變的。但是這種模式的程序往往比較小型,相反更多的都是相對(duì)坐標(biāo),這對(duì)于Flash版本的客戶端來說其實(shí)是很容易的事情,那么這個(gè)坐標(biāo)到底怎么設(shè)置,經(jīng)歷折磨了我很久。
首先就是直接設(shè)置
mc1.x=??; mc1.y=??;
這樣mc1就設(shè)置好了,as3動(dòng)態(tài)new出來的mc是沒有width的,也沒有height,而他的長和高本身也是不定,假設(shè)你在里面加了一張 300x200的圖片,那么他的w和h就會(huì)變成300和200,如果你又加了一張400x100的圖片,他的w就會(huì)變成400而h不變,這在于相對(duì)坐標(biāo)上對(duì)應(yīng)是復(fù)雜了很多的,比如我要讓這個(gè)mc完全居中要怎么做?
如果舞臺(tái)是1000的寬度,要?jiǎng)≈斜容^容易 mc1.x = (1000-400)/2; 這樣就居中了,來看原理,首先我們要舞臺(tái)居中,很容易就想到一個(gè)數(shù)字 1000/2 結(jié)果是500 但是x對(duì)舞臺(tái)的中央是不行的 x是左上角,所以這個(gè)答案還要再減去 400/2 相當(dāng)于mc1再左移自己的一般的位置,這樣就完全劇中了,答案就是 1000/2-400/2 那么算式就演化出來了。
所以要居中的答案似乎已經(jīng)出來了 (stage.stageWidth-mc.width)/2 這個(gè)坐標(biāo)一定是最中間的,但是真的如此嗎?如果舞臺(tái)變了呢?如果mc的大小變了呢?他還居中嗎?這樣想想依然是的。
我曾經(jīng)也是非常理想的認(rèn)為這是最好的方法,但是實(shí)踐告訴我,我錯(cuò)了,當(dāng)我需要在mc中繼續(xù)增加原件圖片,并且這個(gè)圖片也要居中,并且這個(gè)圖片要在mc內(nèi),并且這個(gè)圖片可能大于mc也可能小于mc。來看看情況是怎么樣的。
如果mc2在mc1里,并且mc1大于mc2,很好 mc2.x = (mc1.width-mc2.x)/2; 非常好,很顯然他們對(duì)得很齊,并且mc1不需要在舞臺(tái)上移動(dòng)。但是另一種情況呢?通過這個(gè)算法也可以得到他們的坐標(biāo),但是這個(gè)時(shí)候mc1.width已經(jīng)不在是原來的了,因?yàn)閙c2的width比它大,所以顯然是出錯(cuò),算出來的結(jié)果是0,那么大的圖片就會(huì)和小的圖片”左對(duì)齊”了,而更新了舞臺(tái)上mc1的位置后mc1的位置是居中了,可是里面的卻錯(cuò)得一塌糊涂,你又要重新對(duì)齊原來的圖像,2個(gè)文件就要來回對(duì)其,麻煩不錯(cuò),很容易對(duì)了這個(gè)忘了那個(gè),最終結(jié)果就是圖像莫名其妙錯(cuò)位,痛苦。曾經(jīng)思考過很多,圖像越多就越麻煩。
這個(gè)時(shí)候很多程序員并不會(huì)跳出來,會(huì)一直想如何對(duì)其,然后一直修復(fù)這個(gè)問題,其實(shí)錯(cuò)了,我們都錯(cuò)了,解決問題有時(shí)候不可以死腦筋,如果換思路會(huì)如何?有想過?換過以后卻是如此的簡單,我們?cè)賮砜纯丛怼?br />首先我們把檢測(cè)他的大小,然后運(yùn)算居中,但是大小會(huì)變,算了外面不能顧及里面,算了里面不能顧及外面,那能不能不算呢!答案是肯定的。其實(shí)無論如何大小變有一個(gè)點(diǎn)是永遠(yuǎn)對(duì)著舞臺(tái)中心的,那就是mc的中心,但是width的大小在變,如何才能讓中心不變呢,這時(shí)我想到了一個(gè)關(guān)鍵字(注冊(cè)點(diǎn)),在FlashIDE里也許這個(gè)名詞很熟悉,但是到了代碼里可能很難聯(lián)想到這個(gè)關(guān)鍵字,所以我們要做的是讓mc的中心點(diǎn)永遠(yuǎn)是0點(diǎn)就可以了。也就是說00點(diǎn)是中間而不是左上角!這個(gè)時(shí)候我們?cè)賮韺?duì)齊看看??
mc1.x = stage.stageWidth/2;
mc2.x = -(mc2.width/2);
現(xiàn)在再來看看,無論里里面是大是小,永遠(yuǎn)直接左移,先把自己的中心確定,然后在把這個(gè)中心對(duì)到舞臺(tái)的中心,居中行為最終外美的完成了。當(dāng)然左對(duì)齊右對(duì)齊都可以用這個(gè)思路,你既然設(shè)置是00點(diǎn)的位置,那就先讓你的圖像和00對(duì)齊,再讓00去對(duì)別的地方,這樣迭代就不容易出錯(cuò)了。原來就是如此簡單的問題,因?yàn)殚_始的時(shí)候就錯(cuò)了,于是越來越麻煩,很多時(shí)候問題都是類似的,一定要注意。此問題經(jīng)歷深刻,故發(fā)表一下!最后來句廢話,有興趣轉(zhuǎn)載請(qǐng)著名出處,謝謝!謝謝支持!謝謝大家。