ttp://hsp.tv/play/pforum.php?mode=all&num=27463
前スレに書きましたが、文字で描いた絵(以下AA)を連続表示して動画のようにするスクリプトです。
#include "hspdx.as" #include "sysval.as";トラックバー関連 #include "gblconst.as";トラックバー関連 #include "winapi32.as";この中でuser32.dllのDrawTextがfuncされています #include "extrackbar.as";トラックバー関連 #include "d3m.hsp" #include "hgimg3.as" ;http://www.tcn.zaq.ne.jp/akasy005/hsp.htmのfps処理です #uselib "winmm.dll" #func timegettime "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int timeBeginPeriod 1 onexit goto *finish timegettime:lasttime=stat; ;------------------------------- *set maximg=2847;0.txt〜2847.txtまであり、何番まで読み込むか fontsize=2;フォントサイズ 2の倍数のみ sizex=fontsize*640;AA1枚当たりの横サイズ 実際は639 sizey=fontsize*480;縦サイズ 実際は479 scon=0;再生/一時停止の切替変数 con=0;再生/停止の切替変数 screen 0,4000,3000,1,0,0;画面初期化(4000x3000) pos 0,0 : button gosub "LOAD",*load;LOADを押すとAAをロードします objmode 2,0 : font "Webdings" : objsize 50;再生ボタンのフォント pos 100,0 : button gosub "4",*start : objenable 1,0 ;再生 font "wingdings";停止ボタンのフォント pos 160,0 : button gosub "n",*stopa : objenable 2,0;停止 trackhwnd=Createtrack(0,220,3,600,20) : trackrng trackhwnd,0,1000,0 ;トラックバー作成の関数です *main;メインループ if con=1 : gosub *draw :koma+ ;もしcon=1(再生状態)ならばdrawへ飛び、コマを一つ進める gosub *waittime goto *main *load;画像をロード bufferへ25枚ずつ書き込みます 2849枚やると10分ほどかかります objenable 0,0;LOADボタンを使用不可にします notesel p1;p1に確保 repeat maximg/25+1;bufferを確保します buffer cnt+5,sizex*25,sizey,1;念のためcnt+5 font "MS ゴシック",fontsize;予めセット await 0 loop repeat maximg+1;1つのbufferに25枚ずつ描画します noteload str(cnt)+".txt";0.txtから連番でtxtファイルがあるため gsel cnt/25+5;25枚描画する毎に次のbufferへと移ります pos (cnt\25)*sizex,0;これは要るかわかりません rect = (cnt\25)*sizex,0,(cnt\25)*sizex+sizex,sizey;1枚描画する毎に右へずれます DrawText hdc , p1, -1, varptr(rect), 0;APIで描画 gsel 0 title str(cnt) await 0 loop gsel 0 objenable 1,1 : objenable 2,1;再生、停止ボタンを有効に font "MS ゴシック",12,0 return *start if scon=0 :scon=1 : con=1 : objprm 1,";" : else : con=0 : scon=0: objprm 1,"4" ;一時停止状態(scon=0)または停止状態なら再生状態(scon=1,con=1)に、 ;再生状態(scon=1)なら一時停止状態に(scon=1) ;"4"は一時停止のフォントです return *stopa con=0:scon=0:objprm 1,"4";停止状態に koma=0;コマ数をリセット settrackpos trackhwnd,0;トラックバーを左端へ return *draw settrackpos trackhwnd,(koma*1000/maximg);トラックバーをコマ数に合わせて移動 redraw 0;描画停止 palcolor 255;白 boxf;全消し palcolor 0;黒 pos 0,30 gcopy koma/25+5,(koma\25)*sizex,0,sizex,sizey;bufferからコピーします fps=d3getfps() ;fps取得 pos 820,0 : mes "fps:"+str(fps) pos 860,0 : mes str(koma+1)+"/"+str(maximg+1) ;各種状態を描画(fps、コマ数、再生時間) redraw 1;描画 if koma>=maximg : goto *stopa;再生時間を越えたら停止します return ;fps処理用 *waittime repeat timegettime if stat-lasttime>32:lasttime=stat:break if stat-lasttime<=1:await 0:timegettime;余裕があればウェイトを挟んでCPU利用率を下げる loop timegettime:lasttime=stat;ウェイトの為に今の時間計測 return ;--------------------------------------------- *finish timeEndPeriod 1:end
mesはDrawTextに置換えることで解決しまして、無事に再生できましたが、
フォントサイズを大きくすると再生中に突然真っ白になる問題が発生しました。
恐らくメモリ不足か何かでbufferにDrawTextできていないのだと思います。
(メモリは3GB積んでるのでHSPの制限?)
フォントサイズ2で成功したと思い込んでいましたが、
実際は1000枚ほど再生した後真っ白になりました。
フォントサイズ6にすると100枚ほどでおわってしまいます。
1つのbufferに25枚描画するなど試してみましたが、特に変化は見られませんでした。
HSPに何らかの制限があるとすれば私にはお手上げです。
メモリの問題となるとこの方法では無理ですよね・・・他の方法を示唆して頂くだけでも構いませんので、
どなたかご回答宜しくお願いします。