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

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


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



多角形の内部の反射処理

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

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

 

#include"hgimg3.as"
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}
            wex=0f+wldt(0,wlct):wey=0f+wldt(1,wlct):wsx=0f+wldt(2,wlct):wsy=0f+wldt(3,wlct)
            bsx=bldt(0):bsy=bldt(1):bex=tblx:bey=tbly
            d=(wex-wsx)*(bey-bsy)-(wey-wsy)*(bex-bsx)
            if d<-0.00001|0.00001<d{
                u=((bsx-wsx)*(bey-bsy)-(bsy-wsy)*(bex-bsx))/d
                v=((bsx-wsx)*(wey-wsy)-(bsy-wsy)*(wex-wsx))/d
                if (u>=0.0&u<=1.0)&(v>=0.0&v<=1.0){
                    ;壁とボールの軌道の交点
                    crsx=0f+wsx+u*(wex-wsx)
                    crsy=0f+wsy+u*(wey-wsy)
                    ;壁同士の境目に来た場合、位置調整
                    wrad=atan(wey-wsy,wex-wsx)
                    if sqrt(powf(crsx-wex,2)+powf(crsy-wey,2))<=1{
                        crsx-=cos(wrad):crsy-=sin(wrad)
                        twlct=wlct+1:if twlct>=length2(wldt){twlct=0}
                        wnrad=atan(wldt(3,twlct)-wldt(1,twlct),wldt(2,twlct)-wldt(0,twlct))
                        crsx-=cos(wnrad):crsy-=sin(wnrad)
                    }else:if sqrt(powf(crsx-wsx,2)+powf(crsy-wsy,2))<=1{
                        crsx+=cos(wrad):crsy+=sin(wrad)
                        twlct=wlct-1:if twlct<0{twlct=length2(wldt)-1}
                        wnrad=atan(wldt(3,twlct)-wldt(1,twlct),wldt(2,twlct)-wldt(0,twlct))
                        crsx+=cos(wnrad):crsy+=sin(wnrad)
                    }
                    ;反射ベクトル計算
                    ndir=-atan(wex-wsx,wey-wsy)
                    fx=cos(bldt(3)):fy=sin(bldt(3))
                    nx=cos(ndir):ny=sin(ndir)
                    dot=(-fx)*nx+(-fy)*ny
                    rx=fx+2.0*dot*nx
                    ry=fy+2.0*dot*ny
                    bldt(3)=atan(ry,rx)
                    ;反射後のボールの位置
                    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)|-|


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