|
|
2008/3/10(Mon) 22:18:04|NO.14048
今、僕はペイントを作ろうと思っています。
でも線の繋ぎ方がわかりません
psetなら点々になるのでどうしたらいいですか?
なるべくHSP標準機能を使っていただけると
こちらもうれしいです
|
|
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を使う必要があるかな…。
|
|
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
|
|
2008/3/11(Tue) 01:07:34|NO.14065
2点をクリックすると線が引かれるし、クリックの後ドラッグすると
クリックポイントがアンカーになります。
mode1でクリックならmode0に戻すのを忘れたせいだけど、
仕様にしてしまおう(^_^;;
|
|
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
|
|
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
|
|
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
|
|
2008/3/11(Tue) 21:46:00|NO.14092
まったく初心者なもんで・・・(ペイントに関しては)
どうゆう仕組みで動いているかが知りたいです。
あつかましいですが教えてもら得ないでしょうか。
(詳しくお願いします)
|
|
2008/3/11(Tue) 21:59:43|NO.14093
とりあえず、途切れない線をひくだけなら、lineだけでできますよ。
始点と終点を一工夫してみてください。
一手前のマウス座標を使うのがポイントです。
|
|
2008/3/11(Tue) 22:04:32|NO.14095
なるほどですけど
まったく意味がわかりません。
もう少し詳しく書いていただけると幸いです
|
|
2008/3/11(Tue) 23:05:09|NO.14100
どのサンプルに興味を示したかわかりませんが、
どれも皆、かなりシンプルに書かれていると思います。
ちょっとヘルプなどを参考にしながら、じっくり解析してみてはいかがでしょう?
この位のサンプル解析で苦労するようなら、
ちょっとこの先 まだ荷が重いような気がしますよ。
|
|
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
皆さんが上で書き込まれたサンプルスクリプトも、
やり方が違うだけで、点と点の間を補完するという考え方は同じです。
> この位のサンプル解析で苦労するようなら、
たしかにこのくらいの事なら
検索してすぐ出て来そうな気もしますし
過去にも同じ質問があった気がしますが、
今後気を付けてねっと言う事で...(^^;)
|
|
2008/3/12(Wed) 01:38:52|NO.14117
pset だけでやろうとすると、
ーーーーーーーーーーーーーー
・
・
・
’ ・・
ーーーーーーーーーーーーーー
こうなりますが、
この複数の点を、ひとつひとつ lineで繋げると・・!
|
|
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さん
分かりやすい!
|
|
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間のループ//
本当に有難うございました
|
|
2008/5/9(Fri) 01:15:18|NO.15739
おお、osakanaさんの説明わかり易いw
私も参考にさせてもらいました、ありがとうございます^^
|
|
2008/5/10(Sat) 13:04:57|NO.15764
じったさんのすごいですね。
|
|