Category Archive: FlashDevelp

[iPhone][AIR]FlashDevelopにてaneを含んだiPhoneアプリのビルド方法

FlashDevelop(以下FD)のAIR Mobile AS3 AppプロジェクトにてANE(Native Extension for AIR)ファイルを含んでのipaファイルが書き出せたので手順をメモしておきます。


aneファイルはSTICKSPORTSさんが公開されてるANE-Silent-SwitchとANE-Game-Centerの二つを使ってみます。
どちらもDLしたサンプル一式の中にテスト用のドキュメントクラスが入っていますので、それを組み合わせてふたつの機能を持ったipaを作ってみます。

SilentSwitchはいわゆるマナーモードスイッチのこと。
ハードウェアスイッチのオンオフでサウンドのオンオフをする機能です。
(AIR for iOSだけではこの機能を使えない)
GameCenterはオンラインランキング等の機能が使えます。

この二つでとりあえずユーザーフレンドリーな簡単なゲームが作れますよね。


以下、必要なもの

  1. Windows環境(FlashDevelop使うので)
  2. FlashDevelop 4.0.3(現状での最新)
    http://www.flashdevelop.org/
  3. Flex 4.6 SD(現状での最新)
    http://www.adobe.com/devnet/flex/flex-sdk-download.html
  4. AIR 3.3 SDK(現状での最新)
    http://www.adobe.com/devnet/air/air-sdk-download.html
  5. aneファイル
    ANE-SilentSwitch
    ANE-Game-Center
    (テスト用ドキュメントクラスも含む)
  6. iOS 5.1 SDK
    (Xcode4.3からフォルダ抽出:macが無いと無理かも)
  7. iPhoneアプリ証明書ファイル(.p12)
  8. プロビジョニングファイル(.mobileprovision)

※5,6,7はiOS DevCenterより入手(要iOS developper登録)


手順

0.AIR 3.3 SDK対応のFlex 4.6 SDKを作る
DLしたAIR SDKをFlex SDKのフォルダに上書きコピー
(Flex SDKのフォルダ名をflex_sdk_4.6_air3.3としました)


1.FDで新規プロジェクト(AIR Mobile AS3 App)を作る


2.aneファイルとswcファイルをlibフォルダに格納し[ライブラリに追加]
・aneファイル2つとswcファイル1つ

  • StickSports-ANE-Silent-Switch-b70e35b\bin\SilentSwitch.ane
  • StickSports-ANE-Game-Center-a2d0263\bin\GameCenter.ane
  • StickSports-ANE-Silent-Switch-b70e35b\test\libs\sounds.swc

(aneファイルが入ってるフォルダ内のswcは使いません)


3.テスト用ドキュメントクラスをsrcフォルダに格納
(GameCenterExtensionTest.asをドキュメントクラスに)

  • StickSports-ANE-Silent-Switch-b70e35b\test\src\SilentSwitchExtensionTest.as
  • StickSports-ANE-Game-Center-a2d0263\test\src\GameCenterExtensionTest.as

4.GameCenterExtensionTest.asを修正

public function GameCenterExtensionTest()
{
	shape = new Shape();
	shape.graphics.beginFill( 0x666666 );
	shape.graphics.drawCircle( 0, 0, 100 );
	shape.graphics.endFill();
	shape.x = 0;
	shape.y = 240;
	addChild( shape );
	
	feedback = new TextField();
	var format : TextFormat = new TextFormat();
	format.font = "_sans";
	format.size = 16;
	format.color = 0xFFFFFF;
	feedback.defaultTextFormat = format;
	feedback.width = 320;
	feedback.height = 260;
	feedback.x = 10;
	feedback.y = 210;
	feedback.multiline = true;
	feedback.wordWrap = true;
	feedback.text = "Hello";
	addChild( feedback );
	
	addEventListener( Event.ENTER_FRAME, animate );

	GameCenter.init();
	createButtons();
	
	//以下の2行を追加
	var silentSwitch:SilentSwitchExtensionTest =  new SilentSwitchExtensionTest();
	addChild(silentSwitch).y = 230;
}

5.証明書ファイルとプロビジョニングファイルをcertフォルダへ格納
必要ファイルのプロジェクトへの設置はこれで完了
↓のようになりました


6.bat/SetupSDK.batを修正
4行目に手順0で作ったFlexSDKのパスを記述

:: Path to Flex SDK
:: 例
set FLEX_SDK=E:\00_flash\flex_sdk_4.6_air3.3

7.bat/SetupApplication.batを修正
18~22行目のiOSに関する部分を設定

:: iOS packaging
set IOS_DIST_CERT_FILE=
set IOS_DEV_CERT_FILE=cert\hoge.p12
:: ↓証明書を書き出す際に設定したパスワード
set IOS_DEV_CERT_PASS=certification_no_passward
set IOS_PROVISION=cert\fortest.mobileprovision
set IOS_ICONS=icons/ios

35行目のapplication IDを設定

