| 
					 
							
													 
							
						 
						
 
 | 
 | 
 
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 
じったさんのすごいですね。 
 
 |   
  
					 |