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

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


<< うそつきクイズ | main | 文字数を指定してバイト数を取得 >>



ウィザードリィ風3D視点

3DダンジョンRPGの視点を再現したプログラムです

十字キーで移動、旋回ができます

 

#const c_parts 15
#enum e_empty=0
#enum e_wl
gw=640:gh=480
gwh=gw/2:ghh=gh/2
buffer 2,gw,gh
buffer 3,gw,gh
;迷路作成
randomize
mc=5:mr=5
dim mapdt,mc,mr
repeat mr:j=cnt
    repeat mc:i=cnt
        mapdt(i,j)=e_wl
    loop
loop
dim dx,4:dx=-1,0,1,0
dim dy,4:dy=0,-1,0,1
mapdt(0,0)=1,1,1,1,1
mapdt(0,1)=1,0,0,0,1
mapdt(0,2)=1,1,0,1,1
mapdt(0,3)=1,0,0,0,1
mapdt(0,4)=1,1,1,1,1
;壁データ作成
cx=gw/2:cy=gh/2
wldir=40
wlpt0=550
wlpt1=wlpt0-250
wlpt2=wlpt1-150
wlpt3=wlpt2-100
ddim wllndtx,4,c_parts
ddim wllndty,4,c_parts
lurad=deg2rad(180-wldir)
lbrad=deg2rad(180+wldir)
lurad2=lurad
lbrad2=lbrad
rurad=deg2rad(wldir)
rbrad=deg2rad(-wldir)
rurad2=rurad
rbrad2=rbrad
;左壁大
wllndtx(0,0)=cos(lurad)*wlpt1+cx,cos(lurad)*wlpt0+cx,cos(lbrad)*wlpt0+cx,cos(lbrad)*wlpt1+cx
wllndty(0,0)=sin(lurad)*wlpt1+cy,sin(lurad)*wlpt0+cy,sin(lbrad)*wlpt0+cy,sin(lbrad)*wlpt1+cy
;右壁大
wllndtx(0,1)=cos(rurad)*wlpt1+cx,cos(rurad)*wlpt0+cx,cos(rbrad)*wlpt0+cx,cos(rbrad)*wlpt1+cx
wllndty(0,1)=sin(rurad)*wlpt1+cy,sin(rurad)*wlpt0+cy,sin(rbrad)*wlpt0+cy,sin(rbrad)*wlpt1+cy
;正面大
wllndtx(0,2)=cos(lurad)*wlpt1+cx,cos(rurad)*wlpt1+cx,cos(rbrad)*wlpt1+cx,cos(lbrad)*wlpt1+cx
wllndty(0,2)=sin(lurad)*wlpt1+cy,sin(rurad)*wlpt1+cy,sin(rbrad)*wlpt1+cy,sin(lbrad)*wlpt1+cy
;左壁中
wllndtx(0,3)=cos(lurad)*wlpt2+cx,cos(lurad)*wlpt1+cx,cos(lbrad)*wlpt1+cx,cos(lbrad)*wlpt2+cx
wllndty(0,3)=sin(lurad)*wlpt2+cy,sin(lurad)*wlpt1+cy,sin(lbrad)*wlpt1+cy,sin(lbrad)*wlpt2+cy
;右壁中
wllndtx(0,4)=cos(rurad)*wlpt2+cx,cos(rurad)*wlpt1+cx,cos(rbrad)*wlpt1+cx,cos(rbrad)*wlpt2+cx
wllndty(0,4)=sin(rurad)*wlpt2+cy,sin(rurad)*wlpt1+cy,sin(rbrad)*wlpt1+cy,sin(rbrad)*wlpt2+cy
;正面中
wllndtx(0,5)=cos(lurad)*wlpt2+cx,cos(rurad)*wlpt2+cx,cos(rbrad)*wlpt2+cx,cos(lbrad)*wlpt2+cx
wllndty(0,5)=sin(lurad)*wlpt2+cy,sin(rurad)*wlpt2+cy,sin(rbrad)*wlpt2+cy,sin(lbrad)*wlpt2+cy
;左壁小
wllndtx(0,6)=cos(lurad)*wlpt3+cx,cos(lurad)*wlpt2+cx,cos(lbrad)*wlpt2+cx,cos(lbrad)*wlpt3+cx
wllndty(0,6)=sin(lurad)*wlpt3+cy,sin(lurad)*wlpt2+cy,sin(lbrad)*wlpt2+cy,sin(lbrad)*wlpt3+cy
;右壁小
wllndtx(0,7)=cos(rurad)*wlpt3+cx,cos(rurad)*wlpt2+cx,cos(rbrad)*wlpt2+cx,cos(rbrad)*wlpt3+cx
wllndty(0,7)=sin(rurad)*wlpt3+cy,sin(rurad)*wlpt2+cy,sin(rbrad)*wlpt2+cy,sin(rbrad)*wlpt3+cy
;正面小
wllndtx(0,8)=cos(lurad)*wlpt3+cx,cos(rurad)*wlpt3+cx,cos(rbrad)*wlpt3+cx,cos(lbrad)*wlpt3+cx
wllndty(0,8)=sin(lurad)*wlpt3+cy,sin(rurad)*wlpt3+cy,sin(rbrad)*wlpt3+cy,sin(lbrad)*wlpt3+cy
;左側奥
wllndtx(0,9)=cos(lurad)*wlpt2+cx,cos(lurad2)*wlpt3+cx,cos(lbrad2)*wlpt3+cx,cos(lbrad)*wlpt2+cx
wllndty(0,9)=sin(lurad)*wlpt3+cy,sin(lurad2)*wlpt3+cy,sin(lbrad2)*wlpt3+cy,sin(lbrad)*wlpt3+cy
;右側奥
wllndtx(0,10)=cos(rurad2)*wlpt3+cx,cos(rurad)*wlpt2+cx,cos(rbrad)*wlpt2+cx,cos(rbrad2)*wlpt3+cx
wllndty(0,10)=sin(rurad2)*wlpt3+cy,sin(rurad)*wlpt3+cy,sin(rbrad)*wlpt3+cy,sin(rbrad2)*wlpt3+cy
;左側小
wllndtx(0,11)=cos(lurad)*wlpt1+cx,cos(lurad2)*wlpt2+cx,cos(lbrad2)*wlpt2+cx,cos(lbrad)*wlpt1+cx
wllndty(0,11)=sin(lurad)*wlpt2+cy,sin(lurad2)*wlpt2+cy,sin(lbrad2)*wlpt2+cy,sin(lbrad)*wlpt2+cy
;右側小
wllndtx(0,12)=cos(rurad2)*wlpt2+cx,cos(rurad)*wlpt1+cx,cos(rbrad)*wlpt1+cx,cos(rbrad2)*wlpt2+cx
wllndty(0,12)=sin(rurad2)*wlpt2+cy,sin(rurad)*wlpt2+cy,sin(rbrad)*wlpt2+cy,sin(rbrad2)*wlpt2+cy
;左側中
wllndtx(0,13)=cos(lurad)*wlpt0+cx,cos(lurad2)*wlpt1+cx,cos(lbrad2)*wlpt1+cx,cos(lbrad)*wlpt0+cx
wllndty(0,13)=sin(lurad)*wlpt1+cy,sin(lurad2)*wlpt1+cy,sin(lbrad2)*wlpt1+cy,sin(lbrad)*wlpt1+cy
;右側中
wllndtx(0,14)=cos(rurad2)*wlpt1+cx,cos(rurad)*wlpt0+cx,cos(rbrad)*wlpt0+cx,cos(rbrad2)*wlpt1+cx
wllndty(0,14)=sin(rurad2)*wlpt1+cy,sin(rurad)*wlpt1+cy,sin(rbrad)*wlpt1+cy,sin(rbrad2)*wlpt1+cy
;チェックマスデータ作成
dim chkdx,c_parts
dim chkdy,c_parts
dim patternx,c_parts,4
dim patterny,c_parts,4
patternx(0,0)=0,0,-1,-1,-1,-2,-2,-2,-3,-3,-3
patterny(0,0)=1,-1,0,1,-1,0,1,-1,0,1,-1
patternx(0,1)=-1,1,0,-1,1,0,-1,1,0,-1,1
patterny(0,1)=0,0,-1,-1,-1,-2,-2,-2,-3,-3,-3
patternx(0,2)=0,0,1,1,1,2,2,2,3,3,3
patterny(0,2)=-1,1,0,-1,1,0,-1,1,0,-1,1
patternx(0,3)=1,-1,0,1,-1,0,1,-1,0,1,-1
patterny(0,3)=0,0,1,1,1,2,2,2,3,3,3
repeat 4
    patternx(11,cnt)=patternx(6,cnt),patternx(7,cnt),patternx(3,cnt),patternx(4,cnt)
    patterny(11,cnt)=patterny(6,cnt),patterny(7,cnt),patterny(3,cnt),patterny(4,cnt)
