顯示具有 ActionScript專案經驗談 標籤的文章。 顯示所有文章
顯示具有 ActionScript專案經驗談 標籤的文章。 顯示所有文章

2013年8月1日 星期四

Flash遊戲引擎 CitrusEngine (十) 開始你的第一個行動APP遊戲吧 - 卷軸背景製作

目前戰鬥機已經可以透過觸控來操作了,不過一般像這種捲軸遊戲,我們還會透過可以滾動的背景,來讓角色有一直往前飛的感覺。
接下來本篇將為各位介紹滾動卷軸背景元件的作法。
如果你想讓戰鬥機可以有一直往上移動的感覺,相對的只要讓底圖一直下移(底圖的y增加),就可以作出這種移動的感覺。

如上圖,首先作一張比螢幕範圍還高的底圖(因為我們只需要往前移動,而不需左右移動,所以底圖的寬度可以跟螢幕範圍一樣就行了),讓底圖往下定速移動,當底圖移動到底時(最右邊的那張圖),我們只要再這裡作一個判斷式,如果到底了,就改變底圖的y座標,讓他在回復到一開始的位子就可以作出一個無限滾動的底圖了。
我們開始實作一個底圖元件,我們在素材取得一張32x32的海面圖片,在用這張圖去重覆拼湊一個我們需要的大於螢幕範圍的底圖。
打開MainStarlingState,在initialize加上這段..
  //海面底圖
   var _seaTexture:Texture = Texture.fromBitmap(new SEA_IMAGE());
   _seaTexture.repeat = true; //重覆貼圖
   var _seaImage:Image = new Image(_seaTexture);
   _seaImage.width = _ce.stage.fullScreenWidth;
   _seaImage.height = 2000;
   //定義海面貼圖範圍
   _seaImage.setTexCoords(0, new Point(0, 0));
   _seaImage.setTexCoords(1, new Point(_seaImage.width / _seaTexture.width, 0));
   _seaImage.setTexCoords(2, new Point(0, _seaImage.height / _seaTexture.height));
   _seaImage.setTexCoords(3, new Point(_seaImage.width / _seaTexture.width, _seaImage.height / _seaTexture.height));
首先取得一張海面的材質,把他的repeat設成true,然後再把材質給Image,設定 一下Image的大小(我們這裡把圖片高度設成2000讓他大於螢幕範圍),接下來用setTexCoords設定一下貼圖的範圍,第一個參數0 1 2 3 個別是 左上 右上 左下 右下,第二個參數是以素材大小為單位的尺寸座標(千萬不要搞錯了),設定好之後就可以讓海面的素材重覆填充成一個我們要的大海面圖片。
圖片完成之後,接下來我們實作一個會圖片會滾動的元件。
建立一個繼承CitrusSprite的物件
package  
{
 import citrus.objects.CitrusSprite;
 
 /**
  * 海面卷軸滾動
  * @author Cain
  */
 public class SeaBg extends CitrusSprite 
 {
  private var stageHight:Number;
  public function SeaBg(name_:String,ob_:Object = null) 
  {
   super(name_, ob_);
   stageHight = _ce.stage.fullScreenHeight - 2000;
   updateCallEnabled = true; //自動update
  }
  
  override public function update (timeDelta:Number) : void
  {
   super.update(timeDelta);
   if (y>=0) 
   {
    //底圖到底就再Loop一次
    y = stageHight;
   }
  }
 }

}
這個SeaBg物件應該很單純,就是物件的y大於0的時候(圖片到底)就重新擺放一次,就可以達到loop的效果。
建立好後,我們把他add到場景上,並設定好參數。
add(new SeaBg("sea", { view:_seaImage, velocity : [0, 150] } ));
new一個SeaBg,這是剛剛作的滾動底圖,把他加到場景上,把大圖片設成view,velocity是速度,我們把y設成150,每個影格會移動150px(可以想成移動速率的意思..)
好了之後你可以先輸出一次,現在你的遊戲,除了可以操作,也擁有了一直往前方飛的速度感。
光只有海面好像有些乏味,我們來加上一些裝飾....
記得素材裡有一些小島的圖案,我們把他加到海面上,讓遊戲更生動一些。
以下實作一個小島的物件。
package  
{
 import citrus.objects.CitrusSprite;
 
 /**
  * 海島
  * @author Cain
  */
 public class Island extends CitrusSprite 
 {
  private var stageHight:Number;
  public function Island(name_:String,ob_:Object = null) 
  {
   super(name_, ob_);
   x = Math.random() * _ce.stage.fullScreenWidth;
   y = Math.random() * _ce.stage.fullScreenHeight;
   stageHight = _ce.stage.fullScreenHeight + 10;
   updateCallEnabled = true; //自動update
   registration = "center"; //素材居中
  }
  
  override public function update (timeDelta:Number) : void
  {
   super.update(timeDelta);
   if (y>stageHight) 
   {
    y = -10;
    x = Math.random() * _ce.stage.fullScreenWidth;
   }
  }
 }

}
一開始的時候,我們給改變x y讓他亂數出現在場景上,下面的update我們一直去檢查,如果他移動至畫面底部,在把他移動至頂端,這樣可以做到loop的效果,為了不讓他每次都在一樣的位置出現,所以x座標在亂數改變一次。
接下來把小島add到場景上。
//海島
   var islandImage:Image = new Image(textureAtlas.getTexture("g1"));
   add(new Island("Island1", { view:islandImage, velocity : [0, 150] } ));
   islandImage = new Image(textureAtlas.getTexture("g2"));
   add(new Island("Island2", { view:islandImage, velocity : [0, 150] } ));
   islandImage = new Image(textureAtlas.getTexture("g3"));
   add(new Island("Island3", { view:islandImage, velocity : [0, 150] } ));
