在上次的文章中,咱們作了一個最簡單的基本的追逐與閃躲的功能,就是根據獵物座標來修改追擊者的座標,使得二者之間的距離漸漸縮短。上次的文章中,咱們主要是根據物體屏幕座標改變,來產生追逐動畫,他們改變的座標位子是連續的,也就是座標點與座標點的變化,這種叫作
連續環境,可是在遊戲中用得更普遍的是另外一種方式,
磚塊環境。今天,咱們就來一塊兒在
silverlight中實現下磚塊環境下的追逐與閃躲。
何爲磚塊環境?html
在磚塊環境構成的遊戲中,遊戲屏幕會被切割成不連續的磚塊:正方形,三角形,六邊形等等。通常會選擇正方形,由於正方形在處理上面相比其它形狀更簡單。函數
有了切割成的方塊後,整個遊戲畫面就像是這個樣子的:測試
遊戲玩家的位置會固定在某個磚塊上面,移動的時候都是以磚塊爲單位,而且前進方向也是有限制的,而在上次文章中的連續環境下,是以座標點做爲遊戲玩家角色的位置,這樣能夠在任何方向移動。而磚塊環境下,若是以正方形爲基本單元,那麼,遊戲玩家就只能有八個方向的運動以下:動畫
其實,無論是連續環境仍是磚塊環境下,其基本追逐閃躲代碼是通用的,只不過,上次咱們是以點爲移動的基本單元,而今天,咱們是以磚塊爲基本單元,如:上次移動一步是從座標(0,0)移動到座標(1,1)。而如今移動一步是從第一個磚塊移動到下一個磚塊。好了,基本原理就是這樣,那麼在silverlight中咱們又該如何實現呢?spa
我是這樣實現的,只是提供一個參考,並非最好的,你們或許有更好的辦法:)htm
既然要實現磚塊環境的移動,可是咱們清楚,他的本質仍是和連續環境下的移動同樣,爲了重用上次文章中的核心追逐與閃躲代碼,咱們只要把上次移動座標的結果反映到移動磚塊的結果上面就好了。能夠這麼想,經過一個方法,放大座標移動的效果,若是你移動一個座標點,如(1,0)到(2,0);將這個操做放大到從第一個磚塊移動到下一個相對應的磚塊。這樣在屏幕上產生的效果將會被放大,以前只移動一點點,而放大後就是移動一個方塊的距離,由此咱們須要一個邏輯座標集合和屏幕座標集合並經過一些座標轉換方法,來使得他們之間產生通訊。遊戲
轉換函數以下:get
- public Point ChangeLogicToViewP(double x,double y) //把邏輯座標轉換成屏幕座標
-
- {
-
- x = 350+x*60;
- y = 10+y*60;
-
- return new Point(x,y);
-
- }
裏面的數字350,60,10 這要根據你本身設定的磚塊大小和屏幕邊距來進行肯定,具體能夠本身測試。這裏咱們設定的磚塊長寬爲60,而畫布左邊距是350,因此對應把座標(0,0)換算到屏幕上第一個磚塊的位置是350+x*60.源碼
追逐代碼和上次的相似:class
- public void Catch(double monX, double monY, double humX, double humY)
- {
- monsterX = GetRow(monX);
- monsterY = GetColunm(monY);
- humanX = GetRow(humX);
- humanY = GetColunm(humY);
-
- if (monsterX < humanX)
- {
- monsterX++;
- monsterX=SetRow(monsterX);
- humanX = SetRow(humanX);
- }
- else if (monsterX > humanX)
- {
- monsterX--;
- monsterX=SetRow(monsterX);
- humanX = SetRow(humanX);
- }
- else if (monsterX == humanX)
- {
- monsterX = SetRow(monsterX);
- humanX = SetRow(humanX);
- }
- if (monsterY > humanY)
- {
- monsterY--;
- monsterY=SetColnm(monsterY);
- humanY = SetColnm(humanY);
-
- }
- else if (monsterY < humanY)
- {
- monsterY++;
- monsterY=SetColnm(monsterY);
- humanY = SetColnm(humanY);
- }
- else if (monsterY == humanY)
- {
- monsterY = SetColnm(monsterY);
- humanY = SetColnm(humanY);
- }
-
- }
其中的SetRow()和SetColnm()方法也是座標轉換方法,具體以下:
- public double SetRow(double x)
- {
- return x * 60 + 350;
- }
- public double SetColnm(double y)
- {
- return y * 60 + 10;
- }
好了,今天就寫到這裏,具體源碼就不貼出來了,這裏我只是提供下我本身的思路,相信你們會有更好的方法,並且我代碼寫的有點亂,如何有須要的朋友能夠留言,到時候我整理下,到時候發到大家郵箱:)
測試效果:http://www.ophoneba.com/SL/SLAI-2.html