HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0310
adukenペイントソフトの制作19解決


aduken

リンク

2008/3/10(Mon) 22:18:04|NO.14048

今、僕はペイントを作ろうと思っています。
でも線の繋ぎ方がわかりません
psetなら点々になるのでどうしたらいいですか?
なるべくHSP標準機能を使っていただけると
こちらもうれしいです



この記事に返信する


f

リンク

2008/3/10(Mon) 22:34:14|NO.14049

lineではいかんの?



じった

リンク

2008/3/11(Tue) 00:33:53|NO.14061

僕が最近使った方法は

●ブラシの点を打つには、
 『ブラシ形状のグレー画像を用意。それをマスクにして、
    描画色をgmode 7でアルファブレンドコピーする』…方法をとりました。

●ドラッグにより線を引くには、
 『前回ループ時のマウス座標と、今回ループ時のマウス座標の間に
   自分で設定した回数だけ中割りをして、上記方法で点を打つ』…ようにしています。
       ↑この設定回数が少ないと、
        すばやくマウスを動かしたときに線が途切れますが、
        逆に多すぎると、重くなり、ラインの追従性が落ちます。

文章で書くと判りづらいですね…すみません。



いなえ

リンク

2008/3/11(Tue) 00:47:13|NO.14063

円形ブラシについて。
ドラッグで線を引くにはgrectを使うと処理が速いかと思います。
たとえば、
1.前回ループ時のマウス座標に円を描画
2.今回ループ時のマウス座標に円を描画
3.角度をatanで求めて中点を中心にgrectで長方形描画(長さはsqrtで求めればOK)
といったところでしょうか。
長方形ブラシだとgsquareを使う必要があるかな…。



ANTARES

リンク

2008/3/11(Tue) 00:58:59|NO.14064

>●ドラッグにより線を引くには、
 既に描いた線が消えるのが難点。
これを解消するにはLineNotを使うと簡単だけど、HSPにはありません。
Win32APIにはあったっけ?

dc=2 ;クリックの最大移動ドット数(これより大きく動いたらドラッグ開始と判定) repeat: wait 1 mx=mousex: my=mousey stick key,256 if mode==0 { ;初期状態 if key==256: mode=1: sx=mx: sy=my } else { if mode==1 { ;クリックorドラッグ開始 if key==256 { if abs(mx-sx)>dd | abs(my-sy)>dd { ;ドラッグ開始 mode=2 ex=mx: ey=my color redraw 2 line sx,sy,ex,ey redraw 1 } } } else { ;ドラッグ中 if key==0 { ;ドラッグ終了 mode=0 } else { if mx!=ex | my!=ey { ;消す redraw 2 color 255,255,255: line sx,sy,ex,ey ;描く ex=mx: ey=my color line sx,sy,ex,ey redraw 1 } } } } loop



ANTARES

リンク

2008/3/11(Tue) 01:07:34|NO.14065

 2点をクリックすると線が引かれるし、クリックの後ドラッグすると