:: Your application ID (must match <id> of Application descriptor)
:: ↓プロビジョニングファイルに紐付けたApp ID
set APP_ID=bz.393.forTest

8.Run.batを修正
6~11行目あたりのtarget項目を修正

:target
::↓ここをコメントアウトする
::goto desktop
::goto android-debug
::goto android-test
::goto ios-debug
::↓ここのコメントアウトを解除
goto ios-test

14~18行目あたりのdesktop項目を修正

:desktop
:: http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-6fa6d7e0128cca93d31-8000.html
:: ↓をコメントアウト
:: set SCREEN_SIZE=NexusOne
:: ↓をコメントアウト解除
set SCREEN_SIZE=iPhoneRetina

9.application.xmlを修正

<?xml version="1.0" encoding="utf-8" ?> 
<application xmlns="http://ns.adobe.com/air/application/3.1">
	
	<!-- プロビジョニングファイルに紐付けたApp ID -->
	<id>bz.393.forTest</id>
	<versionNumber>0.1</versionNumber>
	<supportedProfiles>mobileDevice</supportedProfiles>
	<filename>SilentSwitchGameCenter</filename>
	
	<name>SilentSwitch-GameCenter</name>
	<description></description>
	<copyright></copyright>
	
	<android>
		<manifestAdditions><![CDATA[
			
			<manifest android:installLocation="auto">
				<uses-permission android:name="android.permission.INTERNET"/>
				<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>
			</manifest>
			
		]]></manifestAdditions>
	</android>
    <iPhone> 
        <InfoAdditions><![CDATA[ 
		
			<key>UIStatusBarStyle</key> 
			<string>UIStatusBarStyleBlackOpaque</string> 
			<key>UIRequiresPersistentWiFi</key> 
			<string>NO</string>
			<key>UIPrerenderedIcon</key>  
			<true/>
			<key>UIApplicationExitsOnSuspend</key>
			<true/>
			
			<key>UIDeviceFamily</key>
			<array>
				<!-- iPhone support -->
				<string>1</string> 
				<!-- iPad support -->
				<!--<string>2</string>-->
			</array>
				
        ]]></InfoAdditions> 
		<requestedDisplayResolution>high</requestedDisplayResolution>
    </iPhone> 
	
	<initialWindow>
		<title>SilentSwitch-GameCenter</title>
		<content>SilentSwitchGameCenter.swf</content>
		<visible>true</visible>
		<fullScreen>true</fullScreen>
		<!--<autoOrients>false</autoOrients>-->
		<!--<aspectRatio>landscape</aspectRatio>-->
		<renderMode>direct</renderMode>
	</initialWindow>
	
	<icon>
		<image48x48>icons/icon_48.png</image48x48>
		<image57x57>icons/icon_57.png</image57x57>
		<image72x72>icons/icon_72.png</image72x72>
		<image114x114>icons/icon_114.png</image114x114>
		<image512x512>icons/icon_512.png</image512x512>
	</icon>
	
	<!-- extensions要素を追加(ane内のクラスを指定するってことかな?) -->
	<extensions>
		<extensionID>com.sticksports.nativeExtensions.SilentSwitch</extensionID>
		<extensionID>com.sticksports.nativeExtensions.GameCenter</extensionID>
	</extensions>
	
	<!-- 
	AIR options:
	http://livedocs.adobe.com/flex/3/html/File_formats_1.html#1043413
	
	AIR mobile options:
	http://help.adobe.com/en_US/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffe.html
	
	Android manifest documentation:
	http://developer.android.com/guide/topics/manifest/manifest-intro.html
	-->
</application>

10.bat/Packager.batを修正
34~47のstart項目内の44行目を修正

if not exist "%CERT_FILE%" goto certificate
:: Output file
set FILE_OR_DIR=%FILE_OR_DIR% -C "%ICONS%" .
if not exist "%DIST_PATH%" md "%DIST_PATH%"
set OUTPUT=%DIST_PATH%\%DIST_NAME%%TARGET%.%DIST_EXT%
:: Package
echo Packaging: %OUTPUT%
echo using certificate: %CERT_FILE%...
echo.
:: aneファイルの入っているフォルダとiOS SDKのフォルダを指定する
:: (相対パスで指定する場合はプロジェクトのルートが基準)
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir lib/ -platformsdk E:/iPhoneOS51/
echo.
if errorlevel 1 goto failed
goto end

以上で準備完了です。


ctrl + Eneterでコマンドプロンプトが立ち上がり、大量のwarningが出ますが、distフォルダにipaファイルが書き出されます。
ipaの実機に転送がうまくいけばこんな画面が確認できます。

画面中央より上がGameCenter、下がSilentSwitchの操作となります。


動作確認の例として、[playSound1]を押すと音が鳴り始めます。
そのままiPhoneのサイレントスイッチ(いわゆるマナーモードのスイッチ)をオンオフしても音は鳴り続けますが、[silentSwitch]ボタンを押すとiPhoneのサイレントスイッチを切り替えることで音のオンオフが制御できるようになります。


