コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
アイカ ◆nXHD2.MpFK4i
2019/6/8 19:46
質問
GFILLで線は描けないのか...?
簡易黒板もどきアプリを作っています。
そんでGFILLで線を描こうとしたところ、点々としてしまいます。
GLINEでやってもいいのですが、凄く細いです。
なんとかできないでしょうか?
ちなみに今現在のソースは.
'===一部省略しています===
XSCREEN 1280,720
TSCREEN 16
SYSPARAM "MOUSECURSOR",1
GCLS RGB(0,90,0)
@M 'ここからメインループ
TOUCH OUT TI,TX,TY
IF TI>0 THEN GFILL TX,TY,TX+10,TY+10 'GFILLで線を引く
IF TI==1 THEN BEEP 9 'タッチ確認用の効果音
VSYNC 1
GOTO @M

コメント

アバター
イスターリャ 2019/6/8 20:22 ◆yQQqD0WLNtDY
直前のタッチ位置からFOR〜NEXTループで複数のGFILLをすると、四角形がつながって線になります。
直前のタッチ位置をBTX、BTYとすると、

IF TI>0 THEN
FOR I% = 0 TO 32-1
GFILL BTX+(TX-BTX)*I%/32, BTY+(TY-BTY)*I%/32, BTX+(TX-BTX)*I%/32+10, BTY+(TY-BTY)*I%/32+10
NEXT
ENDIF

という感じです。32の部分はお好みで調整してください。
アバター
アイカ 2019/6/8 20:52 ◆nXHD2.MpFK4i
ありがとうございます。でもそれを"円"ですることはできませんか?
一応円は描けるのですが”塗りつぶす”はなかった気がします。
できないなら別にいいですけど...
アバター
イスターリャ 2019/6/8 21:53 ◆yQQqD0WLNtDY
円ですか……どなたかできている方はいらっしゃったはずですが、私の知識にはありません。お力になれず申し訳ありません。
アバター
ツララ 2019/6/8 22:05 ◆ArUdBYOYME1V
タッチした軌跡を繋げたいなら試しにGPSET命令だけで直線や曲線を描く処理を作ってみたらいいんじゃないんです?

直径11ドットの塗りつぶし円なら
GFILL X,Y+3,X+10,Y+7
GFILL X+1,Y+1,X+9,Y+9
GFILL X+3,Y,X+7,Y+10
って3回GFILLすれば掛けますよ
アバター
こういち 2019/6/8 22:08 ◆ou0jbJnEJ0Kb
GPAINTを使います。
おちゃめさんのPetit Paint QSPで使われていた方法だと、
まず円を透明色(RGB 0,0,0,8)で描画して、それをGPAINTで塗りつぶして、その後枠を塗りつぶした色で上書きするという方法が使われています。
プチコン4ならRGBが256段階なので、色はRGB(0,0,0,1)で問題ないと思います。
アバター
こういち 2019/6/8 22:18 ◆ou0jbJnEJ0Kb
Petit Paint QSPの公開キー W3VEW3H4


X,Yを色Cで塗りつぶす場合
GCIRCLE X,Y,1
GPAINT X,Y,C,1
GCIRCLE X,Y,C

みたいな方法が使われてました。
アバター
あきと 2019/6/8 23:52 ◆qGd5dQw2g3a2
最初の話に戻してしまいますが、ブレゼンハムアルゴリズムを使った線を引く関数です。
書いてることがややこしいのでとりあえずGFILLの所の「+5,-5」を変えると線の太さが変わります。
アバター
アイカ 2019/6/9 9:50 ◆nXHD2.MpFK4i
一応、一番上の"イスターリャ"さんの命令文を実行してみたのですが、Syntax Errorが出てしまいます。
なにか書き間違いがあるのでしょうか。一応自分で確認してみたのですが、誤りは見つからなかったです。
アバター
say 2019/6/9 10:31 ◆1nbKtD/tFu04
さしあたり見つけたとこは、画像の部分
他にもあるかな?
アバター
あきと 2019/6/9 17:42 ◆Bz8zeG7wRHNQ
GCIRCLEで円を描いてGPAINTで塗りつぶす方法は簡単ですが、黒板プログラム内で既に落書きされているときはうまく塗りつぶされない事もあるでしょうね。