クリックポイントがアンカーになります。
mode1でクリックならmode0に戻すのを忘れたせいだけど、
仕様にしてしまおう(^_^;;



ANTARES

リンク

2008/3/11(Tue) 01:24:08|NO.14067

 昔、HSP2用に書いたものですが、そのままで動きました。

goto *futo mx=mousex: my=mousey repeat: await bx=mx: by=my: mx=mousex: my=mousey stick sti,256,1 if sti&256 { line mx,my,bx,by } else { if sti&512 { cls } } await 1 loop *futo mx=mousex: my=mousey repeat bx=mx: by=my: mx=mousex: my=mousey stick sti,256,1 if sti&256 { dx=mx-bx: sx=1: if dx<0: dx=-dx: sx=-1 dy=my-by: sy=1: if dy<0: dy=-dy: sy=-1 if dx>dy { long=dx } else { long=dy } if long>0 { repeat long pos sx*cnt*dx/long+bx-10,sy*cnt*dy/long+by-10: mes "●" loop } } else { if sti==512 { cls } } await 1 loop



As

リンク

2008/3/11(Tue) 01:43:31|NO.14069




じった

リンク

2008/3/11(Tue) 17:39:07|NO.14085

やっていることはANTARESさんと似たような感じですが、
ブラシ形状に画像を使えるようにするサンプルです。

画面の外縁辺りの描画でバグが出るのをどうするか?
・・・が課題ですね。(バッファを使うことで解決できるとは思いますが)


screen 0,640,480,0,150,80 title "描画エリア" screen 1,60,30,0,20,80;ブラシ用。実際はbufferで宣言 title "ブラシ" color 0,0,0:boxf 0,0,60,30 repeat 12;ブラシの作成 cl=64+cnt*32:if cl>255:cl=255 color cl,cl,cl:circle 33+cnt,3+cnt,60-cnt,30-cnt,1 loop color 128,128,255:boxf 0,0,29,29;描画色 gsel 0:mx=mousex: my=mousey *main redraw 0:gmode 7,30,30,255 oldx=mx:oldy=my:mx=mousex: my=mousey stick st,256,1 if st&256{;左クリックでドロー dx=mx-oldx : dy=my-oldy dis=1.0*(abs(dx)+abs(dy))/5+1 ;↑ 前座標と今座標の間の中割り数を設定。 ddx=1.0*dx/dis : ddy=1.0*dy/dis repeat dis pos mx-ddx*cnt-15,my-ddy*cnt-15 gcopy 1,0,0,30,30 loop } if st&512{;右クリックでカラーダイアログを開く dialog "",33 red=ginfo_r:grn=ginfo_g:ble=ginfo_b gsel 1:color red,grn,ble boxf 0,0,29,29 gsel 0 } redraw 1:await 20 goto *main



osakana

リンク

2008/3/11(Tue) 18:59:47|NO.14086

昔作った物ですが、
まだでてないやり方なので載せて見る。
操作:左クリックで●、左クリック+右クリックで■。

#module // line2 終点X, 終点Y, 始点X, 始点Y, 太さ, 形状(0 == ● / 0 != ■) #deffunc line2 int x1, int y1, int x2, int y2, int size, int flg size2 = size / 2 repeat size, -size2 :y = cnt repeat size, -size2 if sqrt(cnt*cnt+y*y)<=size2 | flg { line x1+cnt+1, y1+y+1, x2+cnt, y2+y } loop loop return // マウス座標取得(スクリーン系からウィンドウ系に変換) #deffunc ScrWnd var mx, var my frm = GINFO_SIZEX - GINFO_WINX >> 1 //フレームサイズ bar = GINFO_SIZEY - GINFO_WINY - frm //タイトルバーサイズ mx = GINFO_MX - GINFO_WX1 - frm my = GINFO_MY - GINFO_WY1 - bar return frm + bar << 8 #global repeat stick key, 768 mx2 = mx1 my2 = my1 ScrWnd mx1, my1 if key & 256 { hsvcolor cnt, 255, 255 redraw 0 line2 mx2, my2, mx1, my1, 32, key&512 redraw 1 } await 32 loop



aduken

リンク

2008/3/11(Tue) 21:46:00|NO.14092

まったく初心者なもんで・・・(ペイントに関しては)
どうゆう仕組みで動いているかが知りたいです。
あつかましいですが教えてもら得ないでしょうか。
(詳しくお願いします)



通りすがりさん

リンク

2008/3/11(Tue) 21:59:43|NO.14093

とりあえず、途切れない線をひくだけなら、lineだけでできますよ。
始点と終点を一工夫してみてください。
一手前のマウス座標を使うのがポイントです。



aduken

リンク

2008/3/11(Tue) 22:04:32|NO.14095

なるほどですけど
まったく意味がわかりません。
もう少し詳しく書いていただけると幸いです



じった

リンク

2008/3/11(Tue) 23:05:09|NO.14100

どのサンプルに興味を示したかわかりませんが、
どれも皆、かなりシンプルに書かれていると思います。

ちょっとヘルプなどを参考にしながら、じっくり解析してみてはいかがでしょう?

この位のサンプル解析で苦労するようなら、
ちょっとこの先 まだ荷が重いような気がしますよ。



osakana

リンク

2008/3/11(Tue) 23:17:56|NO.14102

例えば、マウスがA地点からB移転へ移動した時に、
そのマウスの動きにそって線を描く場合、
とりあえずこの様に書いて見ると思いますが、

repeat pset mousex, mousey wait 1 loop
これでは、マウスの動きの瞬間つまり
A地点とB地点にしか点を打ってくれません。

パソコンがマウスを認識するよりも早く
人間がマウスを動かせば、
どんなに高速に点を打とうとしても
線は途切れてしまいます。

線の途切れをなくすにはですが、
A地点とB地点に点を打つのではなく、
A地点からB地点までを直線で繋いでしまえば、
一応は線が繋がったようにみえると言うわけです。

repeat line mousex2, mousey2, mousex, mousey mousex2 = mousex mousey2 = mousey wait 1 loop
皆さんが上で書き込まれたサンプルスクリプトも、
やり方が違うだけで、点と点の間を補完するという考え方は同じです。

> この位のサンプル解析で苦労するようなら、

たしかにこのくらいの事なら
検索してすぐ出て来そうな気もしますし
過去にも同じ質問があった気がしますが、
今後気を付けてねっと言う事で...(^^;)



As

リンク

2008/3/12(Wed) 01:38:52|NO.14117

pset だけでやろうとすると、


ーーーーーーーーーーーーーー

 ・
  ・
    ・
      ’ ・・
         
ーーーーーーーーーーーーーー

こうなりますが、

この複数の点を、ひとつひとつ lineで繋げると・・!



osakana

リンク

2008/3/12(Wed) 19:10:55|NO.14128

> NO.14102
誤字があったので訂正。
誤:マウスがA地点からB移転へ移動した時に
正:マウスがA地点からB地点へ...

もう一つスクリプトの訂正。
repeat
line mousex2, mousey2, mousex, mousey mousex2 = mousex mousey2 = mousey wait 1 loop
と書きましたが、ヘルプ見直したらline 命令は
line 終点X, 終点Y, 始点X, 始点Y だったので
repeat
line mousex, mousey, mousex2, mousey2 mousex2 = mousex mousey2 = mousey wait 1 loop
と書いた方がよさそうです。
また、line は p1,p2 がカレントポジションになるので、
repeat
line mousex, mousey wait 1 loop
と短く書く事も出来ます。

> Asさん
分かりやすい!



aduken

リンク

2008/3/14(Fri) 21:14:08|NO.14215

こんな質問に協力してくださいまして
本当に有難うございました。

repeat stick KY,256 //ボタンの状態確認// if KY=256:line mousex2, mousey2, mousex, mousey //ボタン押したときだけ確認// mousex2 = mousex//マウスの状態を確認-X座標// mousey2 = mousey//マウスの状態を確認-Y座標// wait 1//LOOPの約束// loop//repeat〜loop間のループ//

本当に有難うございました



kkk

リンク

2008/5/9(Fri) 01:15:18|NO.15739

おお、osakanaさんの説明わかり易いw

私も参考にさせてもらいました、ありがとうございます^^



TODO

リンク

2008/5/10(Sat) 13:04:57|NO.15764

じったさんのすごいですね。



ONION software Copyright 1997-2023(c) All rights reserved.