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)と組み合わせるといいのかなぁ?