2007年11月11日日曜日

閉塞領域の塗りつぶし

ペイントツールお約束の機能も、APIを使えば簡単に実装できます。
昔はSRPGの経路探索を応用したりしてモジュールを組んでたのですが……今思えば結構無茶してますね。

なおHSP2.61用のスクリプトはCrimson Forestさんにあるようです。
// 参考
// http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpgdi/html/_win32_extfloodfill.asp
#include "gdi32.as"
#module
#const FLOODFILLSURFACE 1
// カレントカラーで(x, y)を含む同色領域を塗りつぶす
// 実際の画面に反映させるには redraw 1 を実行すること
#deffunc fill int x, int y
    // カレントカラーを記憶
    current_color = ginfo_rginfo_gginfo_b

    // カレントカラーからブラシを生成
    CreateSolidBrush (ginfo_b << 16) | (ginfo_g << 8) | ginfo_r
    if stat {
        hBrush = stat
    } else {
        dialog "ブラシの生成に失敗しました。プログラムを終了します。"1
        end
    }
    SelectObject hDC, hBrush

    // 塗りつぶす色を取得
    pget x, y

    // 塗りつぶし実行
    ExtFloodFill hdc, x, y, (ginfo_b << 16) | (ginfo_g << 8) | ginfo_rFLOODFILLSURFACE

    // 後始末
    DeleteObject hBrush
    color current_color(0), current_color(1), current_color(2)
    return
#global

    repeat 5
        hsvcolor 191 * cnt / 5255255
        boxf rnd(640), rnd(480), rnd(640), rnd(480)
    loop
    onclick gosub *do_fill
    stop
*do_fill
    hsvcolor rnd(192), 255255
    fill mousexmousey
    redraw 1
    return

2 件のコメント:

  1. いつも拝見しております。
    どうしても一つお聞きしたいことがありますので、
    失礼ながらも書かせて下さい。
    もしよろしければヒントかサンプルスクリプトを
    お教えて願います。

    もしよろしければ1つ教えて頂きたいことがあります。

    HSPの場合、exec "C:\\Program Files\\Ma…
    といった感じで\\を二ついれる必要がありますが、
    iniファイル等で
    [Path]
    dir=C:\Program Files\Ma\mp3
    といった感じで\一つでセーブされているとします。
    HSPのスクリプト上でどうやって\\とするものか悩んでおります。

    フリーソフトウェアで
    ファイルパスなど保存される時必ず\は1つ
    になっているのでexec実行する際どうしているのかなと

    返信削除
  2. はじめまして。HSPTV!の掲示板で質問されている方でしょうか?

    HSPTV!の該当スレッドで既に優れた回答がいくつも出ているので、私がこれ以上説明できることはないと思います。
    以下他の方と同じようなことを書きますが、最後まで読んでください。

    検証用の短いプログラムをたくさん作って、色々と試してみることをお勧めします。ここでキーになるのは、Meganeさんらが仰っている「円記号を表現するために\\と書かなければならないのは、スクリプトの中だけ」ということです。
    例えば下記スクリプトを実行して、デバッグウィンドウで変数sの中身を確認してください。

    s = "\\"
    assert

    次に、「\」ひとつだけを書いたテキストファイルを「test.txt」という名前でHSP3本体があるフォルダに保存し、前回と同じように次のスクリプトを実行してください。

    notesel s
    chdir dir_exe
    noteload "test.txt"
    assert

    両方同じ結果が得られているはずです。

    私の勝手な推測ですが「スクリプトの中だけ」という言葉を難しくとらえ過ぎているのでしょう。ここで言うスクリプトの中だけとは、「スクリプトエディタで文字列として記述する時だけ」ということです。
    以上を踏まえて、もういちど掲示板のスレッドをはじめから読み直してみてください。健闘を祈ります。

    返信削除