顯示具有 Flash AIR 標籤的文章。 顯示所有文章
顯示具有 Flash AIR 標籤的文章。 顯示所有文章

2014年10月1日 星期三

Adobe AIR 輸出 IOS APP 在IOS 8無法上架問題

用Adobe AIR開發APP是相當方便的事,輸出IOS ipa必須要使用Mac 的Application Loader送審上架到APP Store。



最近IOS系統更新到了8,官方說明 Application Loader 的版本必須要升級到3.0以上 (一般來說,你可以直接更新你的XCode到最新版就行了)

不過使用 Application Loader 上傳時卻發生了問題

  ERROR ITMS-9000: "Invalid Segment Alignment. This app does not have proper segment alignment and should be rebuilt with the latest version of Xcode. Please contact Developer Technical Support if you need further assistance."

總之是因為目前的AIR SDK (我是用 AIR 15) 沒有顧慮到新版IOS 8的規格,以下提供解決方法。

首先下載修正版的SDK


(或者是直接覆蓋SDK中的這個修正檔案)

最後記得在 application.xml 檔案中的IOS設定檔<InfoAdditions>裡面加上這個key值
<key>MinimumOSVersion</key>
<string>6.1</string>

設定完成後輸出就可以正常送審了
這封郵件來自 Evernote。Evernote 是您專屬的工作空間,免費下載 Evernote

2013年9月5日 星期四

在Starling中,如何製作符合各種不同規格裝置的場景 - 以IOS為例子 (二)

原文翻譯至
Managing multiple iOS resolutions with Starling – real world example – Part 2: iPhone 5 and iPad

在Starling中最棒的ㄧ件事就是,你只需要製作一個版本,就可以適用各製種螢幕規格。
上一篇中,我們實作了一種方法,讓你的APP透過判定是否為高解析螢幕,然後取用合適的素材。
本篇將實作,如何作一個全螢幕(不變形)的畫面,包含 iPhone5 iPad iPad mini 或者是 Retina iPad..
我們先來看看下圖,用這個技術在各個裝置上的成果。

圖中有iPhone3GS iPhone4 iPhone5 iPad 與 iPad3,它們都可以用全螢幕的模式顯示出漂亮的素材(即使是在iPhone5上的怪怪規格也是沒有任何問題)

首先瞭解你的敵人,我們看看各機型的規格(橫向)

iPhone 3G and 3GS: 480×320

iPhone 4 and iPhone 4S: 960×640

iPhone 5: 1136×640 (iPhone請見下方的ps)

iPad, iPad 2 and iPad mini: 1024×768

iPad 3 and iPad 4 (called iPad with retina display): 2048×1536

想在各種規格上都全螢幕顯示意味著每種畫面都是不同的解析度,所以第一件事就是"定義每種不同的場景大小與比例",來讓這件事變的容易瞭解一點。
首先定意比例 :
480 x 320 有 iPhone3G iHpone3GS 另外 iPhone4 與 iPhone4S 他們需要2倍解析度的素材。
568 x 320 有 iPhone5 ㄧ樣需要2倍解析度素材。
512 x 384 有 iPad  iPad2  iPad mini (這些需要2倍解析度素材),另外還有 iPad3與iPad4 (他們需要4倍素材)
這樣分類後我們可以把10種裝置,分成5種規格,但是只有3種螢幕比例。

以下實作主程式 Main,使用Starling,在低品畫質情況上述不同比例下全螢幕的作法。

再來我們再場景上置入各種不同規格的素材,再判定各裝置給與正確的素材。
以上程式,你可以看到如何判定不同裝置來置入適合的素材。
90~112 的 setupDevice,可以告訴我們現在是屬於何種裝置,這個方法跟上一篇談的一樣,ㄧ切變得跟在設定Html網頁的模式ㄧ樣,你不應該根據硬體規格來選擇素材,而應該是根據螢幕的大小與比例來設定正確的素材。

ps.全螢幕設定在 iPhone5上發現的問題 (筆者沒有iPhone5所以也無法作實驗..)

實際上光是這個作法在iPhone5上會有問題,因為無法抓到正確的解析度,除非你放置一個正確的起動圖片。
檔名 Default-568h@2x.png,他是一張640x1130的png (不管是用直式還是橫式)


2013年8月29日 星期四

在Starling中,如何製作符合各種不同規格裝置的場景 - 以IOS為例子 (ㄧ)

