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

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


<< 文字列の数値判定 | main | バッファオーバーフロー対策 >>



障害物に引っかかるオブジェクト

画面上のキャラクター(赤いマス)はマウス(目標マス)に追従しますが、

キャラクターと目標の間に壁(黒いマス)がある場合、キャラクターは壁の向こう側に置いてけぼりにされます

ブレゼンハムアルゴリズムを用いることで実装しました


#module
#defcfunc bresenham array map,var gx,var gy,var px,var py
    bool=0
    if gx=px&gy=py:return bool
    ;ブレゼンハム(初期設定)
    x=px:y=py
    if gx-px>0{vx=1}else:if gx-px<0{vx=-1}else{vx=0}
    if gy-py>0{vy=1}else:if gy-py<0{vy=-1}else{vy=0}
    ww=abs(gx-px):hh=abs(gy-py)
    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}
    ;ブレゼンハム(処理)
    repeat
        if (e>=llen){
            e-llen
            sh+sv
        }else{
            e+slen
            lh+lv
        }
        await
        if map(x,y)=1:break
        if x=gx&y=gy{
            bool=1
            break
        }
    loop
    return bool
#global

randomize
;マップチップ生成
csz=32
mc=24:mr=16
buffer 2,csz*4,csz:celdiv 2,csz,csz
x=0
color 255,255,255
boxf x,0,x+csz,csz:x+csz
color 1
boxf x,0,x+csz,csz:x+csz
color 255
boxf x,0,x+csz,csz:x+csz
color ,,255
boxf x,0,x+csz,csz
color
boxf x+4,4,x+csz-5,csz-5
;壁生成
dim map,mc,mr
buffer 3,mc*csz,mr*csz
repeat 20
    if rnd(2){
        sx=rnd(mc)
        ex=sx
        sy=rnd(mr)
        ey=rnd(mr)
    }else{
        sx=rnd(mc)
        ex=rnd(mc)
        sy=rnd(mr)
        ey=sy
    }
    if ex-sx>=0{
        xdir=1
    }else{
        xdir=-1
    }
    if ey-sy>=0{
        ydir=1
    }else{
        ydir=-1
    }
    j=sy:i=sx
    repeat abs(ey-sy)/2+1
        repeat abs(ex-sx)/2+1
            map(i,j)=1
            i+xdir
        loop
        i=sx:j+ydir
    loop
loop
flg=0
repeat mr:j=cnt
    repeat mc:i=cnt
        if flg=0&map(i,j)=0{
            objx=i:objy=j:flg=1
        }
        pos i*csz,j*csz:celput 2,map(i,j)
    loop
loop
;処理開始
screen 0,mc*csz,mr*csz
gmode 2
repeat
    pos 0,0:gcopy 3,,,mc*csz,mr*csz
    if 0<=mousex&mousex<ginfo_winx&0<=mousey&mousey<ginfo_winy{
        mpx=mousex/csz:mpy=mousey/csz
        pos objx*csz,objy*csz:celput 2,2
        pos mpx*csz,mpy*csz:celput 2,3
        flg=bresenham(map,mpx,mpy,objx,objy)
        if flg{
            objx=mpx:objy=mpy
        }
    }
    redraw:await 17:redraw 0
loop

0
    posted by higashijugem 16:45comments(0)|-|


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