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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0311
まっちゃペイントのスプレーですが…8解決


まっちゃ

リンク

2012/3/11(Sun) 18:16:39|NO.45364

#deffunc spl int p1, int p2, int p3
circle p1-p3,p2-p3,p1+p3,p2+p3,1 repeat p3*p3*p3 sx=rnd (p1+p3*2+p3) sx=sx-(p1+p3) sy=rnd (p2+p3*2+p3) sy=sy-(p2+p3) color 255,255,255:pset sx,sy loop return
調べてもでなくて自力で必死で作ったらこんなのになってしまいました。
命令だけ見るとあっているのに実行してみると重くてまともに動かない…
前回も線のことを教えてもらいましたがこちらもわかりません。
初心者ですみませんが何か方法はありますでしょうか?お願いします!




この記事に返信する


cats

リンク

2012/3/11(Sun) 19:08:20|NO.45366

重くなるのはループ内にウェイト命令を入れることで直るはずです。

#deffunc spl int p1, int p2, int p3 circle p1-p3,p2-p3,p1+p3,p2+p3,1 repeat p3*p3*p3 sx=rnd (p1+p3*2+p3) sx=sx-(p1+p3) sy=rnd (p2+p3*2+p3) sy=sy-(p2+p3) color 255,255,255:pset sx,sy wait 1 ;ここを追加 (await 1でも可) loop return



@UN

リンク

2012/3/11(Sun) 19:13:25|NO.45367

redraw 命令は使ってますか?
使っていないとかなり遅くなります。



cats

リンク

2012/3/11(Sun) 20:08:55|NO.45368

スプレーのサンプルを簡単に作るつもりが無駄なところが多くなってしまいました。
役に立てたらいいですけど・・・

T1="色選択画面" :T2="描画画面" ;タイトルを設定 #uselib "user32.dll" #func SetParent "SetParent" int,int #cfunc GetForegroundWindow "GetForegroundWindow" #cfunc GetWindowTextLength "GetWindowTextLengthA" int #func GetWindowText "GetWindowTextA" int, var, int onexit gosub *exit ;終了されたとき screen 0,500,500,2 : hwnd0 = hwnd :title ""+T1 screen 1,400,400,4 : hwnd3 = hwnd :title ""+T2 SetParent hwnd1, hwnd0 SetParent hwnd3, hwnd0 randomize gsel 0,1 :objsize 100,25 button gosub"色選択",*RGB gsel 1,1 repeat hAct = GetForegroundWindow() ;4ここからアクティブなウィンドウを調べる len = GetWindowTextLength(hAct) sdim buf,len+1 GetWindowText hAct, buf, len + 1 if buf=""+T2 { ;描画画面がアクティブなときは描画する getkey key,1 ;クリックされたとき if key=1 { repeat 10 ;ここの数が多いほどスプレーの量は多くなる pset mousex-rnd(10)+10,mousey-rnd(10)+10 ;点をマウス付近(rndで半径10くらいまで)に適当に描画 loop } } await 1 loop *RGB dialog "",33,"" ;色選択ダイアログ if stat=0 :return ;キャンセルされたら戻る color ginfo(16),ginfo(17),ginfo(18) ;色を設定 return *exit ;終了割り込み if wparam=0 :end ;親ウィンドウが終了されようとすると終了 gsel wparam,-1 ;それ以外のウィンドウは非表示 return



まっちゃ

リンク

2012/3/11(Sun) 21:28:51|NO.45370

みなさん回答ありがとうございます。
>>@UNさん
それでもダメでした。
>>catsさん
ありがとうございます!ちゃんと動きました!
それに色選択ウィンドウの命令も勉強になりました。(今までは入力して色を決めてました)



暇人

リンク

2012/3/11(Sun) 21:44:52|NO.45371

>命令だけ見るとあっているのに実行してみると重くてまともに動かない…
p3(半径の場合)の範囲内だけランダムにするならp3-rnd(p3*2)にして中心座標を足せばいいだけ
でもrnd(p3*2)だと30を指定したら30-(0〜59)になって
結果は-29〜30にしかならないので、p3-rnd(p3*2+1)にする

p3は直径にしてるけど↓

#module #deffunc spl int p1, int p2, double p3, int p4 s=p3/2 repeat p4 sx=s-rnd(p3+1) sy=s-rnd(p3+1) if sqrt(sx*sx+sy*sy)<(s+0.5){//指定された円の中のみ描画 pset sx+p1,sy+p2 }else{ continue } loop return #global repeat redraw 0 stick stk,$fff if stk&256{ color 255 //spl 中心x、中心x、円の直径、一度に噴射する点の数 spl mousex,mousey,15,20 } redraw 1 await 15 loop



まっちゃ

リンク

2012/3/11(Sun) 21:58:59|NO.45373

>>暇人さん
ありがとうございます!
丸なのでいかにもスプレーに近いですね。
点の数が大きさによって変えないといけないのですが、それは自分でやっておきます。



暇人

リンク

2012/3/11(Sun) 22:34:28|NO.45374

>点の数が大きさによって変えないといけないのですが、それは自分でやっておきます。
マクロを使って使用時には点の数を意識しないで使えるようにする方法もある

NO.45371のモジュールを使用

#define global spl2(%1,%2,%3,%4=0) spl (%1),(%2),(%3),1.5*(%3)*((%4)=0)+%4 repeat redraw 0 stick stk,$fff if stk&256{ color 255 //spl 中心x、中心x、円の直径、0か省略すると直径の1.5倍の数を噴射 spl2 mousex,mousey,100 } redraw 1 await 15 loop



まっちゃ

リンク

2012/3/12(Mon) 19:59:38|NO.45390

>>暇人さん
また教えてくださってありがとうございます!
これを活用して続きを作らせていただきます!



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