原文出處
Managing multiple iOS resolutions with Starling – real world example

製作iOS遊戲時,你要處理各種不同類型的設備(從iPhone 3GS到iPhone 5... 之後可能還會更多)
雖然每個設備都有自己的螢幕規格,但是你應該只需要製作一個版本的遊戲,他必須可以自動將場景調整成必要的規格。
本篇內容將介紹將為各為介紹,使用Starling框架時,如何製作這種機制。

首先我們建立一個基本的Starling專案,並對場景初始化。


第6行定義的場景,這是針對3GS作設定 (480 x 320)
再來是場景 Game.as

建立好了之後輸出看看各種不同規格的樣子..
首先看ㄧ下3GS,沒有任何問題。
在來看ㄧ下iPhone 4..

iPhone 4,規格960x640,畫面只剩下場景的1/4..
再來看看iPhone 5,情況又更糟了..


iPhone5的規格1136x640,不但大小不同,比例也不一樣..

像這樣的情況下,我們介紹如何直接應用ㄧ開始的場景大小(480x320)來符合各種不同規格的螢幕的方法,不管是不是視網膜螢幕都可以直接應用。
修改ㄧ下Main.as

首先重新定義ㄧ下你的viewPort,把stage直接拉大到螢幕的大小。
這種直接拉大stage的方法,可以很快解決上述的問題。
現在我們再來看ㄧ次iPhone 4的情況。
現在遊戲畫面可以涵蓋整個螢幕了,不過解析度確很糟糕..
同樣的,在iPhone 5上面也是一樣的問題。
雖說畫面也正常(也沒有人逼你ㄧ定得解決畫面品質不佳的問題),但擁有視網膜的iPhone使用者也會給你不好的評價。
你可能會用另一種方法,直接把素材解析度增加2倍,好讓遊戲在視網膜螢幕上的效果好ㄧ些,不過這反而對沒有視網膜螢幕的裝置造成負擔,由於素材過於龐大,導致效能不佳,動畫也變得不順暢。
所以我們在加ㄧ些判斷,好讓程式可以針對不同的裝置,使用適當的素材。
程式中,嵌入了ㄧ般用的素材與高解析度的素材,然後去判斷viewPoint的大小來決定用哪一種素材,這種方法不管是3GS或是iPhone4上都可以顯示最適當的素材。
再次輸出到iPhone 4
現在他支援iPhone 4的視網膜螢幕了。
接著輸出到iPhone 5
iPhone 5應用了適當的素材,畫面品質也提高了,不過由於iPhone 5與3GS和iPhone 4比例不一樣,導致畫面兩旁補了黑邊。
下一篇我們再來解決這個問題。

補充:Srarling 1.3 以後設定 viewPoint 可以直接使用RectangleUtil.fit方法設定縮放大小,有機會在介紹。

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遊戲吧 - 發射子彈

2013年7月29日 星期一

Flash遊戲引擎 CitrusEngine (九) 開始你的第一個行動APP遊戲吧 -用 InputController 操作你的角色