loop
;処理開始
gsel 0
startx=1:starty=1:startdir=2
plrx=startx:plry=starty:plrdir=startdir
oncmd gosub *on_keydown,0x0100
gosub *mazedraw
stop
*on_keydown
    oncmd 0
    tplrx=plrx
    tplry=plry
    if wparam=37{    ;左旋回
        plrdir=(plrdir-1)&3
        sceneid=0
    }else:if wparam=38{    ;前進
        tplrx=plrx+dx(plrdir)
        tplry=plry+dy(plrdir)
        sceneid=1
    }else:if wparam=39{    ;右旋回
        plrdir=(plrdir+1)&3
        sceneid=2
    }else:if wparam=40{    ;後退
        tplrx=plrx-dx(plrdir)
        tplry=plry-dy(plrdir)
        sceneid=3
    }
    if mapdt(tplrx,tplry)=0{
        plrx=tplrx
        plry=tplry
        gosub *mazedraw
    }
    oncmd 1
    return
*mazedraw
    redraw 0:color:boxf:color 255,255,255
    memcpy chkdx,patternx,c_parts*4,0,plrdir*c_parts*4
    memcpy chkdy,patterny,c_parts*4,0,plrdir*c_parts*4
    dim chkflg,c_parts
    repeat c_parts
        chkdx(cnt)+plrx
        chkdy(cnt)+plry
        x=chkdx(cnt):y=chkdy(cnt)
        if 0<=x&x<mc&0<=y&y<mr{
            chkflg(cnt)=mapdt(chkdx(cnt),chkdy(cnt))
        }else{
            chkflg(cnt)=e_wl
        }
    loop
    if chkflg(2)=e_wl{
        repeat 10,3
            chkflg(cnt)=e_empty
        loop
    }else{
        if chkflg(5)=e_wl{
            repeat 5,6
                chkflg(cnt)=e_empty
            loop
        }else{
            repeat 2,6
                if chkflg(cnt)=e_wl:chkflg(cnt+3)=0
            loop
        }
        repeat 2,3
            if chkflg(cnt)=e_wl:chkflg(cnt+8)=0
        loop
    }
    repeat 2
        if chkflg(cnt)=e_wl:chkflg(cnt+13)=0
    loop
    repeat c_parts:id=cnt
        if chkflg(id)=e_wl{
            pos wllndtx(3,id),wllndty(3,id)
            repeat 4,0
                line wllndtx(cnt,id),wllndty(cnt,id)
            loop
        }
    loop
    redraw
    return

 

 

参考資料:http://hp.vector.co.jp/authors/VA054130/%E8%BF%B7%E8%B7%AF%E6%8F%8F%E7%94%BB%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%EF%BC%92.txt

0
    posted by higashijugem 13:09comments(0)|-|


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