使っていないグラフィック面に描画したい図形を描いて表示しているグラフィック0面と重ね合わせ処理をすることで塗りつぶされた円が描画できると思います。
アバター
しんいち 2019/6/9 18:22 ◆lHy.hAWXbthn
簡単なのはGPUTCHRで●
アバター
ブルー 2019/6/10 7:20 ◆JKsZFeT4FzkU
GLINEと三角関数でループさせればできそうですけどね。
アバター
うょリウム(元 SPDX) 2019/6/10 10:16 ◆UTOEg1c1vr.B
イスターリャさんのやり方にはこういう手もありますよ。
FOR Y=-1 TO 1
FOR X=-1 TO 1
GLINE BTX+X,BTY+Y,TX+X,TY+Y
NEXT
NEXT

それより
VSYNCを外したほうがいいのでは?
んー、スイッチ版は分からない…
アバター
おちゃめ 2019/6/10 13:13 ◆jH1opV6FnGyx
「塗りつぶし円を使って線が途切れずに描きたい」というのであれば「塗りつぶし円」の自作関数と「途切れずに線が描ける」自作関数を作れば解決です。

塗りつぶし円には多数の方法があります。
こういちさんが書いているようにGCIRCLEを使って円を描き、それからGPAINTで色を塗るという方法は最も簡単ですが、画面内で使っていない色でGCIRCLEで円を描く必要があります。(そうしないとすでにあきとさんが書いているように描画されている場所に円を描く場合に塗り漏らしが発生する)
プチコン3号のお絵描きソフトでは私はRGB(0,0,0,8)という色を好んで使用しました。これはプチコン3号のお絵描きソフトではまず使わない色だし、8という1桁の値になるためプログラムの大幅短縮が可能だからです。

この方法を使ってもいいのですが、32bitフルカラーが扱えるプチコン4で100%使わない色というのは無いためここでは別のやり方で塗りつぶし円を描画する自作関数を用意しました。
なお、描画の際のRが半径になるわけですが、円の直径はR*2ではなくR*2+1となります。つまり、R=0ならば太さ1の線になるわけです。
CIRCLEFILL関数はシンプルさを重視なのですが、引数Kの値を1以外の値にすると塗りつぶし楕円になります。

途切れないようにするBLINE関数もシンプルです。
現在のタッチ座標と1フレーム前のタッチ座標に円を描画しただけだと円と円の間に隙間が空いてしまうためその座標の差を1ドットずつ円を移動させて描画しているだけです。
つまり、どれだけ素早くタッチしても1ドット単位で動かしているのと同じなので絶対に隙間は空きません。

25行以降がこの2つの自作関数を使ったサンプルプログラムです。
実際に動作させて確かめてみてください。
アバター
アイカ 2019/6/11 7:38 ◆nXHD2.MpFK4i
おちゃめ さんのプログラム、凄く良いんですけど、
なぜかタッチするとマウスポインターからタッチした場所まで直線が引かれてしまいます。
アバター
アイカ 2019/6/11 7:39 ◆nXHD2.MpFK4i
あとVSYNCを消すとタッチ確認の効果音がおかしくなります。
アバター
おちゃめ 2019/6/12 1:08 ◆jH1opV6FnGyx
私の手元にあるプログラムでは正常に動作しているので入力ミスの可能性が高いですね。
公開キーを取得したので試してみてください。(この公開キーはダウンロードされたら消す予定です)

BLINE公開キー 【 4E32KX31F 】

VSYNCは何のためにあるのかというと基本的にはタイミングをためです。
私のプチコン3号講座ですが、プチコン4でも同じことが言えるため参考にしてみてください。
http://ochameclub.web.fc2.com/petitcom3/lecture/vsync.htm

したがって、VSYNCを削ったら誤動作してしまう場合があるのです。
よく分からなければメインループ内には「おまじない」としてVSYNCを入れなければならないと考えてください。
アバター
アイカ 2019/6/12 7:39 ◆nXHD2.MpFK4i
ありがとうございました。無事に線が描けました。
黒板アプリができたらプチコン4 まとめWikiに投稿する予定です。
本当にありがとうございました。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -