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

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


<< 迎撃アルゴリズム | main | 落下と上昇 >>



縄張りアルゴリズム

一定の範囲内に進入した場合のみ、キャラクターを追いかけるプログラムです

 

 

#enum e_i_sflg=0
#enum e_i_stype
#enum e_i_rsensx
#enum e_i_rsensy
#enum e_i_rsenslen
#enum e_i_target
#enum e_d_sx=0
#enum e_d_sy
#enum e_d_srad
#enum e_d_sspd
pirad2=M_PI*2

spsum=2
steer=0.01
dim i_shipdt,6,spsum
ddim d_shipdt,4,spsum
i_shipdt(0,0)=1,0
d_shipdt(0,0)=600.0, 400.0, deg2rad(220), 0.5
i_shipdt(0,1)=1,1,300,320,200,-1
d_shipdt(0,1)=300.0, 320.0, deg2rad(0), 0.0

*main
    color 255,255,255:boxf:color
    repeat spsum:spid=cnt
        if i_shipdt(e_i_sflg,spid){
            rad=d_shipdt(e_d_srad,spid)
            spd=d_shipdt(e_d_sspd,spid)
            d_shipdt(e_d_sx,spid)+=cos(rad)*spd
            d_shipdt(e_d_sy,spid)+=sin(rad)*spd
            if i_shipdt(e_i_stype,spid)=0{
                color ,,255
            }else{    ;相手のなわばりアルゴリズム
                rsx=0f+i_shipdt(e_i_rsensx,spid)
                rsy=0f+i_shipdt(e_i_rsensy,spid)
                len=0f+i_shipdt(e_i_rsenslen,spid)
                ;なわばり範囲
                color:circle rsx-len,rsy-len,rsx+len,rsy+len,0
                espx=d_shipdt(e_d_sx,spid)
                espy=d_shipdt(e_d_sy,spid)
                esprad=d_shipdt(e_d_srad,spid)
                espspd=d_shipdt(e_d_sspd,spid)
                losid=-1
                if i_shipdt(e_i_target,spid)>=0{
                    fspx=d_shipdt(e_d_sx,i_shipdt(e_i_target,spid))
                    fspy=d_shipdt(e_d_sy,i_shipdt(e_i_target,spid))
                    tlen=sqrt(powf(rsx-fspx,2)+powf(rsy-fspy,2))
                    if len>tlen{
                        i_shipdt(e_i_target,spid)=-1
                    }
                }
                if i_shipdt(e_i_target,spid)<0{
                    repeat spsum:tspid=cnt
                        if spid!=tspid&i_shipdt(e_i_stype,tspid)=0{
                            fspx=d_shipdt(e_d_sx,tspid)
                            fspy=d_shipdt(e_d_sy,tspid)
                            tlen=sqrt(powf(rsx-fspx,2)+powf(rsy-fspy,2))
                            if len>tlen{
                                len=tlen
                                losid=tspid
                                d_shipdt(e_d_sspd,spid)=0.8
                            }
                        }
                    loop
                }
                if losid>=0{    ;縄張り内に侵入者
                    i_shipdt(e_i_target,spid)=losid
                    rot2=atan(fspy-espy,fspx-espx)
                    rot1=esprad
                    ;下の行をアンコメントするとどこまでも追いかける
                    ;i_shipdt(e_i_rsenslen,spid)=999999
                }else{    ;侵入者が縄張り外に出た場合
                    tlen=sqrt(powf(rsx-espx,2)+powf(rsy-espy,2))
                    if tlen>10{    ;ほぼ中心地に戻る
                        rot2=atan(rsy-espy,rsx-espx)
                        rot1=esprad
                    }else{
                        d_shipdt(e_d_sspd,spid)=0.0
                    }
                }
                ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                rad=rot2-rot1
                ;方向の値が0〜円周率に収まるようにする
                if rad>M_PI:rad-pirad2
                if rad<-M_PI:rad+pirad2
                if rad>steer{d_shipdt(e_d_srad,spid)+steer}
                if rad<-steer{d_shipdt(e_d_srad,spid)-steer}
                color 255
            }
            x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
            circle x-10,y-10,x+10,y+10
        }
    loop
    redraw:await 17:redraw 0
    goto *main

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


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