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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1111
セントラル道の太さを均一にしたい3解決


セントラル

リンク

2006/11/11(Sat) 11:01:37|NO.3371

次のようなスクリプトでマスとマスの間に道(?)を作っているのですが、
どうしても道の太さに違いができてしまいます。
均一な太さにするにはどうすればいいでしょうか…?

#module ;toHSV(Shinya様のを使わせてもらっています) // 整数値比較マクロ #define ctype imax(%1, %2) ((%1>=%2)*%1 | %2*(%1<=%2)) #define ctype imin(%1, %2) ((%1<=%2)*%1 | %2*(%1>=%2)) #deffunc toHSV var H, var S, var V, int R, int G, int B V = imax(imax(R, G), B) u = V - imin(imin(R, G), B) ; ↓灰色のときはS(鮮やかさが)は0で、Hは指定しても意味がない if u == 0 : lpoke S : return ; ↓黒色のときはS,H共に 0 に初期化 S = int(255.0 * u / V) if V == R { H = int(32.0 * (G - B) / u) } else : if V == G { H = int(32.0 * (2.0 + double(B - R) / u)) } else { H = int(32.0 * (4.0 + double(R - G) / u)) } if H < 0 : H + 192 return #global #const global MASUSIZE 64 #const global scrx 550 #const global scry 550 #const global MASU_WAKU 2 #const global WORLD_HIRO_X 200*MASUSIZE #const global WORLD_HIRO_Y 200*MASUSIZE #const global MASU_KAZU 5 #const global LOAD_WEIGHT 6 #module ;getcolor32(R,G,B) #define global ctype getcolor32(%1=0,%2=0,%3=0) ((%1 & $FF) | (%2 << 8) | (%3 << 16)) ;color32 16進数 #define global color32(%1) color %1 & $FF,%1 >> 8 & $FF,%1 >> 16 & $FF ;getOpt(マスの種類,マスX,マスY) #define global ctype getOpt(%1,%2,%3) ((%1 << 16) | (%2 << 8) | (%3 & $FF)) ;getSyurui(getOpt数) ;getX(getOpt数) ;getY(getOpt数) #define global ctype getSyurui(%1) (%1 >> 16 & $FF) #define global ctype getX(%1) (%1 >> 8 & $FF) #define global ctype getY(%1) (%1 & $FF) //PrintMasu X,Y,カラー(getcolor32) #deffunc PrintMasu int mX,int mY,int clr,local mw,local em,local h,local s,local v color 255,255,255 circle mX,mY,mX+MASUSIZE,mY+MASUSIZE color32 clr // dialog "r:"+ginfo_r+"\ng:"+ginfo_g+"\nb:"+ginfo_b toHSV h,s,v,ginfo_r,ginfo_g,ginfo_b v = 160 em=MASU_WAKU mw=MASUSIZE-MASU_WAKU repeat hsvcolor h,s,v // dialog "r:"+ginfo_r+"\ng:"+ginfo_g+"\nb:"+ginfo_b+"\nh:"+h+"\ns:"+s+"\nv:"+v circle mX+em,mY+em,mX+mw,mY+mw em+=MASU_WAKU mw-=MASU_WAKU if em>mw:break v+=10 if v>255:v=255 loop return //PrintLoads スクロールX,スクロールY,色 #deffunc PrintLoads int ssx,int ssy,int cllr,local mux,local muy,local muux,local muuy,local vv color32 cllr toHSV h,s,vv,ginfo_r,ginfo_g,ginfo_b repeat MASU_KAZU-1 v=vv mux=getX(masu@(cnt))*MASUSIZE+MASUSIZE/2-ssx muy=getY(masu@(cnt))*MASUSIZE+MASUSIZE/2-ssy muuy=getY(masu@(cnt+1))*MASUSIZE+MASUSIZE/2-ssx muux=getX(masu@(cnt+1))*MASUSIZE+MASUSIZE/2-ssy repeat LOAD_WEIGHT hsvcolor h,s,v line muux,muuy-cnt,mux,muy-cnt line muux,muuy+cnt,mux,muy+cnt v-=60/LOAD_WEIGHT loop loop return //ToDispFiled X座標,Y座標 #deffunc ToDispFiled int wX,int wY,local eX,local eY eX=(wX+scrx) eY=(wY+scry) gsel 0 redraw 0 color 0,255,0:boxf PrintLoads Scrollx@,Scrolly@,getcolor32(255,255,255) repeat MASU_KAZU // dialog "cnt:"+cnt+"\nX:"+(getX(masu@(cnt))*MASUSIZE)+"\nY:"+(getY(masu@(cnt))*MASUSIZE) if (getX(masu@(cnt))*MASUSIZE)<eX:if ((getX(masu@(cnt))*MASUSIZE)+MASUSIZE)>=wX:if (getY(masu@(cnt))*MASUSIZE)<eY:if ((getY(masu@(cnt))*MASUSIZE)+MASUSIZE)>=wY{ PrintMasu getX(masu@(cnt))*MASUSIZE-wX,getY(masu@(cnt))*MASUSIZE-wY,masuClr@(getSyurui(masu@(cnt))) // dialog "描画("+cnt+")" } loop redraw 1 return #global masuClr = getcolor32(0,0,255),getColor32(255,0,0),getColor32(0,255,255),getColor32(128,0,128),getColor32(192,192,192) title "ゲーム?" dim masu,MASU_KAZU masu = getOpt(0,0,0),getOpt(1,2,0),getOpt(2,4,1),getOpt(3,3,3),getOpt(4,2,4) Scrollx=0:Scrolly=0 ;どれだけスクロールしてるか ToDispFiled Scrollx,Scrolly



