SIHOのプログラミングわーくワク

興味の赴くままに勉強してたら、読み書きできる言語は9個になりました。他にもいくつか気になる言語があったりなかったり?  まだまだ続く、楽しいお仕事わーくワク♪

  • « 
  • 10 
  • 11 
  • 12 
  • 13 
  • 14 
  • 15 
  • 16 
  • 17 
  • 18 
  • 19 
  • 20 
  • 21 
  • 22 
  • 23 
  • 24 
  • 25 
  • 26 
  • 27 
  • 28 
  • 29 
  • 30 
  • 31 
  • »

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

iPhone開発でLuaを使う方法

2011.03.25 (Fri)

◇Luaのこと
Luaって言語があります。
iPhone/Androidの両方にビルドできるCorona SDKでも使用されているスクリプト言語です。
ゲーム開発では前々から使われているらしい。
理由は、処理が高速であることと開発の効率化にあるそう。

◇Luaでの開発経験
私にはゲーム開発の経験はないけど、国立天文台4D2Uプロジェクトで開発されたMitakaから派生したMitaka PlusでもLuaのスクリプトを使って、Mitakaのエンジンを動かす(=つまり宇宙空間で好きな場所&時間に行けちゃう!sample)ことができるので、そちらではLuaを触っていました。j
Mitakaを改変するなんて(ソースコードが公開されているから見てみたけど)とってもできないけど、Mitaka Plus+ Luaスクリプトなら、Mitakaを好きなようにコントロールできちゃう。
Lua自体は見た目不思議な書き方をします。
でも、2週間も本気でにらめっこしたらそこそこ書けるようになります。
見た目は全然違うけど頭の中ではjavascript的な設計脳でだいじょうぶです。
ちなみに、Mitaka pro + Luaで開発した事例は名古屋市科学館新館5Fの「デジタル惑星儀」です。
13個のコンテンツをあわせて「デジタル惑星儀」と呼ぶのですが、そのうちの「銀河群・銀河団」をちらみせ。
◇Objective-Cで開発するということ
自分自身はObjective-Cはだいぶ理解できたけど、やっぱり今まで経験した言語の中で一番難しい印象がある。
それに、一人でObjective-Cで開発するのは他の言語を扱っているときより開発時間もとても長い。
これは、書くコード自体が長い(ActionScriptに比べて3倍くらい?)ので物理的にどうしても時間がかかる。
「じゃぁ、何人かで分担できればイイじゃん!」って思ったけど、Objective-Cは簡単にマスターできるような言語じゃないのが大問題。

◇Objective-CとLuaで作業効率が上がるかも?
ゲームをはじめとする大規模開発で用いられているような、Lua+コア部分という開発手法をiPhoneでも活用できないかな?って思っていました。
どうせ分担するなら、簡単なスクリプト言語も組み合わせられると一挙両得だよね!っておもったわけです。

◇なぜ組み合わせるのか?
Objective-CならUIKitを使いやすい。
それに、ViewやViewControllerまわりも扱いやすい。つまり画面を回転したときの対応とかね、しやすいと思うのですよ。
Luaは主にその画面内の演出部分を受け持つことができないかなって思っています。
まだその辺は未トライだけど、画像をもちいてコマアニメみたいに順番に表示したり、画像を拡大縮小したりするようなものなら問題なくできると思うんですよねー。(たぶん)



ここから具体的な手順です。Xcodeは3.2.5、Luaは5.1.4を使用しています。

◇まずはLuaのインストール?
Luaのインストールから手順を説明しているページを最初に見ちゃったので、インストールしたけど、もしかしていらないような気がしています。なので、ここの手順を飛ばしてしまってもいいかも。
一応説明。ここでは、Lua5.1.4を使っています。

1)Luaをダウンロードします。
2)最新のMacPortsをダウンロードしてインストール
3)sudo ports install lua



◇次にLuaのライブラリを作る?
参考リンク:LuaとLuabindでiPhoneプログラミング
下記は抜粋。

1.Lua用ライブラリのプロジェクト(luaarm)をXCodeで作る
※プロジェクトの種類はCocoa Touch静的ライブラリとします。

2.Luaのsrcフォルダの中身(lua.cとluac.c以外)をすべてClasses/に入れる
3.シミュレータおよびデバイスの設定で、Releaseでビルドする
4.build/ディレクトリに出力されるluaarm.aを/opt/local/lib/などにコピー
5.iPhoneアプリのプロジェクトのアプリの[プロジェクトの情報]画面>ビルドタブの[検索パス]のヘッダ検索パスに「/opt/local/lib/」を登録


でも、これだと、シミュレーター用とデバイス用を別々に作らなくちゃいけない。
さらに、同じプロジェクトの2つのライブラリにリンクしておくと、シミュレーターのビルドのときにエラーで怒られる。


なので、下記の方法の方がいいのかも?
毎回コピーするのは面倒くさい気もするけど、こちらはデバイスでもシミュレーターでも怒られない。

◇iPhoneプロジェクトのフォルダーにluaのソースファイルをリンクする
参考リンク:iPhone上でLuaのHello Worldを実行

