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

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


<< 多次元配列の拡張 | main | 視界範囲 >>



アンチエイリアス付きの直線

Xiaolin Wuの直線アルゴリズムです

ピクセルのギザギザを目立たなくした線を描写します

 

 

#module
#deffunc plot int tx,int ty,double tc
    hsvcolor 0,0,255-tc*255
    pset tx,ty
    return
#defcfunc floor double x
    if x<0{return double(0+(x-0.999))}
    else{return double(0+x)}
#defcfunc ipart double x
    return floor(x)
#defcfunc fpart double x
    return x-floor(x)
#defcfunc rfpart double x
    return 1.0-fpart(x)
#defcfunc round double x
    return ipart(x + 0.5)
#deffunc swap var x,var y
    tmp=x
    x=y
    y=tmp
    return
#deffunc drawLine double m_x0,double m_y0,double m_x1,double m_y1
    x0=m_x0
    y0=m_y0
    x1=m_x1
    y1=m_y1
    if absf(y1-y0)>absf(x1-x0){
        steep=1
    }else{
        steep=0
    }
    
    if steep{
        swap x0, y0
        swap x1, y1
    }
    if x0>x1{
        swap x0, x1
        swap y0, y1
    }
    
    dx=x1-x0
    dy=y1-y0
    gradient=dy / dx
    if dx=0.0{
        gradient=1.0
    }

    xend=round(x0)
    yend=y0+gradient * (xend-x0)
    xgap=rfpart(x0+0.5)
    xpxl1=xend
    ypxl1=ipart(yend)
    if steep{
        plot ypxl1,   xpxl1, rfpart(yend) * xgap
        plot ypxl1+1, xpxl1,  fpart(yend) * xgap
    }else{
        plot xpxl1, ypxl1  , rfpart(yend) * xgap
        plot xpxl1, ypxl1+1,  fpart(yend) * xgap
    }
    intery=yend+gradient
    
    xend=round(x1)
    yend=y1+gradient * (xend-x1)
    xgap=fpart(x1+0.5)
    xpxl2=xend
    ypxl2=ipart(yend)
    if steep{
        plot ypxl2  , xpxl2, rfpart(yend) * xgap
        plot ypxl2+1, xpxl2,  fpart(yend) * xgap
    }else{
        plot xpxl2, ypxl2,  rfpart(yend) * xgap
        plot xpxl2, ypxl2+1, fpart(yend) * xgap
    }
    
    if steep{
        repeat (xpxl2-1)-(xpxl1+1)+1,xpxl1+1:x=cnt
            plot ipart(intery)  , x, rfpart(intery)
            plot ipart(intery)+1, x,  fpart(intery)
            intery=intery+gradient
        loop
    }else{
        repeat (xpxl2-1)-(xpxl1+1)+1,xpxl1+1:x=cnt
            plot x, ipart(intery),  rfpart(intery)
            plot x, ipart(intery)+1, fpart(intery)
            intery=intery+gradient
        loop
    }
    return
#global

buffer 2
drawLine 0,0,200,440
color
line 50,0,250,440

gsel 0
gzoom 640,480,2,0,0,160,120

0
    posted by higashijugem 19:51comments(0)|-|


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