ゲームを作りたい人のための ソースコード集

私がその日作った短めのソースを簡単な解説とともに載せていきます
ゲーム制作初心者にとって参考になるかもしれないソースが多いです


<< 整数と実数の比較 | main | 六角形を隙間なく並べる >>



色判定プログラム

指定の色を判定して、赤っぽい色なら「Red」、青っぽい色なら「Blue」という風に

色の名前を表示するプログラムです

取得した色をHSVモデルに変換し、どの色に属するかを調べます


cx=double(ginfo(26))/2.0    ;中心の座標X
cy=double(ginfo(27))/2.0    ;中心の座標Y
outr=150.0            ;外側の半径
ntrad=deg2rad(1)
ntc_h=192.0/360
ntc_s=255.0/outr
setc_v=255.0
ddim harea,6
ntharea=192.0/6
stharea=ntharea/2
repeat 6        ;色判定エリア
    harea(cnt)=stharea
    stharea+ntharea
loop
color:boxf
redraw 0
gosub *hsvcircledraw
redraw
oncmd gosub *mousewheel, $20A    ;マウスホイールで明度(V)を変更
oncmd gosub *mousemove, $200    ;カーソル移動で座標の色を調べる
stop
*mousemove
    oncmd 0
    redraw 0
    gosub *hsvget
    gosub *hsvcheck
    redraw
    oncmd 1
    return
*mousewheel
    tmousew=0f+(wparam >> 16 & $ffffffff)
    oncmd 0
    redraw 0
    setc_v=limitf(setc_v+(tmousew/2),0,255)
    gosub *hsvcircledraw
    gosub *hsvget
    gosub *hsvcheck
    redraw
    oncmd 1
    return
*hsvget    ;RGB->HSV
    pget mousex,mousey
    dim rgbdt,3:rgbdt=ginfo(16),ginfo(17),ginfo(18)
    ;V値
    max=0:min=255
    repeat 3
        if max<rgbdt(cnt){max=rgbdt(cnt)}
        if min>rgbdt(cnt){min=rgbdt(cnt)}
    loop
    v=max
    ;S値
    if v{ s=255.0*(v-min)/v }
    else{ s=0.0 }
    ;H値
    if v=rgbdt(0){
        if v-min{ h=32.0*(rgbdt(1)-rgbdt(2))/(v-min) }
        else{ h=32.0*(rgbdt(1)-rgbdt(2)) }
    }else:if v=rgbdt(1){
        if v-min{ h=32.0*(2.0+double(rgbdt(2)-rgbdt(0))/(v-min)) }
        else{ h=32.0*(2.0+double(rgbdt(2)-rgbdt(0))) }
    }else{
        if v-min{ h=32.0*(4.0+double(rgbdt(0)-rgbdt(1))/(v-min)) }
        else{ h=32.0*(4.0+double(rgbdt(0)-rgbdt(1)))}
    }
    if h<0.0:h+192.0
    hsvcolor h,s,v
    boxf 30,30,130,130
    return
*hsvcheck    ;色判定
    repeat 6
        flg=0
        if cnt=0{
            if harea(length(harea)-1)<h|h<=harea(cnt){ flg=1 }
        }else{
            if harea(cnt-1)<h&h<harea(cnt){ flg=1}
        }
        if flg=1{
            c_hid=cnt
            break
        }
    loop
    color 255,255,255 : boxf 150,30,250,60 : color
    pos 160,35
    if s<100{
        if v<128{
            mes"Black"
        }else{
            mes"White"
        }
    }else{
        switch c_hid
        case 0 : mes"Red" : swbreak
        case 1 : mes"Yellow" : swbreak
        case 2 : mes"Green" : swbreak
        case 3 : mes"Cyan" : swbreak
        case 4 : mes"Blue" : swbreak
        case 5 : mes"Magenta" : swbreak
        swend
    }
    return
*hsvcircledraw    ;HSV円描写
    r2=outr : r1=r2-1.0
    c_h=0.0 : c_s=255.0 : c_v=255.0
    rad0=0.0 : rad1=ntrad
    ntc_v=(255.0-setc_v)/outr
    repeat r2
        repeat 360
            p1x=cx+r1*cos(rad0) : p1y=cy+r1*sin(rad0)
            p2x=cx+r2*cos(rad0) : p2y=cy+r2*sin(rad0)
            p4x=cx+r1*cos(rad1) : p4y=cy+r1*sin(rad1)
            p3x=cx+r2*cos(rad1) : p3y=cy+r2*sin(rad1)
            x=int(p1x),int(p2x),int(p3x),int(p4x)
            y=int(p1y),int(p2y),int(p3y),int(p4y)
            ;四角形描写
            hsvcolor int(c_h),int(c_s),int(c_v)
            gsquare -1,x,y
            rad0=rad1 : rad1+ntrad : c_h+ntc_h
        loop
        r2-1.0 : r1-1.0
        c_s-ntc_s : c_v-ntc_v
    loop
    return

0
    posted by higashijugem 22:49comments(0)|-|


    この記事に対するコメント