1)lua-5.1.4をダウンロードして解凍する。
2)src以下に含まれるソース(*.c, *.h)のうち次の2つ以外をiPhoneアプリのプロジェクトに登録する。
 lua.c,luac.c (これらはコマンドラインを使うときのものらしい)


このやり方なら、Lua自体のインストールさえ不要な感じ。
また、これだと、「[検索パス]のヘッダ検索パスに「/opt/local/lib/」を登録」することも不要。
やっぱり、これが一番実用的かも!

◇それでは、テスト
1.iPhoneプロジェクト(lua)を作る。
2.luaAppDelegate.mに次のメソッドを追加

-(void)hello{
lua_State *lua = luaL_newstate();
lua = lua_open();
luaopen_base(lua);
luaL_openlibs(lua);

//test.lua をよぶことにする。なかみはprint("Hello, World!\n")
NSString*homepath = [NSString stringWithFormat:@"%@/lua.app/test.lua",NSHomeDirectory()];

if(luaL_dofile(lua,[homepath UTF8String])){
printf("エラー\n");
}
lua_close(lua);
}


3.application: didFinishLaunchingWithOptions:の中に次の記述を加える。
 [self hello];//単に起動時に呼び出しているだけですね。
4.出力パネルに「Hello, World!」と表示されるはずです。
 これは、test.luaにかかれている「print("Hello, World!\n")」が実行された結果ですね。

◇最後に
luaL_dofileで呼び出すファイルの指定方法をたくさん検索したのですが、このように書いている方には一人もであえませんでした。みなさん、"test.lua"というシンプルな書き方をされていました。
"test.lua"と指定しても、(やり方が悪いのかもしれないけど)何度やっても出力されるのは「エラー」の文字だけ。
メソッドの記述方法が間違っていることはMacのみならずWindowsやLinuxでも同じ記述だったので、まず無いなと仮定して、パスの引き渡し方が悪いのだと何度もトライしました。
ふと思い立ってビルドされたアプリの中を見ると、luaファイルが入っています。
通常、プログラムファイルは入りませんよね。
ここで、思いついて、アプリのHomeDirectoryの中のtest.luaを呼ぶようにしたらBINGO!
見事に実行されました。
でも、変ですよね。
「スクリプトファイルなんだから、きちんとバイナリに入れてほしい!」
そう思って下記の1に入っていた"test.lua"を2に移しました。
1)グループとファイル>ターゲット>lua>バンドルソースをコピー
2)グループとファイル>ターゲット>lua>ソースをコンパイル
idousurukedo
そうしたら「warning: no rule to process file '$(PROJECT_DIR)/Classes/lua/test.lua' of type text for architecture i386」と怒られました。やっぱりダメみたい。なんか変だなー。
だれかもっといい方法があったら教えてくださいな。

おしまい。

コメント

スクリプトファイルはリソース扱いですね

失礼いたします。Objective-Cの中でLuaを動かすプログラムを書いている者です。スクリプトファイルは、Objective-Cのプログラムから見たら単なるデータ、つまりリソースという扱いですね。
スクリプトファイル(名前をtest.luaとする)は、プロジェクトに登録済なら、どこのディレクトリにおいていても以下の方法で実行出来ます。

NSBundle *bundle = [NSBundle mainBundle];
NSString *scriptFilePath = [bundle pathForResource:@"test"
ofType:@"lua"];
// 文字列変換
char *cpScriptPath = (char *)[scriptFilePath UTF8String];
// Lua Scriptの実行
iRet = luaL_dofile(luaState, cpScriptPath );

Re: スクリプトファイルはリソース扱いですね

アドバイス、ありがとうございます。
このコメントに気付いていませんでした。
結局、このときは、Luaを使わないで済ませちゃったんですよねー。
できるんですね!こんど試してみますー。

コメントの投稿

トラックバック

この記事のトラックバックURL

 | HOME | 

プロフィール

siho_prof

SIHO
しほ

Twitter:
SIHO_o

viva mambo, inc.
iPhone&iPad / Flash / Kinect
使用言語:Objective-C, ActionScript 3.0, Javascript, Lua, PHP, C#, C, C++, WSH。
F-site staff

Solar System Simulator 広報

Web,スマートフォン、Desktopを問わず、アプリ制作が好物。執筆は必要に応じて。お仕事くださいまし。

サイネージ:ガンダムフロント東京・キャラクターフォトスポット設計(2012/4~常設)

アトラクション:富士急ハイランド 戦国BASARA ゲーム設計&プログラミング(2010/7-2012/4にて常設展示)

イントラシステム:「某メーカー研究所KJ法システム」DB,Flash,PHPを含むソリューション設計&DB構築、「美術系専門学校の生徒管理システム」iPadクライアントを含むソリューション設計&DB構築

iPhone/iPadアプリ:某球団試合速報アプリ、『魂を熱くさせる 宇宙飛行士100の言葉』『Mitaka Gallery -てのひら宇宙-』

書籍同梱ソフト:『4次元デジタル宇宙紀行Mitaka』『DVD-ROM&図解 動く! 深海生物図鑑』『DVD-ROM&図解 ハッブル望遠鏡で見る宇宙の驚異』

著書:『世界一わかりやすい Windows 7』『世界一わかりやすい Flash CS3』

検索フォーム

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。