おすすめ記事

【ブラシスクリプト】パラメータの定義と取得にKVCモデルを導入する利点

シェアする

この記事の所要時間: 624

今回はかなりマニアックなネタです。
ブラシスクリプト開発者の参考になれば幸いです。

更新履歴
2017/10/20 微修正
2017/07/10 公開

スポンサーリンク

始めに

mdiapp+ファミリー’(mdiapp+MediBang PaintJUMPペイント、他では、Luaスクリプトをつかってオリジナルのブラシをつくることができます。
これを‘ブラシスクリプト’(Brush Script)といいます。

このブラシスクリプトではブラシのパラメータ定義と取得を以下の形式で行います。

mdiapp開発報告所 – パラメータの扱い
function param1()
return “param1”, 0, 100, 50
end

function param2()
return “param2”, 50, 100, 75
end

function param3()
return “param3”, 10, 20, 15
end

――中略――

スクリプト内に param1(), param2(), param3() … という関数を定義しておくと、ブラシコントロールウィンドウでパラメータ設定、取得できるようになります (最大10個>param1 から param10 まで)。

mdiapp開発報告所 – パラメータの扱い
設定値はスクリプト内で、

local param1 = bs_param1()
local param2 = bs_param2()
local param3 = bs_param3()
local param4 = bs_param4()
local param5 = bs_param5()

といった形で取得できます。

この方法はとても簡単に理解できます。

しかし、後から複数のパラメータを追加したり、削除する場合弊害があります。

ブラシスクリプト・銀ペンを開発中に起こった弊害

以下で公開している‘銀ペン’は、‘mdiappファミリー’でつかえる吹き出し用のブラシです。

このブラシには「通常の‘銀ペン’」と、「マイナーチェンジ版の‘丸銀ペン’と‘角銀ペン’」が存在します。

【銀ペン】漫画制作が効率的に?メディペやmdiapp+で簡単ふきだし!【無料】
みなさんこんにちは。私は最近、もっぱら漫画ばかり描いています。それでも一向にうまくなりません。と思ったとか思わなかったとか。そんなこんなで、現在メインでつかっている「mdiapp+(naotaro氏作)」と「MediBang Paint(メディバンペイント)」。その二つでつかえる、フキダシを狙った位置に 狙った大きさで 自動でクチバシも描けるそんなフキダシ(吹き出し/ふきだし)用のブラシ...

このマイナーチェンジ版は、通常版のソースコードを流用して開発しています。

マイナーチェンジ版と通常版では使用するパラメータの数が異なります。そのため通常通りのパラメータ定義と取得をしていては、コードの流用時にパラメータの取得関連のコードを書きかえる必要が出てきます。

または、バージョンアップに際して、パラメータを増減する場合にも同じような問題が出てきます。

これは非常にメンドウです。

私はMS病(メンドウクサイことをすると死んじゃう病)にかかっているので、これはなんとかしなければなりません。

ということで、今回紹介する手法の登場です。

ブラシスクリプトのパラメータの定義と取得にKVCモデルを導入する

KVCモデル’(Key Value Coding Model)とは、キー値コーディングのことです。

平たく説明すれば、

データの定義・取得に対して直接的な方法を使用せず、間接的なキーを使用しておこなう方法

です。

Objective-C’(Wikipedia)や‘Struts’(Wikipedia)などのコーディング経験があればおなじみの手法です。

もちろんそんな経験がなくとも簡単に理解できます。

KVCモデルを導入する利点

KVCモデルを導入する利点は以下の3点です。

ポイント
KVCモデルを導入する利点

  • パラメータの増減に柔軟に対応できる
  • コード上のパラメータに名前を付与することで、可読性が向上する
  • (特に今回のコードなら)未使用になったパラメータでもコードの修正が不要

パラメータの定義と取得に、KVCモデルを導入したものと、通常の方法を比べる

通常の定義例

通常なら以下のように定義します。これではパラメータの追加修正、順序変更などでparam1などと記述している箇所を、全て自力で修正する必要があります。

パラメータ定義

function param1()
return “シッポ幅”, 0, 10, 2
end

値取得

tailWidth = bs_param1()

KVCモデルでの定義例

そこで、キー値を定義し、そのキー値を利用して定義と取得を行います。

キー定義

KEY_TAIL_WIDTH = “KEY_TAIL_WIDTH”

パラメータ定義

setParam(KEY_TAIL_WIDTH, “シッポ幅”, 0, 10, 2)

※ 各引数の定義は以下の通りです

  • 第1引数:キー値
  • 第2引数:画面上にだすパラメータの名称
  • 第3引数:パラメータの最小値
  • 第4引数:パラメータの最大値
  • 第5引数:パラメータの初期値

値取得

tailWidth = getParam(KEY_TAIL_WIDTH)

このように、キーとして定義した「KEY_TAIL_WIDTH」を用いて、「setParam関数」でパラメータを定義し、「getParam関数」でパラメータから値を取得します。

この時、パラメータの順序は「setParam関数」で定義した順番になります。

ちなみに「setParam関数」が、定義順序とキーの値に応じて、内部で「param1~param10」へ自動的に読み替えています。

使用しなくなったパラメータの処理も簡単

「setParam関数」は以下のように「第3・第4引数に0を指定」すると、このパラメータは使用しないものとみなして、パラメータの定義から除外します

setParam(KEY_TAIL_WIDTH, “シッポ幅”, 0, 0, 2)

この状態で「getParam関数」を用いてパラメータの値を取得すると、自動的に「第5引数(パラメータの初期値)」を返却します。

このように自動的に初期値を返すため、内部でそのパラメータを使用しても問題が起こりません。

ようするに使用しなくなったパラメータは、その定義を一か所だけ変えれば修正が完了します。

KVCを利用することの欠点

この方法は確かに便利で利点もおおいのすが、ほんの少しの欠点も存在します。

ポイント
KVCを利用することの欠点

    • ファイルサイズが増える
    • 値取得時にオーバヘッドが生じる

パラメータを動的に定義するといった処理が増えるため、どうしてもファイルサイズが増えます。

また、直接値を取得するよりもオーバヘッド(余分な処理)が生じます。

そもそもオーバヘッドといってもほんの少しの条件判定が起こるのみです。

またボトルネックとならないようにループ処理の外部で予めパラメータを取得しておけばよいため、オーバヘッドは微々たるものであり、問題にはなりえません。

ソースコード

以下の内容をブラシスクリプトの先頭部に追加してください。それ以外、何も意識することはありません。

このコードの著作権は放棄しませんが、ご自身の責任において自由に改変し、改造し、配布して頂ければ幸いです。

なお、パラメータの個数が10件を超えた場合、10番目のパラメータが「PARAM_FLOW」と変更されて表示されます。パラメータは10個までしかつかえないことは、ブラシスクリプトの仕様ですので修正してください。

無論、無視するよう指定したパラメータは、この件数には含まれません。


-- Copyright 2017 ganohr.net All right reserved.
params_count = 0
params = {}
defs = {}
DEFAULT_SIZE = "DEFAULT_SIZE"
USE_BASE = "USE_BASE"
PARAM_NOT_SET = -1
function setParam(paramKey, value1, value2, value3, value4)
  if (paramKey == DEFAULT_SIZE) then
    default_size = createParam(value1, value2, value3, value4)
  elseif (paramKey == USE_BASE) then
    use_base = createParam(value1, value2, value3, value4)
  else
    params[paramKey] = PARAM_NOT_SET
    defs[paramKey] = value4
    if(value2 == 0 and value3 == 0) then
      return
    end
    params_count = params_count + 1
    if(params_count > 10) then
      param10 = createParam("PARAM_FLOW", 0, 0, 0)
      return
    end
    
    params[paramKey] = params_count
    if(params_count == 1) then
      param1 = createParam(value1, value2, value3, value4)
    elseif(params_count == 2) then
      param2 = createParam(value1, value2, value3, value4)
    elseif(params_count == 3) then
      param3 = createParam(value1, value2, value3, value4)
    elseif(params_count == 4) then
      param4 = createParam(value1, value2, value3, value4)
    elseif(params_count == 5) then
      param5 = createParam(value1, value2, value3, value4)
    elseif(params_count == 6) then
      param6 = createParam(value1, value2, value3, value4)
    elseif(params_count == 7) then
      param7 = createParam(value1, value2, value3, value4)
    elseif(params_count == 8) then
      param8 = createParam(value1, value2, value3, value4)
    elseif(params_count == 9) then
      param9 = createParam(value1, value2, value3, value4)
    elseif(params_count == 10) then
      param10 = createParam(value1, value2, value3, value4)
    end
  end
end

function createParam(value1, value2, value3, value4)
  return function()
    return value1, value2, value3, value4
  end
end

function getParam(paramKey)
  if(params[paramKey] == 1) then
    return bs_param1()
  elseif(params[paramKey] == 2) then
    return bs_param2()
  elseif(params[paramKey] == 3) then
    return bs_param3()
  elseif(params[paramKey] == 4) then
    return bs_param4()
  elseif(params[paramKey] == 5) then
    return bs_param5()
  elseif(params[paramKey] == 6) then
    return bs_param6()
  elseif(params[paramKey] == 7) then
    return bs_param7()
  elseif(params[paramKey] == 8) then
    return bs_param8()
  elseif(params[paramKey] == 9) then
    return bs_param9()
  elseif(params[paramKey] == 10) then
    return bs_param10()
  else
    return defs[paramKey]
  end
end

余談

このコード内にある「createParam」の記述には、以下のkasariさんのサイトである「P10MEMO」にて公開されている「SpeedPen」のコードを参考にしています。

これにKVCモデルを導入し、デフォルト値処理などを追加したのが今回紹介しているコードです。

そして、私が漫画作成するときは自作の「トキペン」と、こちらの「SpeedPen」の二つを使っています。

この場を借りてお礼申し上げます。ありがとうございます!!

※ トキペンは以下で公開しています。

【メディペ】漫画ペン入れに最適!?トキペンを公開!【コミラボ】
みなさんこんにちは!mdiappファミリー(mdiapp+・コミラボ+・MediBang Paint他)でつかえるブラシ・スクリプトである、‘トキペン’を無料公開します!このトキペンは、DPI制御機能を搭載しているうえに、様々な表現が可能なため、漫画のペン入れや塗り表現にもってこいです! 更新履歴 2017/07/21 ver0.0.4公開。 2017/06/09 記事公開。ver0.0.2公開。

最後に

今回はブラシスクリプトを開発している方向けのチップス的な記事となりました。

現在、多くの方々にブラシスクリプトを作って頂けるよう、解説記事を作成中です。今回の内容をそちらの記事にも含める予定です。

ただし、この記事よりももっと分かりやすく書く予定です。この記事の内容が理解し辛かった方も、今しばらくお待ち頂ければ幸いです。

>