上一篇教學,我們製作了戰鬥機的元件,並且加上了由下至上移動的DEMO。不過實際上,遊戲元件,應該是可以透過某些動作方法來操作他。
本篇介紹InputController物件,這個物件是專門負責操作控制的。
記得之前介紹的一個遊戲,我們直接把Hero物件new出來後,就可以直接操作他,不需要再添加任何程式碼,實際上是因為 CitrusEngine已經在一開始時幫你預設加上了一個Keyboard物件,他繼承一個InputController物件,並幫你寫了一些預設動作(移動 跳躍 ...),所以你的Hero一開始就可以操作了。
由於我們這次要控制的元件並不是Hero,而且遊戲也不是在PC上執行,所以也無法使用Keyboard,所以我們必須得自己作一個InputController來控制戰鬥機。
以下先作一個InputController可以用觸控拖曳的方式來移動戰鬥機。
首先我們new一個TuochInputController Class,並繼承InputController.. (以下程式碼)
package  
{
 import citrus.input.InputController;
 import flash.geom.Point;
 import starling.display.Sprite;
 import starling.display.Stage;
 import starling.events.Touch;
 import starling.events.TouchEvent;
 import starling.events.TouchPhase;
 
 /**
  * 觸控輸入控制
  * @author Cain
  */
 public class TuochInputController extends InputController 
 {
  private var myStage:Stage;
  private var movePoint:Point;
  public function TuochInputController(name:String = "TuochInputController", params:Object = null)
  {
   super(name, params);
   myStage = Sprite(_ce.state).stage;
   myStage.addEventListener(TouchEvent.TOUCH, onTOUCH); //偵聽觸控
  }
  
  private function onTOUCH(e:TouchEvent):void 
  {
   e.stopPropagation();
   var _touch:Touch = e.getTouch(myStage);
   if (_touch) 
   {
    switch (_touch.phase) 
    {
     case TouchPhase.BEGAN:
      
     break;
     case TouchPhase.MOVED:
      movePoint = _touch.getMovement(myStage); //抓取移動數值
     break;
     case TouchPhase.ENDED:
      
     break;
     default:
      movePoint = null;
    }
   }
  }
  
  override public function update () : void
  {
   super.update();
   if (movePoint) 
   {
    //改變移動量
    triggerVALUECHANGE("movX", movePoint.x);
    triggerVALUECHANGE("movY", movePoint.y);
   }else 
   {
    triggerVALUECHANGE("movX", 0);
    triggerVALUECHANGE("movY", 0);
   }
  }
  
  override public function destroy () : void
  {
   myStage.removeEventListener(TouchEvent.TOUCH, onTOUCH);
   movePoint = null;
   myStage = null;
   super.destroy();
  }
 }

}
首先我們取得stage,然後偵聽他的觸控事件。(23行)
用getMovement方法取得手勢移動時的座標變量(38行)
覆寫update() (49行)
如果有移動變量movePoint的話,就用triggerVALUECHANGE發出變量改變的訊息。
 triggerVALUECHANGE帶兩個參數,第一個是變量的名稱,第二個是變動的值。
可以利用這個方法把手勢的移動量傳出去。
覆寫destroy 把該清理的清一清..
這樣子我們的InputController就完成了。
接下來只要把作好的TuochInputController套在戰鬥機上就可以了。
打開Fighter物件,先把上一次的移動DEMO的地方跟判斷Loop移除,之後我們要打移動改成使用 TuochInputController來控制。
打開MainStarlingState場景,在initialize加上
//加入TuochInputController控制
_ce.input.addController(new TuochInputController);
_ce.input.actionTriggeredVALUECHANGE.add(moveFighter);

用addController方法把剛剛作的TuochInputController物件add到_ce.input裡面,然後有變量改變時就執行moveFighter這個方法。

public function moveFighter(inputAction:InputAction):void 
  {
   //取得移動變量並且套用在速度velocity
   var _arr:Array = [_ce.input.getActionValue("movX") * 80, _ce.input.getActionValue("movY") * 80];
   fighter.velocity = _arr;
  }
用getActionValue把變量抓出來,然後在用變量去改變戰鬥機的速度,好了之後你就可以輸出到移動裝置,現在你可以用觸控的方法來移動戰鬥機了。
程式碼下載 
















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

2013年7月21日 星期日

Flash遊戲引擎 CitrusEngine (八) 開始你的第一個行動APP遊戲吧 - 試著製作一個CitrusEngine角色元件

接下來我們開始試著製作一個元件。
整理一下遊戲的素材..(如果你懶得自己作,可以先用我做好的)

CitrusEngine裡的元件都是CitrusObject,所以我們作的元件只要繼承CitrusObject就可以把他add到CitrusEngine使用。
首先我們開始製作一個角色在畫面上,開一個新的Class。

package  
{
 import citrus.objects.CitrusSprite;
 
 /**
  * 戰鬥機
  * @author Cain
  */
 public class Fighter extends CitrusSprite 
 {
  public function Fighter(ob_:Object = null) 
  {
   super("Fighter", ob_);
   updateCallEnabled = true; //自動update
   registration = "center"; //素材居中
  }
  
  override public function update (timeDelta:Number) : void
  {
   super.update(timeDelta);
   
  }
  
  override public function destroy () : void
  {
   super.destroy();
  }
 }

}
寫一個Fighter(戰鬥機) Class 他繼承CitrusSprite,CitrusSprite也是一個CitrusObject,不過他有更多的顯示控制可以讓你使用。
這裡要覆寫update與destroy這兩個function, 如果updateCallEnabled這個屬性是true的話,CitrusEngine就會再每個影格去呼叫update並且傳入與上一格間格的時間(timeDelta), 當你移除這個元件時CitrusEngine也會自動呼叫destroy去銷毀這個元件。
元件的註冊點預設是在左上角,可以把registration 設成 center,把註冊點改成居中。
這樣子一個元件的版型就製作完成了。

