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

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


<< 船の移動 | main | ひまわりの種の配置 >>



船の陣形

360度移動するオブジェクトに取り巻きを追加したプログラムです。

複数の味方による隊形を組むなど、RTSなどで使えるアルゴリズムです。

 


;画像作成
csz=32
buffer 2,csz*2,csz:celdiv 2,csz,csz,csz/2,csz/2
zx=csz,csz,csz/4,csz/4
zy=csz/2,csz/2,csz,0
color:gsquare -1,zx,zy
color ,,255:boxf 0,0,4,csz
repeat 4:zx(cnt)+csz:loop
color 255:gsquare -2,zx,zy
color ,,255:boxf csz,0,csz+4,csz
;味方の隊列の相対的な位置
ddim kankaku,2,4
kankaku(0,0)=deg2rad(150),50.0
kankaku(0,1)=deg2rad(150),100.0
kankaku(0,2)=deg2rad(210),50.0
kankaku(0,3)=deg2rad(210),100.0
ddim kantai,4,4
;処理開始
gsel
urad=0.0
spd=5
cx=320.0:cy=240.0
repeat 4
    moverad=kankaku(0,cnt)
    x=cos(urad)*kankaku(1,cnt)
    y=sin(urad)*kankaku(1,cnt)
    kantai(1,cnt)=(x*cos(moverad)-y*sin(moverad))+cx
    kantai(2,cnt)=(x*sin(moverad)+y*cos(moverad))+cy
loop
repeat:c1=cnt
    mux=mousex:muy=mousey
    getkey k1,1
    color 255,255,255:boxf
    if k1{
        mdir=atan(muy-cy,mux-cx)
        ;旋回
        rad=mdir-deg2rad((urad*180.0/M_PI)¥360)
        if rad>M_PI:rad-M_PI*2
        if rad<-M_PI:rad+M_PI*2
        if rad>0.1{
            urad+0.1
        }
        if rad<-0.1{
            urad-0.1
        }
        ;移動
        urad=deg2rad((urad*180.0/M_PI)¥360)
        h0=sqrt(powf(muy-cy,2)+powf(mux-cx,2))
        if h0>spd&absf(rad)<=M_PI/3{
            cx+=cos(urad)*spd
            cy+=sin(urad)*spd
        }
    }
    ;艦隊の位置と向きを揃えるように動く
    repeat 4
        moverad=kankaku(0,cnt)
        x=cos(urad)*kankaku(1,cnt)
        y=sin(urad)*kankaku(1,cnt)
        nx=(x*cos(moverad)-y*sin(moverad))+cx
        ny=(x*sin(moverad)+y*cos(moverad))+cy

        kx=kantai(1,cnt)
        ky=kantai(2,cnt)
        krad=kantai(3,cnt)
        h0=sqrt(powf(ny-ky,2)+powf(nx-kx,2))
        if h0>spd{
            ;旋回
            mdir=atan(ny-ky,nx-kx)
            rad=mdir-krad
            if rad>M_PI:rad-M_PI*2
            if rad<-M_PI:rad+M_PI*2
            if rad>0.1{
                krad+0.1
            }else:if rad<-0.1{
                krad-0.1
            }
            ;移動
            if absf(rad)<=M_PI/3{
                kx=kx+cos(krad)*spd*1.2
                ky=ky+sin(krad)*spd*1.2
            }
        }else{
            ;旋回
            rad=urad-krad
            if rad>M_PI:rad-M_PI*2
            if rad<-M_PI:rad+M_PI*2
            if rad>0.1{
                krad+0.1
            }else:if rad<-0.1{
                krad-0.1
            }
        }
        kantai(1,cnt)=kx
        kantai(2,cnt)=ky
        kantai(3,cnt)=deg2rad((krad*180.0/M_PI)¥360)
    loop
    pos  cx,cy:celput 2,0,,,urad
    color 255
    repeat 4
        pos kantai(1,cnt),kantai(2,cnt)
        celput 2,1,,,kantai(3,cnt)
    loop
    redraw:await 17:redraw 0
loop

0
    posted by higashijugem 20:37comments(0)|-|


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