プレイ日記
おちゃめ ochame_nako
お絵描きソフトを作りたいけど線の太さを変える方法が分からないとか速く描いたら線が途切れ途切れになってしまって困っている初心者の方も多いと思います。 そこでそれを簡単に解決するBLINE命令を作りました。
15そうだね
プレイ済み
返信[1]
親投稿
おちゃめ ochame_nako
この命令をGLINEの代わりに使えば自由にペンの太さを変えることができどれだけ速く描いても線が途切れることがないお絵かきソフトを簡単に作ることができます。 公開キー【 QKX3NEJF 】、ファイル名「BLINE」です。 上記公開キーのプログラムでは動作サンプルとして超簡易お絵かきツールも用意しています。 PETIT PAINT QSPと同じく線の太さは押したボタンによって変わります。 ただし、消しゴム機能やアンドゥなどは用意していません。 あくまで線の描画機能の確認のためのものです。
2そうだね
プレイ済み
返信[2]
親投稿
おちゃめ ochame_nako
BLINE命令を使用する場合はX座標、Y座標はそれぞれ0~511の範囲内で指定してください。 太さは半径Rの値で指定しますが、実際に描画される太さは R*2 ドットではなく R*2+1 ドットとなります。 つまり、R=0を指定すれば太さ1ドットの線、R=1ならば太さ3ドットの線になるというわけです。 ちなみにこれをリスト短縮したものをお絵かきソフト「PETIT PAINT QSP」で使用しています。 https://miiverse.nintendo.net/posts/AYIHAAAEAABEVRTpctBKZg
1そうだね
プレイ済み
返信[3]
親投稿
おちゃめ ochame_nako
初心者向けにBLINE命令の動作原理の簡単な解説をしておきます。 線の太さを自由に設定できるペンを作るためには塗りつぶし円描画プログラムを作る必要があります。(四角ペンで良ければGFILLを使ってもいいし、太さの微調整ができなくて良いならばGPUTCHRを使ってもいい) 塗りつぶし円の描画アルゴリズムは多数ありますが、このプログラムはその中でも最もシンプルなものを使っています。 それはGCICLEで円を描いてそれをGPAINTで塗りつぶしているだけです。 これだとすでに描画されている上にGCIRCLEで描画した場合に境界が不明瞭になり塗り漏らしが生じてしまいますが、特定の色を境界色に設定しその色でGCIRCLEで円を描きそれを基準に塗りつぶしその後で本来の描画色でGCIRCLEで円を描いています。 これによって塗り漏らしがない「塗りつぶし円」を描画可能になります。
1そうだね
プレイ済み
返信[4]
親投稿
おちゃめ ochame_nako
ここでのポイントは境界色の色コードが「8」というものです。 特定の色を境界色に設定しなくてはならないこのアルゴリズムでは当然のことながら「境界色として使った色は描画色では使えない」という問題があります。 それだと困るため普通は使われない色である「8」(A:0 R:0 G:0 B:8)を境界色に設定しています。 これはアルファチャンネルが255以外であれば何でもいいのですが、その中で最も短い「8」にしているわけです。 これが8未満の数だと丸められて0になり、透明色(色コード0)が使えなくなります。
1そうだね
プレイ済み
返信[5]
親投稿
おちゃめ ochame_nako
素早くタッチペンを動かして描いた場合に線が途切れてしまうのは「タッチ情報の更新は1フレームごと」であるためです。 つまり、1フレームで10ドット分ペンを移動させたら10ドットの隙間ができるわけです。十分に太いペンならばその隙間が埋まるため気にならないですが、太さが数ドットの線では途切れてしまいます。 1フレームあたり1ドット以下の速度でペンを動かしていけばこの問題は起きないですがそれだとまともに描くことができません。 そこで、このプログラムでは1フレームにペンを動かしたドット数分だけループを行い1フレームで何ドット分動かしても内部的には1ドット単位で塗りつぶし円を描画していくという方法を採ることで線が途切れるという問題が起きなくなっています。 端的に言えば線形補間をしているということです。
1そうだね
プレイ済み
返信[6]
親投稿
おちゃめ ochame_nako
というわけで、原理自体は非常に単純ですが、PETIT PAINT QSPではさらなる工夫をしています。 それはメインループからVSYNCを削除しているというものです。 VSYNCは垂直同期とのタイミングを取るための命令であり、これを入れることで表示のちらつきを無くしたり(見えたらいけないものが見えないようにする)、1フレームごとに更新されるボタンやタッチなどの情報とのタイミングを取り誤判定が起きないようにすることが可能になります。 そのため本来はVSYNCはメインループには必ず入れるべきものですが、PETIT PAINT QSPでは入れなくてもタッチやボタン判定で問題が起きることはないし、VSYNCを入れないことでペンの太さに合わせたカーソル表示を可能にしています。
1そうだね
プレイ済み
返信[7]
親投稿
おちゃめ ochame_nako
これは本来は見えてはいけない境界色である色コード8の円がVSYNCを省くことで見えているというのを利用しているだけですが、それがカーソル表示となっているわけです。 これによって例えば太い消しゴムを使用時でもどの範囲が消されるのかが一目瞭然となり「PETIT PAINT QSP」は非常に使い勝手の良いお絵かきソフトに仕上がっています。 したがって、アンドゥが無くてもほとんど気になりません。 ラフに描いて余分な部分は削るという描き方が簡単にできるというのが「PETIT PAINT QSP」の最大の特長です。(ペンや消しゴムの太さもワンタッチで自由に変更が可能)
1そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
PETIT PAINT QSPのネタをばらすとこんな感じですが、QSPであってもここまで工夫できる余地があるということです。 PETIT PAINT QSPはさらにリスト短縮できる余地が見つかったので大喜利に向けてそのうち新バージョンを公開します。 もちろん、上記BLINE命令を使ったお絵かきソフトを作って大喜利に投稿するのは何ら問題はないし、むしろうれしいのでぜひ使ってみてください。
1そうだね
プレイ済み
返信[9]
親投稿
タバひめ tabahime
私もk簡単な落書きツール作りましたが。難しいと思ってましたが、拍子抜けするほど簡単に作れましたよ。一画面プログラムで。OSPというのかな? ただ、早く描くと線が途切れ途切れになるんですよね。でも、キャラ描くときの下書きにその途切れた線が使いやすく、あとで消しかももしやすかったりします。
1そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
dx dy の大小で分岐しないコード、参考になりました!!
0そうだね
プレイ済み
返信[11]
親投稿
おちゃめ ochame_nako
タバひめさんへ GPSETによる点描の描画も味わい深くていいですよね。 ただし、望んでそのような仕様にしているならばいいのですが、途切れ途切れにならない方が良いと感じている人も結構見かけます。 それは簡単な方法で解決できるため今回自作命令という形でその改善案を提示しました。 みき★さんへ 大したコードではないですが、参考になる部分があったのでしたら何よりです。 この描画アルゴリズムはシンプルでいいのですが、太さ1ドットの線がキレイに描けないのでそれはGLINEを使ってカバーしています。
0そうだね
プレイ済み
返信[12]
親投稿
タバひめ tabahime
今回は初めてなので途切れ途切れの点描でも良しとしてます。以外と絵が描きやすかった。次回また作る時は参考にしてみようと思いますよ。
0そうだね
プレイ済み