回到主畫面的MainStarlingState,我們把戰鬥機加到畫面上。
package  
{
 import citrus.core.starling.StarlingState;
 import flash.display.Bitmap;
 import starling.textures.Texture;
 import starling.textures.TextureAtlas;
 import citrus.view.starlingview.AnimationSequence;
 /**
  * ...
  * @author Cain
  */
 public class MainStarlingState extends StarlingState 
 {
  [Embed(source = "Material.xml", mimeType = "application/octet-stream")]
  static private const MaterialXml:Class;
  [Embed(source = "Material.png")]
  static private const MaterialImage:Class;
  private var textureAtlas:TextureAtlas;
  public function MainStarlingState() 
  {
   super();
  }
  
  override public function initialize () : void
  {
   super.initialize();
   //素材宣告
   var _xml:XML = XML(new MaterialXml());
   var _bmp:Bitmap = new MaterialImage() as Bitmap;
   var _texture:Texture = Texture.fromBitmap(_bmp);
   textureAtlas = new TextureAtlas(_texture, _xml);
   //戰鬥機
   var _animationSequence:AnimationSequence = new AnimationSequence(textureAtlas, ["m1"], "m1", 30, true);
   var fighter_Ob:Object = {
     x : _ce.stage.fullScreenWidth >> 1,
     y : _ce.stage.fullScreenHeight >> 1,
     view:_animationSequence
    };
   var fighter:Fighter = new Fighter(fighter_Ob);
   add(fighter);
  }
  
  override public function destroy () : void
  {
   textureAtlas.dispose();
   textureAtlas = null;
  }
 }

}
首先宣告素材,先作一個textureAtlas素材庫,然後在作一個戰鬥機的動畫顯示的View (AnimationSequence的使用法,之前的教學有提到,忘記的同學可以再回去複習一下)。
我們把戰鬥機的位置(x y)設成居中,然後把動畫元件設成他的view。
然後把他add到畫面上,就可以先輸出看看結果。

戰鬥機置中,然後螺旋槳會旋轉...
感覺不夠過癮,接下來我們再 Fighter加上一些東西讓他動起來。
把Fighter的velocity設成[0,-100]。 velocity屬性可以設定物件的移動速度(18行),我們傳入一個陣列0, -V,代表x與y的速度。 update中,判定一下戰鬥機是否到達螢幕頂端y小於0 輸出前改一下輸出的設定,把底色改成藍色(海),影格率放首調到60。

你會看到你的彈鬥機從下方往上移動,然後一直loop這個動作。
目前都是在模擬器上執行,版型預設的模擬器是NexusOne(480x800),如果你想看一下其他不同尺寸機型可以打開專案下的Run.bat檔,第17行的地方目前是設定set SCREEN_SIZE=NexusOne,你可以把NexusOne改成iPad(768x1024)或iPhone(480x640)iPhoneRetina(960x1280)或iPadRetina。

接下來我們先輸出到行動裝置上看看效果,以下以Android為例子,(IOS認證比較煩瑣,有機會再與各位分享)。
1.首先執行一次專案bat資料夾裡的CreateCertificate.bat,會在cert裡面產生一個p12的檔案。
2.打開專案下的run.bat,第7行的地方,goto desktop,意思是輸出到桌面模擬器,你可以把這行前面加上兩個冒號註解起來,然後把下面的::goto android-test前面的2個冒號移除,這樣只要在接上Android裝置的情況下就可以直接輸出到裝置上。
如果順利的話,你就可以再你的裝置上看到剛剛的畫面了。

專案下載

Flash遊戲引擎 CitrusEngine (九) 開始你的第一個行動APP遊戲吧 -用 InputController 操作你的角色

2013年7月11日 星期四

Flash遊戲引擎 CitrusEngine (七) 開始你的第一個行動APP遊戲吧 - 開始一個CitrusEngine APP專案