この記事に返信する


20061111

リンク

2006/11/11(Sat) 14:29:30|NO.3378

;基本的な考え方ですが、(−)方向の考慮はしてないです。


X(0) = 100.0,300.0,400.0 ;円の位置X Y(0) = 100.0,100.0,300.0 ;〃Y R(0) = 20.0,30.0,40.0 ;円の半径 W(0) = 10.0 ;線の幅(1/2) circle X(0)-R(0),Y(0)-R(0),X(0)+R(0),Y(0)+R(0),0 circle X(1)-R(1),Y(1)-R(1),X(1)+R(1),Y(0)+R(1),0 circle X(2)-R(2),Y(2)-R(2),X(2)+R(2),Y(2)+R(2),0 line X(0),Y(0),X(1),Y(1) line X(1),Y(1),X(2),Y(2) line X(2),Y(2),X(0),Y(0) RD = (3.141592/180) ;ラジアンに変換用 L1 = X(2)-X(0) ;円1−2の距離X L2 = Y(2)-Y(0) ;〃Y L3 = sqrt((L1*L1)+(L2*L2));円1−2の直線距離 T1 = L2/L1 ;タンジェント A1 = atan(T1)/RD ;上から角度を求める Dx = W(0)*cos((A1+90)*RD) ;線幅を90度回転したX Dy = W(0)*sin((A1+90)*RD) ;〃Y Rx(0) = R(0)*cos((A1)*RD) ;始点半径を角度A1回転したX Ry(0) = R(0)*sin((A1)*RD) ;〃Y Rx(2) = R(2)*cos((A1)*RD) ;終点半径〃 Ry(2) = R(2)*sin((A1)*RD) ;〃 color 255 line X(0)+Dx+Rx(0),Y(0)+Dy+Ry(0),X(2)+Dx-Rx(2),Y(2)+Dy-Ry(2) line X(0)-Dx ,Y(0)-Dy (0),X(2)-Dx ,Y(2)-Dy ;line X(0)-Dx+Rx(0),Y(0)-Dy+Ry(0),X(2)-Dx-Rx(2),Y(2)-Dy-Ry(2)



じった

リンク

2006/11/11(Sat) 16:00:58|NO.3380

僕も考えてみました。
どんな角度でも大丈夫かどうかは検証してませんが、
サンプルでは、まずまずの結果が出たと思います。


#deffunc PrintLoads int ssx,int ssy,int cllr,local mux,local muy,local muux,local muuy,local vv color32 cllr toHSV h,s,vv,ginfo_r,ginfo_g,ginfo_b repeat MASU_KAZU-1 v=vv mux=getX(masu@(cnt))*MASUSIZE+MASUSIZE/2-ssx muy=getY(masu@(cnt))*MASUSIZE+MASUSIZE/2-ssy muuy=getY(masu@(cnt+1))*MASUSIZE+MASUSIZE/2-ssx muux=getX(masu@(cnt+1))*MASUSIZE+MASUSIZE/2-ssy ang=atan(muuy-muy,muux-mux);マス間の角度を得る repeat LOAD_WEIGHT addy=cos(ang)*cnt; マス間角度に対して直交する線の addx=-sin(ang)*cnt;   x,y増分値 hsvcolor h,s,v line muux-addx,muuy-addy,mux-addx,muy-addy line muux+addx,muuy+addy,mux+addx,muy+addy ; ↓ 線の間に隙間が空くのを防ぐため line muux-addx-1,muuy-addy,mux-addx-1,muy-addy line muux+addx+1,muuy+addy,mux+addx+1,muy+addy v-=60/LOAD_WEIGHT loop loop return



セントラル

リンク

2006/11/11(Sat) 22:05:51|NO.3390

20061111様には申し訳ありませんが、
今回はじった様のやり方にすることにします。
やっぱり三角関数が絡んでくるようですね…。
僕はまだ小学生なので三角関数とかはできないですが、
これからもよろしくお願いします。



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