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

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


<< アンチエイリアス付きの直線 | main | ヘックスマップ >>



視界範囲

ブレゼンハムアルゴリズムを用いて視界(あるいは光)の範囲を描写するアルゴリズムです

壁があると向こう側は見えなくなります

画面内でマウスの左クリックをすることでオブジェクトが置かれ、見える範囲を計算します

右クリックをするとオブジェクトが消去されます

 


#module
#defcfunc bresenham array map,int ex,int ey,int sx,int sy
    x=sx:y=sy
    if ex-sx>0{vx=1}else:if ex-sx<0{vx=-1}else{vx=0}
    if ey-sy>0{vy=1}else:if ey-sy<0{vy=-1}else{vy=0}
    ww=abs(ex-sx):hh=abs(ey-sy)
    if ww>hh{dup llen,ww:dup slen,hh:dup lh,x:dup sh,y:dup lv,vx:dup sv,vy:e=ww/2}
    else{dup llen,hh:dup slen,ww:dup lh,y:dup sh,x:dup lv,vy:dup sv,vx:e=hh/2}
    flg=1
    repeat
        lh+lv
        e+slen
        if (e>=llen){
            e-llen
            sh+sv
        }
        if map(x,y){
            flg=0
            break
        }
        if x=ex&y=ey:break
        await
    loop
    return flg
#global

csz=16
mc=640/csz:mr=480/csz
dim wmap,mc,mr
repeat 50
    wmap(rnd(mc),rnd(mr))=1
loop
dim pmap,mc,mr
dim bmap,mc,mr
arealen=9
buffer 2,csz*3,csz:x=0:celdiv 2,csz,csz
color 255:boxf x,0,x+csz,y+csz:x+csz    ;ユニット
color 1:boxf x,0,x+csz,y+csz:x+csz    ;壁
color ,255:boxf x,0,x+csz,y+csz:x+csz    ;範囲エフェクト
screen ,mc*csz,mr*csz
;ブレゼンハムアルゴリズムを用いて視界の範囲を求める
repeat
    getkey k1,1
    getkey k2,2
    mux=mousex/csz:muy=mousey/csz
    if k1{
        if pmap(mux,muy)=0&wmap(mux,muy)=0{
            pmap(mux,muy)=1
            repeat arealen*2+1,muy-arealen:j=cnt
                repeat arealen*2+1,mux-arealen:i=cnt
                    if 0<=i&i<mc&0<=j&j<mr{
                        if wmap(i,j)=0&bresenham(wmap,mux,muy,i,j){
                            bmap(i,j)++
                        }
                    }
                loop
            loop
        }
    }
    if k2{
        if pmap(mux,muy)=1{
            pmap(mux,muy)=0
            repeat arealen*2+1,muy-arealen:j=cnt
                repeat arealen*2+1,mux-arealen:i=cnt
                    if 0<=i&i<mc&0<=j&j<mr{
                        if wmap(i,j)=0&bresenham(wmap,mux,muy,i,j){
                            if bmap(i,j)>0{bmap(i,j)--}
                        }
                    }
                loop
            loop
        }
    }
    gosub *draw
    redraw:await 17:redraw 0
loop
stop
;描写
*draw
    color 255,255,255:boxf
    
    repeat mr:j=cnt
        repeat mc:i=cnt
            gmode 3,,,32
            repeat bmap(i,j)
                pos i*csz,j*csz
                celput 2,2
            loop
            gmode 2
            if wmap(i,j){
                pos i*csz,j*csz
                celput 2,1
            }
            if pmap(i,j){
                pos i*csz,j*csz
                celput 2,0
            }
        loop
    loop
    return

0
    posted by higashijugem 12:29comments(0)|-|


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