なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこ3で複数の画像のロードを待つ

環境はwebkit

なでしこ3のwebkit版が自分的に扱いやすいです。
実行するとウィンドウができてそこで動くし、手軽にファイルを開くこともできる。

なでしこ1でフォルダ列挙してJSONエンコードして保存
なでしこ3でファイルを開いてJSONデコード。
ただし、ファイル名が日本語だと読めないような?

//なでしこ3スクリプト
「json.txt」ファイル読んだ時
   フォルダ一覧=対象JSONデコード
   フォルダ一覧セレクトボックス作成 

本題:反復して画像読む

なでしこ3で「画像描画」すると画像をロードして完了したものから描画されます。
画像描画を2行連続で書くと、ロード完了が早いほうが先に描画されます。

たとえば

[0,0]「立ち絵.jpg」画像描画  
[0,0]「表情.jpg」画像描画  

とか書くとおそらくファイルサイズの小さい表情が先に描画されて、後から立ち絵で上書きされそう。

それを防ぐために「画像逐次読む」「画像読んだ時」があるのだけど
逐次実行は「反復」と相性が悪く複数画像のロードに向かない。
複数画像に対して「画像読んだ時」を使うと扱いにくいプログラムになる気がする。

そんなわけで「画像読む」でロードして、ロード完了まで「画面更新時実行」で待つことにする。

ファイルを「画像読む」すると それ にImageオブジェクトが入る。
Imageオブジェクトの「幅」を「DOM属性取得」することで、ロード完了したかどうかがわかるようだ。

//なでしこ3スクリプト
!インデント構文
画像キャッシュ空配列

//配列にあるファイル名を全部読んで 画像キャッシュ@ファイル名 に入れる
●画像ロード(list)
 list反復
   file=対象
   画像キャッシュfileハッシュキー存在//2回同じファイルをロードしない
   もしそれ0ならば
     file画像読む
     画像キャッシュfileそれ //imageオブジェクトが入る

//幅が0ならロードおわってない。 全部ロードが終わったら1を戻す
●ロード完了チェック
 画像キャッシュ反復
   w=対象「幅」DOM属性取得 //対象=imageオブジェクト
   もしw0ならば0戻す //ロードが終わっていない画像がある
 1戻す //全部ロードした

//ここから
list=["1.jpg","2.jpg","3.jpg"] //たくさんの画像
画像ロード(list)
「ロード完了時」画面更新時実行

●ロード完了時
 もしロード完了チェック()0ならば
   「ロード完了時」画面更新時実行 //時間を空けてもう一度実行
   戻る
 違えば
   list反復 //たくさんの画像
     file=対象
     obj=画像キャッシュfile //imageオブジェクト
     obj[0,0]画像描画  //listの順番に表示される

#-----------------------------------------------------------------------

画像をメモリから消す

不要になったimageオブジェクトをメモリから消すには
「src」に空を設定して、NULLを入れると消える…らしい。
自信はない。
以下で動いている気がする。

#-----------------------------------------------------------------------
●イメージ解放(list)
 list反復
   file=対象
   画像キャッシュfileハッシュキー存在
   もしそれ1ならば
     obj=画像キャッシュ対象
     obj「src」DOM属性設定
     obj=NULL
     画像キャッシュ対象ハッシュキー削除
#-----------------------------------------------------------------------

…もう一度言うけど自信はないです!