Hatena::ブログ(Diary)

senzogawaのNな日々 このページをアンテナに追加 RSSフィード

2004 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2011 | 01 | 03 | 04 | 05 | 06 |
2012 | 01 | 08 | 09 |
2013 | 02 |

2006-09-08

一文字ずつエフェクト処理

| 一文字ずつエフェクト処理を含むブックマーク 一文字ずつエフェクト処理のブックマークコメント

 某所で文章と画像の並列処理として、一文字ずつ表示して処理する方法が挙げられていた。

 面白そうだったので、単純なもので試してみて、以下に置いておいた。

http://senzogawa.s90.xrea.com/dl/paralleleffect.zip


 動作としては、一文字ずつ出力しながら、徐々に背景の特定箇所をズームアップしていくだけ。

 一応、なんとなくうまくいっているようには見える。


 ただ、非力なPCではdraw処理が重いせいか、waitなしでも充分にウェイトがかかる。

 非力と言っても、CPUは1GHzで、512MB以上のメモリは積んでいるから、このままなら低スペックマシン向けにはよろしくない処理だ。


 また、イベントを受け取る隙間がほとんど無いのか、処理の仕方がまずいのかわからないが、処理中は右クリックに反応してくれない。

 一応、以下にもソースをさらしておくので、何か分かる方は、性能の改善点だけでも教えていただけるとありがたい。

0001: ; 文章表示と並列にズームエフェクトをかけるテスト
0002: ; 分岐処理を外すため、コールバックにしてみた。
0003: *define
0004: textgosub *ontext
0005: defsub setontexec
0006: defsub clearontexec
0007: defsub callontexec
0008: defsub putbychar
0009: defsub setmode
0010: numalias arg,0
0011: numalias btn,1
0012: numalias efcount,2
0013: numalias elapse,3
0014: numalias onbtndef,4
0015: numalias mode,5
0016: numalias ontexec,6
0017: numalias putcount,7
0018: numalias text,8
0019: numalias pos,9
0020: game
0021: 
0022: *start
0023: setmode *normal
0024: erasetextwindow 0 ; これが無いとちらつきが酷い。
0025: mov %elapse,1 ; setwindowとかに使ってる値をそのまま使うと非力なPCで遅いかも。
0026: bg "screen.bmp",1
0027: クリックで開始
0028: \
0029: setontexec *dozoom,"0,16" ; 左ズームなので、右方向にずらす
0030: putbychar "「今は俺が話しているところだろうが!」 "
0031: setontexec *dozoom,"0,-16" ; 右ズームなので、左方向にずらす
0032: putbychar "「いえ、私と話しているところです。」  "
0033: clearontexec
0034: \
0035: 通常表示に戻る。\
0036: end
0037: 
0038: ; ズーム
0039: ; 前提:20文字、640x480
0040: *dozoom
0041: getparam s%arg
0042: split $%arg,",",%efcount,%pos
0043: drawclear
0044: drawbg2 320+%pos(%efcount+1),240,100+10(%efcount+1),100+10(%efcount+1),0
0045: drawtext
0046: draw
0047: itoa $efcount,%efcount+1
0048: itoa $pos,%pos
0049: mov $%arg,$efcount+","+$pos
0050: return
0051: 
0052: ; textgosubのコールバック
0053: *ontext
0054: btndef clear
0055: gosub $onbtndef
0056: textbtnwait %btn
0057: if %btn==-1 systemcall rmenu:goto *ontext ; 隙間が無いらしく、イベントが入ってこない・・・
0058: *ontextend
0059: callontexec $arg ; コールバックがあれば呼び出す。
0060: saveon
0061: texec
0062: return
0063: 
0064: ; モード指定
0065: *setmode
0066: getparam $mode
0067: if $mode=="*putbychar" mov $onbtndef,"*btntimer":return
0068: ; 通常モード時はコールバックを初期化しておく。
0069: mov $onbtndef,"*nop"
0070: clearontexec
0071: return
0072: 
0073: ; 面倒なので動的コールバックしない
0074: *btntimer
0075: btntime %elapse
0076: return
0077: 
0078: ; コールバック登録
0079: ; コールバックにはここで登録した引数が渡される。
0080: *setontexec
0081: getparam $ontexec,$arg
0082: return
0083: 
0084: ; コールバック呼び出し
0085: *callontexec
0086: goto $ontexec
0087: 
0088: ; コールバック解除
0089: *clearontexec
0090: setontexec *nopontexec,""
0091: return
0092: 
0093: ; 1文字ずつ表示してコールバック
0094: *putbychar
0095: getparam $text
0096: setmode *putbychar
0097: len %text,$text
0098: mov %putcount,0
0099: *putbychar_loop
0100: mid $putcount,$text,%putcount2,2
0101: puttext $putcount+"/" ; @/と書くと何故か改行されてしまうので別々に。
0102: @/
0103: inc %putcount
0104: if %putcount*2>=%text puttext "":setmode *normal:return
0105: goto *putbychar_loop
0106: 
0107: ; 何もしない
0108: *nop
0109: return
0110: 
0111: ; 何もしないontexec
0112: *nopontexec
0113: getparam s%arg
0114: return

トラックバック - http://d.hatena.ne.jp/senzogawa/20060908