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

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


<< LOSアルゴリズム | main | 縄張りアルゴリズム >>



迎撃アルゴリズム

キャラクターの接触ポイントを予測し、それに基づいた行動をさせるアルゴリズムです

 


#enum e_i_sflg=0
#enum e_i_stype
#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,2,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
d_shipdt(0,1)=50.0, 420.0, deg2rad(0), 0.8

*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
            x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
            if i_shipdt(e_i_stype,spid)=0{
                color ,,255
            }else{    ;相手の迎撃アルゴリズム
                len=999999.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
                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(espx-fspx,2)+powf(espy-fspy,2))
                        if len>tlen{
                            len=tlen
                            losid=tspid
                        }
                    }
                loop
                if losid>=0{
                    fspx=d_shipdt(e_d_sx,losid)
                    fspy=d_shipdt(e_d_sy,losid)
                    fsprad=d_shipdt(e_d_srad,losid)
                    fspspd=d_shipdt(e_d_sspd,losid)
                    fax=cos(fsprad)*fspspd:fay=sin(fsprad)*fspspd
                    eax=cos(esprad)*espspd:eay=sin(esprad)*espspd
                    vrx=fax-eax:vry=fay-eay
                    srx=fspx-espx:sry=fspy-espy
                    tc=sqrt(srx*srx+sry*sry)/sqrt(vrx*vrx+vry*vry)
                    stx=fspx+fax*tc:sty=fspy+fay*tc
                    ;予測衝突地点
                    color:circle stx-10,sty-10,stx+10,sty+10,0
                    rot2=atan(sty-espy,stx-espx)
                    rot1=esprad
                    ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                    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
            }
            circle x-10,y-10,x+10,y+10
        }
    loop
    redraw:await 17:redraw 0
    goto *main

0
    posted by higashijugem 21:51comments(0)|-|


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