GameCenterの確認方法は、iTunes Connect側での設定も必要です。
GameCenterExtensionTest.as内のleaderboardNameがiTunes Connectで設定したLeaderBoard IDと紐付けられますとなります。
achievementNameが、Achievement IDとなります。

これでFlashを使ってランキング機能付きのゲームも簡単に作れそうですね。


※その他、補足
aneファイルによってはiOS SDKの指定をせずともビルドできる場合があります。
その際、変更となるのは、手順10で以下のようになります

if not exist "%CERT_FILE%" goto certificate
:: Output file
set FILE_OR_DIR=%FILE_OR_DIR% -C "%ICONS%" .
if not exist "%DIST_PATH%" md "%DIST_PATH%"
set OUTPUT=%DIST_PATH%\%DIST_NAME%%TARGET%.%DIST_EXT%
:: Package
echo Packaging: %OUTPUT%
echo using certificate: %CERT_FILE%...
echo.
:: aneファイルの入っているフォルダのみを指定
:: (相対パスで指定する場合はプロジェクトのルートが基準)
call adt -package -target %TYPE%%TARGET% %OPTIONS% %SIGNING_OPTIONS% "%OUTPUT%" "%APP_XML%" %FILE_OR_DIR% -extdir lib/
echo.
if errorlevel 1 goto failed
goto end

aneファイルを作る際に使ったiOS SDKのバージョンに依存するみたい。
FlexSDKかAIR SDKのデフォルトで用意されてるiOS SDKがiOS4.2らしく、それでビルドされたaneファイルならiOS SDKを指定しなくてよいみたいです。
(最新のiOS SDKを指定しておけば下位互換があるかは試してません。。)

ちなみに現状Windows版のFlashCS6ではiOS SDKの指定ができないっぽいので上記2つのaneを実装したipaを作ることってできないんですよね。
WindowsでのiOS SDK指定が可能になったのはAIR3.3SDKからだからみたいです。

[FD]{の前の改行位置を自分流に変更する

FlashDevelopだと自動で生成してくれる構文が、デフォルトだと、{前に改行される。
こんな感じ

package  
{
	public class ClockData 
	{
		public function ClockData() 
		{
			
		}
	}
}

まぁ好みの問題で、{前は改行してくれない方が良いという場合。
(いわゆる私の場合)
これは設定ファイルを書き換えればコントロール可能。
Tool→ApplicationFilesで開いたフォルダ内のファイルを弄る。
たとえば、Templatesフォルダ内のProject→AS3Project内のClass.as.fdtを開いてみると、改行が入る場所に、
$(CSLB)という文字列があるのでこれを削除すれば改行されなくなる。
ほかにも適宜ファイルの$(CSLB)を消せば改行部分を削除可能。

※一点だけ、わかりにくかった場所・・・
ctrl+shift+1で生成させる部分の改行設定は、
Data→ASCompletion→Generator.txtにて設定可能。

[FD]日本語が文字化けするとき

なんかよくわからんけど、日本語文字化けしてるぞってときは、
tool→setting→MISC(その他)のFallback CodePageをUTF8に設定で直るとのこと。

↓詳細はこちら
参考サイト:タロタローグ ブログ

[AS]progressionでpreloaderのインスタンスにアクセスする方法

教えてもらったこと。
index.asにて

MovieClip(stage.getChildAt(0))

でpreloader本体を指定可能。

例)
preloader.flaに、hoge1_mcとかhoge2_mcとか置いてあった場合。
index.asからhoge1_mcにアクセスするには、

MovieClip(stage.getChildAt(0)).hoge1_mc

でOK

[FD]FlashDevelopで変数をgetter/setterにするときの注意

通常、変数にカーソル当ててctrl+shift+1をすると、getterとかsetter作れるショートカット。
このとき変数名に_(アンダーバー)は混ぜない方がいいみたい。

例えば、
var hoge_Hogege:String;
これをショートカットでgetter作ろうとすると、

public function get Hogege(): { return hoge_Hoge; }

このように、予期しない形になります。

ちなみに↓これは
var hoge_Ho:String;

public function get hoge(): { return hoge_Ho; }

こんな感じ。

なので最初からアンダーバーを含まないようにすれば
var hogeHoge:String;

public function get hogeHoge():String { return _hogeHoge; }

こんな感じ。
(そしていつもどおり元の変数にアンダーバーが付与)
(var _hogeHoge:String;)

[AS]最大値、最小値の上限を決めて返す公式

変数 = Math.min(Math.max(値 , 最小値) , 最大値);

例えば、

var randomNum:Number = Math.random()*100;
var maxNum:Number = 50;
var minNum:Number = 10;

var ans:Number = Math.min(Math.max(randomNum, minNum) , maxNum);

ただし、if文で作った方が処理的に速いらしい。
(Mathは遅いそうな)