ラベル CoronaSDK の投稿を表示しています。 すべての投稿を表示
ラベル CoronaSDK の投稿を表示しています。 すべての投稿を表示

2012/05/09

Corona SDKでサーバから画像をダウンロードして使う

CoronaのAPIリファレンスを眺めていたところ display.loadRemoteImage( ) というAPIを見つけて、「あぁサーバにある画像を読み込んで表示するんだろうな」と内容を確認してみたところ、サンプルに
display.loadRemoteImage( "http://developer.anscamobile.com/demo/hello.png", "GET", 
                                               networkListener, "helloCopy.png", system.TemporaryDirectory, 50, 50 )
とURLとは別に画像ファイル名が指定されていた。もしやと思いざっと解説を確認してみたところ、どうやらサーバにある画像を読み込んで表示するだけではなく、保存もされるらしい。わずか一行で画像のDLと保存が可能だと!これは試しておかねばと思い立ったw

せっかくなので、複数ファイルを扱います。サンプルではコード内に画像のファイル名を書いていますが、実際に使う場合は画像のリストをWebから取ってきたり、DBからもらってきたりすると思います。まぁ、そういったコードはそれぞれの仕様にあわせて実装してくださいw
あと、画像がダウンロード済みかどうかの判定も必要ですね。
local _W, _H = display.contentWidth, display.contentHeight

local server = "http://example.com/img/"
local count = 0

local imgList = {
 {name = "01.jpg"},
 {name = "02.jpg"},
 {name = "03.jpg"},
 {name = "04.jpg"},
 {name = "05.jpg"},
 {name = "06.jpg"}
}

local networkListener = function(event)
 if event.isError then
  print("NETWORK ERROR: Download Failed.")
 else
  display.remove(event.target)  --(2)
  event.target = nil
  count = count + 1
 end
 print("RESPONSE: "..event.response)
 
 if count == #imgList then --(3)
  local img = display.newImage(imgList[1].name, system.DocumentsDirectory)
  img.x = _W/2
  img.y = _H/2
 end
end

for i = 1, #imgList do
 display.loadRemoteImage(server..imgList[i].name, "GET", 
     networkListener, imgList[i].name, system.DocumentsDirectory) --(1)
 i = i + 1
end
(1)順番にdisplay.loadRemoteImage()を読んで画像をダウンロード
(2)リスナーとしてnetworkListener()が呼ばれますが、そのままだと画像が表示されてしまうので、
display.remove(event.target)
event.target = nil
でリムーブします
(3)確認のため、全画像がダウンロードされたら1枚目の画像を表示を表示させてます

思いつきでやってみましたので、この方法が良いのかどうかわかりません。
ですが多分何かの役にたってくれそうな気がします。
最近Daily Buildで実装されたLuaFileSystem(LFS)と組み合わせるといいのかなぁ?

2012/02/02

Corona SDKで日本語のアプリ名をつける方法

昨日の勉強会でも質問に挙がっていましたが、最初問題になるところですよね。
ということで現状私がやっている方法をまとめてみました。


まずはiOSの場合。

build.settingsplist"CFBundleLocalizations"の設定を追加します。
下記の場合は"ja"と"en"を設定しました。
※plist周りについてはネイティブでの開発の情報をググるといいと思います

