返回“Flash基礎理論課 - 目錄”
到目前為止,我們已經學會了如何在影片中繪製圖形,並且通過施加外力使影片運動起來。然而,在這些例子中也許會遇到這樣的煩惱:物體移動到螢幕外後就不到了。如果在某個角度上運動得過快,那麼就沒有辦法再讓物體退回來,只能選擇重新運行影片。
我們常常忽視邊界的存在如:牆和屋頂,最平常的就是地面。通常在製作太空類比時,要用環境邊界作為一道屏障,保證物體能夠在一個可見的範圍內運動。
另一個常被忽略的問題是,所處的環境如何改變物體的運動。慣性一詞是用來形容物體在空間中穿梭,並保持以同樣的方向及速度運動,只有對其施加外力,才會使它的運動發生改變。改變物體速度向量的力,可能是摩擦力的一種——甚至可以是空氣的阻力。目前,我們已經能夠類比真空環境下的物體運動了,但是大家一定還想類比真實環境下的物體運動。那麼本章就要解決前面這兩個問題。首先,學習邊界環境下物體的運動,然後學習如何類比阻力,Let's go。
環境邊界
先來學習邊界的設定,就像我們的日常活動一樣:開運動會,做某項工作,蓋房子等,這裡邊界是指為這項活動保留的活動空間。意思是“我只關心發生在這個範圍內的事情,如果超出了這個範圍,就不再關注它了。”
當物體超出了這個範圍後,我們可以對它進行一些操作。可以再把它移回來,或把它從關注的對象中移除,另一種選擇是跟隨它。只要物體是運動的,那麼它就有機會離開這個範圍。當物體離開後,我們可以選擇忘記它,或將它移動回來,或跟隨它。我們將介紹前兩種方法,不過先要確定邊界的位置,再學習如何定義邊界。
設定邊界
通常,邊界就是一個矩形。從最簡單的例子開始——基於舞台大小的邊界,在 AS 3 中,舞台由一個名為 stage 的屬性工作表示,它是每個顯示對象的一部分。所以在文檔類(繼承自 MovieClip 或 Sprite)中,我們可以直接使用這個屬性訪問舞台及舞台的相關屬性。如果在播放器視窗改變大小後希望舞台的尺寸與播放器尺寸相匹配的話,就應該設定這兩個屬性:
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
請注意,還需要匯入flash.display.StageAlign和flash.display.StageScaleMode 這兩個類。這樣一來,影片的左上邊界將為零,而右下邊界將為 stage.stageWidth和stage.stageHeight。可將它們儲存為變數,如下:
private var left:Number = 0;
private var top:Number = 0;
private var right:Number = stage.stageWidth;
private var bottom:Number = stage.stageHeight;
要知道,如果使用變數儲存設定的話,那麼舞台大小的改變將不會對這些變數產生影響。如果要使用一個固定的地區作為邊界的話,這樣做是非常合適的。
然而,如果使用整個舞台地區作邊界的話,那麼即使舞台大小發生了改變,只要在代碼中直接調用stage.stageWidth和stage.stageHeight 就可以了。
比如,我們可以為對象建立一個居住的“房間”,在這個例子中,邊界可以是 top = 100, bottom = 300, left = 50, right = 400。OK,邊界已經有了,用它們能做什麼呢?判斷所有移動的對象,看它們是否仍在這個空間內,這裡可以使用if 語句,簡化的樣式如下:
if(ball.x > stage.stageWidth) {
// do something
} else if(ball.x < 0) {
// do something
}
if(ball.y > stage.stageHeight) {
// do something
} else if(ball.y < 0) {
// do something
}
使用if和else 語句判斷邊界,如果小球 x 座標大於右邊界,就意味著它超出了右邊界。但不可能同時超出左邊界,所以不需要再用一條 if 語句進行判斷。因此,只需要在第一個 if 語句失敗後再判斷左邊邊界即可,頂部和底部也是如此。然而,物體有可能在 x,y 軸上同時超出邊界,所以要把這兩個判斷語句分開。如果物體出界後,應該對它們執行什麼樣的操作呢?答案有四種:
■ 將對象移除;
■ 重設到舞台上,像產生一個新對象一樣(重設對象);
■ 重設到舞台上,將同一個對象放置在不同位置;
■ 將其反彈回去。
我們從最簡單的移除對象開始。