實作過之前的教學,相信您已經對CitrusEngine有一定程度的瞭解了,它可以讓您很輕鬆的作出像是超級瑪麗類型的遊戲。
不過這套引擎,並不是只能作這樣類型的遊戲,以下教程,我們將換換口味,用CitrusEngine來製作一個直式捲軸設計遊戲(老玩家都知道的1943),透過實作這個遊戲,讓你更理解如何自己定義遊戲中的元件。
首先準備一下素材,筆者在網路上找這了這張圖片XD
處理一下,拿來當範例使用(建議你可以自己準備,因為我不會畫圖,只好拿人家的圖來玩..)
這次我們順便來試試CitrusEngine在行動裝置上效能如何,用你的FlashDevelop打開一個AIR Mobile AS3 APP專案。(我是用FlashDevelop4.4.2)
開好之後先輸出一次,有打開一個空白的模擬器畫面,確認工作無誤。
一開始開發,我們先在模擬器上作測試,等到有一個成果,再試著發佈到行動裝置上..
首先得去下載我們需要的CitrusEngine SWC,到CitrusEngine官網的下載頁,這次我們不需要用到Box2D,所以下載Citrus + Starling + Feathers就行了。
下載好了之後,放到你的專案裡,並記得把它Add to Library。
接下來改一下Main.as



package 
{
 import citrus.core.starling.StarlingCitrusEngine;
 import flash.desktop.NativeApplication;
 import flash.events.Event;
 import flash.display.Sprite;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 import flash.geom.Rectangle;
 import flash.ui.Multitouch;
 import flash.ui.MultitouchInputMode;
 
 /**
  * ...
  * @author Cain
  */
 public class Main extends StarlingCitrusEngine 
 {
  
  public function Main():void 
  {
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.align = StageAlign.TOP_LEFT;
   stage.addEventListener(Event.DEACTIVATE, deactivate);
   
   // touch or gesture?
   Multitouch.inputMode = MultitouchInputMode.TOUCH_POINT;
   
   // entry point
   setUpStarling(true, 1, new Rectangle(0, 0, stage.fullScreenWidth, stage.fullScreenHeight));
   state = new MainStarlingState();
   // new to AIR? please read *carefully* the readme.txt files!
  }
  
  private function deactivate(e:Event):void 
  {
   // make sure the app behaves well (or exits) when in background
   NativeApplication.nativeApplication.exit();
  }
  
 }
 
}
打開手機專案,實際上,FlashDevelop已經幫你加上一些可能必要的程式碼,所以我們也只要稍加修改就可以讓它支援CitrusEngine。
首先把Main改成繼承StarlingCitrusEngine (17行)。
然後啟動Starling(30行),考慮手機上的效能,最好還是使用Starling,第一個參數先設成true,把效能顯示打開,第3個參數場景大小,由於各行動裝置上的解析度不一,所以這裡直接抓整個螢幕大小stage.fullScreenWidth, stage.fullScreenHeight。
(31行)我們設定一個場景state,這個Class等等作,先打上...
(38行)的NativeApplication.nativeApplication.exit();註解先取消,我們希望這個遊戲退出前景時就關起來。(關於這裡,你可以自己選擇,如果你不希望接個電話就關閉,你可以先註解起來)
再來我們new一個舞台場景MainStarlingState
package  
{
 import citrus.core.starling.StarlingState;
 /**
  * ...
  * @author Cain
  */
 public class MainStarlingState extends StarlingState 
 {
  
  public function MainStarlingState() 
  {
   super();
  }
  
  override public function initialize () : void
  {
   super.initialize();
   //以下開始寫吧...
  }
 }

}
場景很單純,這個MainStarlingState繼承StarlingState,然後複寫它的 initialize(),初始化後你就可以開始快樂的開發行動裝置遊戲了。
如果你真的懶得自己作,可以下載我寫好的專案..

Flash遊戲引擎 CitrusEngine (八) 開始你的第一個行動APP遊戲吧 - 試著製作一個CitrusEngine角色元件

2013年5月26日 星期日

新案上架-夜市彈珠

這個小遊戲是使用Starling與Box2D引擎開發,然後使用Flash Air輸出APP! 過程從製作到上架只用了2天,用Flash作APP真的是又快又方便呀!

APP Store
Flash版

2010年5月19日 星期三

阿Cain的YouTube音樂撥放器 V 1.1

如果你常常在YouTube上面收聽MTV
其實這是一件很不方便的事
這時候你可以使用這個Flash AIR 的桌面小軟體
你可以把你喜愛的歌曲加入歌曲列表,以後收聽時都跟收聽MP3歌曲一樣的方便

載點 => 阿Cain的YouTube音樂撥放器 V 1.1

如果下載後雙擊不能安裝, 請先安裝
Adobe AIR 套件
就可以正常安裝了