--build.settings(抜粋)
settings =
{
  ...
  iphone =
  {
    plist =
    {
      CFBundleLocalizations = {
        "ja",
        "en",
      },
      ...
  },
  ...
}
さらに追加した言語にあわせ下記のようにファイル
ja.lproj > InfoPlist.strings
en.lproj > InfoPlist.strings
を作成します。


それぞれファイル内には"CFBundleDisplayName"を設定します。

・ja.lproj/InfoPlist.strings
CFBundleDisplayName = "なでうさぎ";


・en.lproj/InfoPlist.strings
CFBundleDisplayName = "NadeUsagi";


これでビルドするとiPhoneの言語環境が日本語の場合は「なでうさぎ」と表示され、英語の場合は「NadeUsagi」と表示されるアプリになります。


※日本語および英語以外の場合も「NadeUsagi」と表示されるようです。
 他2〜3言語で試した限りはそうでした
※言語コードを増やせば他言語のアプリ名も付けられるようになります
※Buildダイアログの「Application name:」は「nadeusagi」のまま変更は加えていません
※ひとつのバイナリで言語に合わせたアプリ名に出し分けることが可能ということになります


さて次はAndroidの場合です

Buildダイアログの「Application name:」を変更します。
日本語のアプリ名にしたい場合は「nadeusagi」を「なでうさぎ」と変更してビルドします。


簡単ですね。といきたいところですが、このアプリは日本語以外の環境でも「なでうさぎ」と表示されます。

※残念ながらひとつのバイナリで言語に合わせたアプリ名に出し分けることはできないようです
こうやればできるといった情報をお持ちの方がいらっしゃったら、ぜひご教授ください。

日本でしかリリースしないアプリであればこれでOKだと思いますが、ビジネス的にはそんなことは考えにくいので、アプリのリリース先(国)との兼ね合いで別アプリにするとか、英語名に統一するとかの判断が必要なのかも知れませんね。

そういえば以前Coronaの会のMLに投稿された日本語+半角英字のアプリ名も実機転送までは問題なくできました。すでに修正されてるみたいです。


ちなみに、アプリ内のテキストを言語毎に切り替えて多言語対応のアプリにしたい場合は、下記のブログで紹介されている方法がわかりやすかったです。

Corona SDK: Localization made easy - BLOG - Monkeybin
http://monkeybin.no/blog/archives/2011/09/18/corona-sdk-localization-made-easy/

Storyboard API [Corona SDK]

2/1に渋谷のGMOさんで開催されたCoronaSDK 勉強会 in 渋谷にてLTをしてきました。

日本Coronaの会の山本さんから「LTしませんか?」と振っていただいたので、せっかくの機会なので軽くお話しさせていただいた次第です。

お題は最近Corona SDKに実装された「Storyboard API」にしました。
※iOS5のStoryboardとは別物です

このAPIは以前紹介したDirector Classの機能を本家が実装したもので、自分自身でも調査の必要があったのと、"Hello World"の次には、こういった「画面遷移や画面管理の機能を勉強すべき」と思っているので、これからCorona SDKをやってみようという方には良いのでは?と思ったからです。

スライドはこちらになります。
最初は公開されているサンプルを説明したスライドを作成していたのですが、もう少し実用的なサンプルがあった方が良いよなぁと思いはじめてしまったので、追加で「CoronaSDKでゲームっぽいものを作ってみた」のアプリをStoryboard APIに直したものをGithubに公開しました。
https://github.com/keygx/PacPacDroid

Storyboadの他にもPhysicsやcollision等も使っていますので、これからCoronaでアプリをつくってみたいと思っている方や、"Hello World"の次に進みたいんだけど情報が無いwとお悩みの方などのお役に立てれば幸いです。
ただ、メモリ管理とかに気を配ってないので、もしかするとアレかも…

イベントの方は盛況であったと思います。
一番前に座ったのと、自分のLTばかりに気がいってあまり周りを見る余裕がなかった(反省点1)
あと自分のアプリをもう少し宣伝した方が良かったなぁ(反省点2)

色々と良い経験をさせていただきました。
ありがとうございました。

2012/01/11

Spriteloqを使ってみた

Corona SDKは2Dゲームエンジンといってよい(それだけじゃないですが)開発環境なので、Sprite Sheetの機能を持っています。
http://developer.anscamobile.com/reference/index/sprite

Sprite Sheetを利用することでアニメーションが実現できるわけですが、アプリ開発においては、そのアニメーションの素材となる画像をどうやって用意するかということも重要になります。

さて皆さんもご存じのように、Flashというアニメーション制作ツールがあります。
おそらく(間違いなく?)世界で最も使われているアニメーション制作ツールでしょう。

そこで『Spliteloq』です。
Flashで作成したアニメーションをCorona SDKのSprite Sheetへと出力できるツールです。
http://www.loqheart.com/spriteloq/

おおまかな手順としては以下のようになります。
・Flashでアニメーションを作成
・Flashのエクステンション(予めインストールしておく)にてSWFsと.luaを出力
・Spliteloqにて、SWFsを読込、1枚の画像へ
・SpliteloqからSprite Sheetの画像ファイルおよびコードを出力
・Corona側でSpliteloqのライブラリを利用してSprite Sheetとして扱えるようになる


なんだか文章で書くとよく分かりませんねw
Flash側のこともあるので、説明がしづらい…

ではサンプルをどうぞ



※Flashでのアニメーションの作り方、ライブラリでのシンボルの置き方にも決まりがあるようで、
 正しく表示されるまで試行錯誤が必要でした
※その辺り実はまだあまり良く分かってません
※このサンプルではうさぎと太陽がアニメーションしています。そして背景も含め、まとめて
 Flashから持ってこれました。これは便利!
※ワンクリックでFlashからCoronaへとはいきませんが、すべて手作業でやることに比べたら、
 かなりの省力化になると思います
※FlashとCoronaでアプリ開発の分業も可能かもしれません

2012/01/04

アイコン/スプラッシュ画像の確認にCorona SDKを使う

スマートフォン関連のデザインをやっていると、PCの画面で見ている時と、実際にデバイス上に落とし込んで見ている時の印象の違いに「ほぅ!」って思うことも多々あります。(※イメージと違うわーってことです)

特にアイコンやスプラッシュ画像をデザインする際は、ロゴが潰れてないか、文字が読めるのか、またiPhone/iPad/Androidで画面サイズや画角が異なっているので、それぞれにバランスを調整しつつレイアウトしたりと(単純にリサイズしているだけじゃないんですよー。下記の画像を見比べてみてくださいねw)、気を遣う部分も多いので、必ず実機にインストールした状態での確認が不可欠です。

自作のアプリであれば開発の最終段階あたりで作業するので、実機にインストールしての確認も何ら問題なくできるのですが、アイコン/スプラッシュ画像のデザインのみ依頼を受けた場合等、組み込むアプリが手元にない場合はダミーのアプリを作って確認することになります。

前置きが長くなりましたが、ここからが本題です。
確認用のダミーアプリには「Corona SDK」が向いているということに気付きました。

私の場合はiPhone/iPad/Androidのダミーアプリをそれぞれ用意し、スプラッシュ画像をスプラッシュとしてではなく、アプリの背景画像として使用することで、じっくり確認できるようにしています。そして、このダミーアプリの画像(複数解像度のアイコンおよびスプラッシュ)を上書き>ビルド>実機転送>確認のサイクルを繰り返してブラッシュアップを行っています。

もう少しメリットを具体的にいうと
コードが短い(さらにファイル一式用意してしまえば、後は画像の差し替えのみ)
アプリ名をビルド時に変えられる(フォルダ名を変えてしまうのでもOK)
IDEに縛られない(自由だし小回り効くし)

といったところでしょうか。
なお実機転送は無料トライアル版でも可能です。



こちらは昨年末、株式会社あゆた様のご依頼で作成したものです。上記以外にもストア/マーケット用の画像も作成させていただきました。ARを使ったおもしろいアプリですので、一度お試しあれ。詳細はリンク先ページにて。

[iPhone,iPad,Android] "Christmas on a table AR" / "机の上のクリスマスAR"

2011/11/23

Corona SDKでのDrag & Drop基本サンプル

新しく取りかかり始めたアプリでタッチ操作によるDrag&Dropを実装しようと思い、以前にclipしておいたこのページのDrag&Dropのサンプルコードを動かしてみました。
-- create object
local myObject = display.newRect( 0, 0, 100, 100 )
myObject:setFillColor( 255 )

-- touch listener function
function myObject:touch( event )
  if event.phase == "began" then
    self.markX = self.x    -- store x location of object
    self.markY = self.y    -- store y location of object
  elseif event.phase == "moved" then
    local x = (event.x - event.xStart) + self.markX
    local y = (event.y - event.yStart) + self.markY
    self.x, self.y = x, y    -- move object based on calculations above
  end
  return true
end

-- make 'myObject' listen for touch events
myObject:addEventListener( "touch", myObject )
実際に動かしてみるとわかるのですが、タッチ操作(指の動き)にオブジェクトが追従してきません。最初はfpsが低いのかなとも思ったのですが、60fpsに設定しても変わりませんでした。

ソース的には何も間違っていないような印象があったのですが、別のサンプルコードを見つけて納得しました。上記のコードでは指の動きが少しでも早くなると、オブジェクトに対するイベントがすぐに外れてしまうため、操作に対する追従が悪かったのです。

実践的というか使えるコードとしては以下の様になります。
-- create object
local myObject = display.newRect( 0, 0, 100, 100 )
myObject:setFillColor( 255 )

-- touch listener function
function myObject:touch( event )
  local t = event.target
  local phase = event.phase
  if("began" == phase) then
    display.getCurrentStage():setFocus(t)
    t.isFocus = true
    t.x0 = event.x - t.x
    t.y0 = event.y - t.y
  elseif(t.isFocus) then
    if("moved" == phase) then
      t.x = event.x - t.x0
      t.y = event.y - t.y0
    elseif("ended" == phase or "cancelled" == phase) then
      display.getCurrentStage():setFocus(nil)
      t.isFocus = false
    end
  end
  return true
end

-- make 'myObject' listen for touch events
myObject:addEventListener( "touch", myObject )
オブジェクトに対する操作(イベント)が終わるまでフォーカスが外れないようになっています。
これで指をグリグリ動かしてもオブジェクトが追従してくれるようになりました。

せっかくタッチパネル向けにアプリをつくるなら、ボタンをタップするだけじゃなくて、指で操作させたい(したい)ですよね。

2011/09/17

Director ClassとAndroidのKEYイベント[Corona SDK]

Corona SDKでAndroidのKEYイベントを取得し、Backキーでひとつ前の画面に戻ったり、Menuボタンで設定画面に遷移したりといった処理を行おうとした際に、Director Classを使っている場合には、ちょっとした注意が必要です。(もちろん私もハマりましたよw)

先日リリースした「Cutie Horoscope」でもAndroidではキー操作によって“戻る”と“メニュー画面を表示”を行っています。
※実際の動きは、アプリをDLして確認ください。

最初はアンスカのAPI解説ページを見て、取得したKEYイベントにあわせてdirector:changeScene()で画面遷移できるんだろうと思って、そのようなコードを書いてみたのですが、画面遷移のアニメーションが効かないという状況に。。。

あれ?

この時すでにライセンスを購入済みだったのでForumを検索してみると、あっ、あった!
「Android device back button utilizing Director class」というタイトルのトピックが立てられていました。

あー、色々と小細工的な処理が必要なようです。
※Forum見られる方はそちらへ。サンプルのソースが載ってます

下記に「Cutie Horoscope」のソースを抜粋して解説します。





new = function ( params )
  
  --(略)--
  
  local localGroup = display.newGroup()
  
  --ポイント1--
  local backButtonPushed = false
  local menuButtonPushed = false
  
  --(略)--
  
  --ポイント2--
  local animate = function( event )
    if backButtonPushed == true then
      backButtonPushed = false
      os.exit()
    elseif menuButtonPushed == true then
      menuButtonPushed = false
      director:changeScene( "setting", "overFromBottom" )
    end
  end

  local onKeyEvent = function( event )
    local phase = event.phase
    local keyName = event.keyName
    
    if phase == "up" and (keyName == "back") then
      backButtonPushed = true
    elseif phase == "up" and (keyName == "menu") then
      menuButtonPushed = true
    end
    
    return true
  end
  
  --(略)--
  
  --ポイント3--
  function clean ( event )
    Runtime:removeEventListener( "key", onKeyEvent )
    Runtime:removeEventListener( "enterFrame", animate )
    backButtonPushed = nil
    menuButtonPushed = nil
  end
  
  local initVars = function ()
    
    --(略)--
    
    --ポイント2--
    Runtime:addEventListener( "key", onKeyEvent )
    Runtime:addEventListener( "enterFrame", animate )
    
    --(略)--
    
  end
  
  initVars()
  
  return localGroup
  
end

ポイントは3つ
1.ボタンが押されたことを判別するフラグを用意する
2.enterFrameイベントでそのフラグを判定して遷移等の処理を行う。KEYイベントはどのキーが押されたか、フラグを書き換えるだけ
3.cleanメソッドでイベントリスナーとフラグの解除を行う

上記の様にしないと、遷移時のエフェクトが掛かりません。そして、イベントの解除等をしないと、最初に設定したイベントが有効のままになってしまうようで、Backキーを押した時に戻る画面が違って何故?ってことになります。

動かし方がわかれば、後はキーと遷移時のエフェクトの組み合わせをうまくやれば、ネイティブ・アプリ(Javaで開発したアプリ)のような動作が可能になります。

2011/09/16

Corona SDKでアプリをリリースする際に起こった「えっ!?」ってこと

Corona SDKでのアプリ開発では、色々と問題も起きます。今回はちょっとキビシイ現実を書きます。

下記は「Cutie Horoscope」のbuild.settingsファイルの中身です。

settings =
{
  iphone =
  {
    plist =
    {
      MinimumOSVersion="4.0",
    },
  },
  android =
  {
    versionCode="2",
    versionName="1.1",
    installLocation="preferExternal",
  },
}

まず、iOS向けに「MinimumOSVersion="4.0"」が設定してあります。
これはiTunes Connectにファイルを送信し終えた時に、たまたまBinary Detailsをクリックすると、なんということでしょう「Minimum OS Requirements」が「3.1」に、そして「Supported Architecture」が「armv6, armv7」になっているではありませんか!
「Coronaは4以上で固定ではなかったのかよ〜」と、あわててファイルを削除し、「MinimumOSVersion="4.0"」を加えることによって回避することにしました。実際に最初にUPした設定のファイルをオーガナイザ経由で第1世代のiPod touch(iOS 3.1.3、armv6)の端末にインストールすることが可能でした。(起動はしますが、表示が崩れるとか使えない状態だったので、気付かなかったら、非常に危ないところでした)
Daily Build版を使用しているので、たまたまデグレが起こったのかも知れませんが、今後「MinimumOSVersion」は必ず設定しようと決めました。

次にAndroid向けに「installLocation="preferExternal"」が設定してあります。
これもおかしな現象なのですが、デバッグ・ビルドにおいては、端末にインストールしたアプリはSDカードに移動可能でしたので、デフォルトでそうゆう設定になっているのだろうと思っていたのですが、いざリリースしてみると、SDカードに移動できません。なんでやねん!ってことで、すぐさま修正版をリリースすることに。
※アプリの動作には関係ないですが、アプリのファイル容量が大きいので必ずやっておきたい設定です

まあこんな感じで、Coronaでの初リリースで色々とトラブル?に見舞われました。もしこのトラブルがだれか他の方に起こり「Corona使えねぇよ!クソがっ!」って評価をされていても、しょうがないと思います。実際半分ぐらい私もそう思っています。
※これは評価されるタイミングに用意できてない方が悪いので

あと「versionName="1.1"」ってなってますが、マーケットでの表示は「1.0」のママです。中の人はあまり細かいことには関心がないのかも知れません。

今回は否定的な事も含め、こうゆう現実があることも知っていて欲しいと思い、起こったことを書きました。
しかしながら、Corona SDKが私にとって作りたいと思ったアプリを一番作りやすかった開発環境であることには変わりませんので、この状態が続く限り、Coronaを使っていると思います。

この記事が、同じように躓いたりハマったりすることがあった方に、少しでも役に立てたら嬉しいです。

※私はアンスカのまわし者ではないですし、正直Coronaを広めたいとか考えていません
※人に「ぜひ使うべき」とか「勧めやすい」とは思っていないという意味です

タブレット向けにアプリ作りたいなぁ。

2011/09/14

Director Class 入門 [Corona SDK]

アプリ開発を通していくつか書きたいCorona SDKネタがあるのですが、まずはこの「Director Class」について言及して置く必要があるだろうと。

そこで今回は、LTする気持ちでスライドを作成してみました。


現状Corona SDKで実際にアプリをリリースしようと思ったときに必要な情報が無さ過ぎるので、今後もできるだけ情報発信していきたいと思っています。

2011/08/31

Corona SDKでiPhone/Androidアプリをリリース

【予告】Corona SDKでiPhone/Androidアプリをリリース(予定)で予告したアプリをリリースしました。

アプリ紹介サイト
iTunesストア
Androidマーケット




スクリーンショットを見ていただければ分かるように、女性をターゲットにしたアプリです。
※動画はiPhoneで見せていますが、Androidでも全く同じUI(デザイン)です

このアプリをひと言で表すと「ピンク色の端末に似合うアプリ」です。

Corona SDKでアプリ開発をしようと思った経緯は前回書いた通りなのですが、実際にアプリのアイデアを検討している際に、以下の点から、本アプリを開発することを決定しました。

・無料の星占いAPIを見つけた点
(試してもらうために無料アプリとしてリリースしたかったので)

・カスタマイズ度の高いアプリとして女性向けにデザインされたアプリというのが合致している点
(女性向けというのはある意味分かりやすいかな?いや難しいか?)

・同類アプリが数多くリリースされている中で、デザインの差別化がどれだけ通用するか見たかった点
(本当にデザインは重要なのか? また、通用するデザインをつくることができるのか?)

・自分自身あまりやらないテイストのデザインに挑戦したかった点
(個人的なテイストとはかけはなれているので、デザインには通常よりも時間がかかりました。しかしながら、デザイナとして要件を満たすデザインは出来なくては!また出来るからこそデザイナです)

Corona SDKで開発したアプリ、しかもゲームではなくツール系で、なおかつ上記のような意味合いも含んだテストケースアプリとして、どこまでの結果が残せるか期待も込めて、しばらくは見守っていきたいと思っています。
※もちろんメンテナンス的アップデートや、プロモーション的なことはやっていきますよ!

ぜひダウンロードしてみてください m(_ _)m

Cutie Horoscope - keygx
Cutie Horoscope - keygx

Cross-platform Mobile App Development Showcase


2011/08/26

Corona SDKでSqlite3を使う時の簡単なまとめ

Corona SDKでSqlite3を使ったアプリ開発をした際に躓いたりしたので、簡単にまとめておこうと思います。

アプリ内ですからそんなに複雑なSQL文はありません。しかし、SQLの種類によって関数の使い分けが必要でした。最初そこが分からずに意図した値が返ってこないことに悩みました。
そう、値が返ってくるかどうかが、ポイントだったのです。

下記のサンプルコードを見ていただくと分かるのですが、簡単にいうと、SELECT文の時は db:row() や db:nrows() を使い、CREATE文やINSERT文の時は db:exec() を使います。
※くわしくはこちら

ドキュメントの読解力が足りず、COUNT関数の実行に db:exec() を使い、ずっと0しか返って来ない… ってことを延々やっていたわけです(^_^;)
お恥ずかしい
-- Include
require("sqlite3")

-- DB SETUP
local path = system.pathForFile("test.db", system.DocumentsDirectory)
db = sqlite3.open(path)
print("DB PATH: "..path)

local tableName = "User"
print("TABLE NAME: "..tableName)

-- Create Table
db:exec([[CREATE TABLE IF NOT EXISTS ]]..tableName..[[ (id INTEGER PRIMARY KEY, name, age); ]])

-- Insert Data
local name = "hoge" 
local age = 20
db:exec([[INSERT INTO ]]..tableName..[[ VALUES (NULL, ']]..name..[[',']]..age..[['); ]])

-- Count
for row in db:rows([[SELECT COUNT(*) FROM ]]..tableName..[[; ]]) do
  print("ROWS: "..row[1])
end

-- Select Data
for row in db:nrows("SELECT * FROM "..tableName) do
  print("NAME: "..row.name)
  print("AGE: "..row.age)
end

-- Update
age = 30
db:exec([[UPDATE ]]..tableName..[[ SET age=]]..age)
for row in db:nrows("SELECT * FROM "..tableName) do
  print("NAME: "..row.name)
  print("AGE: "..row.age)
end

-- Delete
age = 40
db:exec([[DELETE FROM ]]..tableName..[[ WHERE age < ']]..age..[['; ]])
for row in db:rows([[SELECT COUNT(*) FROM ]]..tableName..[[; ]]) do
  print("ROWS: "..row[1])
end

--
実行結果はこうなります。
※まるごとmain.luaとしてコピペで実行できるように書きました。途中ageの代入式が度々出てくるのはその為です
※上記コードには記述していませんが、適切にDBのCLOSE処理が必要です
Corona SDK≫Docs≫Data and Files≫Database (SQLite)
 
最後にTipsとして、Corona SimulatorのFile > Show Project Sandbox というメニューを選択すると、ローカルに保存されている.dbファイルの場所を開いてくれます。 この.dbファイルをLita等のGUIツールで開けば、データをGUIで確認したり、SQL文のテスト等に使えて大変便利でした。

2011/08/25

【予告】Corona SDKでiPhone/Androidアプリをリリース(予定)

ここ2ヶ月ほど、Corona SDKでのアプリ開発を試行錯誤しつつも進めており、やっとアプリをAppleに申請中というステータスになりました。
※Androidは審査がないので、いつでもリリース可ですw

そもそもCorona SDKでアプリを出そうと思ったきっかけは、まぁ気に入ったからという一言で片付けてしまってもいいのですが、あえて言うと「UIが自由に作れるということは、同じUIでiPhoneとAndroidアプリがつくれそう」という理由からです。

Corona SDKは一般的には2Dゲームに向いたプラットフォームだと思われています。これには全く以て同意なのですが、アプリの画面(シーン)を管理するDirector Classというライブラリを使った時に「普通のアプリと同じような画面遷移が作れるんだ!」ということは「普通のアプリっぽい画面を作れば、ゲームじゃないアプリも作れるよね」「だったらiPhone/Android共通のUIを作って、ワンソースで両対応のアプリを作ってみたい」となったわけです。
※最近、iPhone/Androidそれぞれの標準UIを見飽きてきた感があったのと、もうそろそろ、デザインによるアプリの差別化が本格化すると思ってます

まずは、タイトルバー、タブ、TableView(ListView)などをオリジナルでデザインしたUIのプロトタイプを作成してみました。
このプロトタイプで手応えを感じたので、リリースを目的とした(そしてCoronaのライセンスを購入する!)アプリ開発に取りかかることにしました。

色々な思惑もあり(カッコつけるとマーケティング的理由により)リリース向けのアプリは、プロトタイプで作ったデザインとは全く別物になりましたが、なかなかに良い出来です。プロトタイプで作ったUIも良いデザインなので、そのうち別のアプリで使おうと思ってます。無駄にはしません キリッ

今は、アップルに「そのまま審査通してくれ〜」と願いつつ、通知を待っています。
※リジェクトされたらされたでノウハウにはなるのですが…

『技術的に可能でもアップル的にはNGということは多くある』
という残念な結果にならないように

結果は後日!

2011/06/09

CoronaSDKでゲームっぽいものを作ってみた

ATNDで募集されていた【CoronaSDK】でスマートフォンアプリを作ろう!(全6回講座・デジハリ渋谷)に参加しました。

タイトルにある通り全6回の講座で、講師は「日本コロナの会」の代表 山本さんがつとめられていて、講座を通してアプリの完成(最後に発表)を目指します。こんな講座が無料とあっては参加するしかないと速攻申し込みをして、全6回を無事終了しました。(講師の山本さん、日本coronaの会の皆様、企画・運営されたHatchupの皆様、ありがとうございました)

以前のエントリにも書いている通り、私はJavaでのAndroidアプリ開発の他、Titanium MobileやAIR for Androidでもアプリ開発経験があり、以前からCoronaの名前は聞いていたものの、さわるのは今回が初めて「見せてもらおうかCoronaの性能とやらを」と興味津々でCoronaSDKの開発にチャレンジした次第です。

どんなものを作ったかは、発表のスライドとアプリの動画をご覧ください。



※Corona Simulatorで実行


スライドにも書いてありますが、CoronaSDK+Luaでの開発はコードが書きやすくて結構楽しかったです。またTitanium Mobileと比較した場合、直接的にかぶっている部分は少なく、使い分け(棲み分け)ができそう。と個人的には思っています。
※アプリによってCorona向き、Titanium向きがあると思います。例えば「ぐぐっと!急上昇ワード」のようなアプリは完全にTitanium向きなアプリです。

今回CoronaSDKで、初めて「ゲームっぽいもの」を作ることができました。ライトなゲームや自由なUIのアプリ開発にとても向いていると思います。

引き続きCoronaSDKをウォッチしていきたいと思います。


追記:上記アプリのStoryboard API版のソースを公開しました