2007年7月12日木曜日

波紋のエフェクト


「HSPでSTGを作っていくblog」(kt.さん運営)のラスタースクロールに影響を受け、作成。
kt.さんの載せていらっしゃるスクリプトは動作も軽くループに組み込んでも問題ないのですが、こちらはかなり重いです。awaitを外しても変わらないほど。ひとつのネタとしてお楽しみください。

この記事に限り転載・引用は禁止です。転載・引用可になりました。(2007/7/14)
※細部を修正。(2007/7/14)
#define ctype round(%1) double(strf("%%0.0f"%1)) // 四捨五入(hspmathより抜粋)
#const  CONST_A     0.2 // 定数その1。波長を決定付ける。
#const  CONST_B     7   // 定数その2。屈折の程度を決定付ける。

    buffer 1
    onclick goto *start

*start
    onclick 0
    dialog "jpg;*.gif;*.bmp"16
    if stat == 0 : end
    gsel 1 : picload refstr
    sizeX = ginfo_winx
    sizeY = ginfo_winy
    centerX = ginfo_winx / 2
    centerY = ginfo_winy / 2

    screen 0, sizeX, sizeY, SCREEN_NORMAL
    gcopy 100, sizeX, sizeY
    gmode GMODE_MEM, 11
    title "変換中…"
    redraw 0
    boxf
    repeat sizeY : targetY = cnt
        repeat sizeX : targetX = cnt
            pos targetX, targetY

            // 中心から見た座標を算出。
            dx = targetX - centerX
            dy = targetY - centerY

            // 中心から見た角度と距離を算出。
            theta = atan(dy, dx)
            dist  = sqrt(dx * dx + dy * dy)

            // ここがポイント。sinで屈折する距離を決めています。
            // ラスタースクロールのスクリプトのほうが分かりやすいかもしれません。
            copyX = centerX + round(cos(theta) * (dist + sin(dist * CONST_A) * CONST_B))
            copyY = centerY + round(sin(theta) * (dist + sin(dist * CONST_A) * CONST_B))
            gcopy 1, copyX, copyY
        loop
        await 10
    loop
    redraw 1
    title "変換終了 - クリックで再開"
    onclick 1
    stop

2 件のコメント:

kz3 さんのコメント...

ellerさんのブログをRSSTickerに登録しました^^

eller さんのコメント...

おおっ、ありがとうございます。
そこそこの頻度で更新していければと思っていますので、今後もごゆるりとお付き合いくださいませ。