記得速度得統一,才會有在同一個平面的效果,相對的如果你需要不同平面上的裝飾(比方雲層),你可以改變速度(雲層的話,透視速度得在加快一些,您不妨自己試試看)。
輸出後你可以看到您的戰鬥機在還面上移動,不時也會越過小島..

專案下載

Flash遊戲引擎 CitrusEngine (十ㄧ) 開始你的第一個行動APP遊戲吧 - 發射子彈

2010年9月29日 星期三

阿Can流AS3專案開發心法經驗談之一

各位一齊在前線奮鬥的as3弟兄們!大家好!
我想各位在處理as3專案時,難免都會發生一些不可預期的問題,有時不僅僅是技術上無法通破(比方說自己的理論在實際情況時無法產生用途),或者是視覺版型到你的手上時,剛好就是結案的日子(有良心一點剛好是結案的前天一..)

以下幾篇,將與各位分享,近年幾年來累積的一些AS3專案開發心得,也請各位先進不吝賜教

其實發生的種種問題,很多都是來自於時間的不充裕..
首先我們先看看一般理想的專案
這個專案,2個月的時間,中間歷經企劃 視覺 AS3 IT 還有最後的測試,這真是完美的情況,大家按部就班,準時下班...........
不過基於成本考量與種種因素,核簽下來的東西,通常會變成這樣

咦! 時間整整少了一大半,這很正常,因為公司也不是開救濟院的,當然希望最短時間能把專案完成...
如果一個月以四週來說,剛好每個階段分到一周左右時間,約5個工作天,時間再不夠大不了假日兩天給他定下去...
恩!看來時間雖然縮短了,但是也不是不可行,大家努力一點吧!(老闆拍拍大家的肩膀)
不過通常事情不會這麼順利,最後實際情況會變成下圖...

因為我們忽略的最大的變因,..客戶
會這樣絕不對是企劃與視覺偷懶,拖慢了進度,而是企劃重新作了3次,視覺重新畫了5次...
大家都很努力的作,最後到你這裡時只剩下一咪咪的時間
這下太靠么了,前有視覺,後有業主與PM,不過專案就是專案,上線時間依然不會改,只好硬著頭皮上了,24小時都是工作時間,1天當三天用,最後終於如期把專案完成了,自己也躺平了...
慢慢的老闆就會想,其實這是辦的到的,終究人是被逼出來的,於是你每天就都在這樣的無窮迴圈裡出生入死

不過仔細看一下,單看自己as3的時間表,感覺大部分時間都浪累掉了

如果你的時間真的是這樣運用的,似乎是真的很可惜,如果可行,最好把自己的時間表變成這樣
如果這樣執行的話,時間真的非常充裕(我們只看藍色AS3部分),不過這有可能發生嗎?
這裡的關鍵在於,企劃與視覺 跟 程式同步並行
在企劃還沒有決定內容前與視覺還沒有給我flash版型就開始寫as了?
其實這絕對是有辦法的,只要妥善的瞭解專案內容,並規劃你的功能與模組,就可以把視覺與程式儘量切開,讓你寫as時不需要再等視覺人員的版型..

這裡我特別把AS3的專案開發分為兩部分
  • 第一階段     核心技術測試與開發 網站框架建構 元件功能模組化(Class)
  • 第二階段     視覺元素整理 視覺元素與功能整合

之後幾篇,我們將會與各位討論,以上幾個步驟要掌握的要點