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

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


<< 2直線と平行のベクトル | main | 徐々に線引き >>



多角形の内部の反射処理

図形の内部にバウンドするボール(オブジェクト)を置き、それらを跳ね回らせるプログラムです

マウスホイールを動かすことでボールが動く速度を変えることができます

 


randomize
ddim bldt,4        ;ボールデータ
bldt(0)=320.0,240.0,30.0,deg2rad(rnd(360))
ddim wldt,5,4    ;壁データ
wldt(0,0)=500,100,100,50
wldt(0,1)=600,300,500,100
wldt(0,2)=300,400,600,300
wldt(0,3)=50,250,300,400
wldt(0,4)=100,50,50,250
repeat
    color:boxf:color 255,255,255
    tmuw=mousew
    if tmuw<0{    ;速度変更
        bldt(2)=limitf(bldt(2)-5,0,100)
    }else:if tmuw>0{
        bldt(2)=limitf(bldt(2)+5,0,100)
    }
    repeat length2(wldt)
        line wldt(0,cnt),wldt(1,cnt),wldt(2,cnt),wldt(3,cnt)
    loop
    tspd=bldt(2)
    pos bldt(0),bldt(1)
    hh0=bldt(0):hh1=bldt(1):hh2=bldt(2):hh3=bldt(3)
    repeat
        ;線分交差判定
        tblx=bldt(0)+(cos(bldt(3))*tspd)
        tbly=bldt(1)+(sin(bldt(3))*tspd)
        csflg=0:wlflg=0
        repeat length2(wldt)+1:wlct=cnt:if wlct>=length2(wldt){wlct=0}
            x1=0f+wldt(0,wlct):y1=0f+wldt(1,wlct):x2=0f+wldt(2,wlct):y2=0f+wldt(3,wlct)
            x3=bldt(0):y3=bldt(1):x4=tblx:y4=tbly
            d=(x2-x1)*(y4-y3)-(y2-y1)*(x4-x3)
            if d<-0.00001|0.00001<d{
                u=((x3-x1)*(y4-y3)-(y3-y1)*(x4-x3))/d
                v=((x3-x1)*(y2-y1)-(y3-y1)*(x2-x1))/d
                if (u>=0.0&u<=1.0)&(v>=0.0&v<=1.0){
                    ;壁とボールの軌道の交点
                    crsx=0f+x1+u*(x2-x1)
                    crsy=0f+y1+u*(y2-y1)
                    ;反射ベクトル計算
                    wldir=atan(y1-y2,x1-x2)
                    cnflg=0:twlct=wlct
                    wlcos=cos(wldir):wlsin=sin(wldir)
                    blcos=-cos(bldt(3)):blsin=-sin(bldt(3))
                    l=(wlcos*wlcos+wlsin*wlsin)*2.0
                    if l<-0.00001|0.00001<l{
                        t=-(wlcos*blcos+wlsin*blsin)/(wlcos*wlcos+wlsin*wlsin)*2.0
                    }else{
                        t=-(wlcos*blcos+wlsin*blsin)
                    }
                    ;反射後の移動ベクトル
                    x=blcos+t*wlcos:y=blsin+t*wlsin
                    bldt(3)=atan(y,x)
                    exspd=sqrt(powf(tblx-crsx,2)+powf(tbly-crsy,2))
                    if exspd<1{exspd=1.0}
                    tblx=crsx+cos(bldt(3))*exspd
                    tbly=crsy+sin(bldt(3))*exspd
                    csflg=1
                }
            }
        loop
        if csflg{
            bldt(0)=crsx+cos(bldt(3))
            bldt(1)=crsy+sin(bldt(3))
            line bldt(0),bldt(1)
            tspd=exspd
        }else{
            bldt(0)=tblx
            bldt(1)=tbly
            break
        }
        await
    loop
    ;描写
    tx=bldt(0):ty=bldt(1)
    line bldt(0),bldt(1)
    circle tx-10,ty-10,tx+10,ty+10
    redraw:await 17:redraw 0
loop

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


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