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

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


<< ウィンドウの移動を検知 | main | うそつきクイズ >>



マーブリング

こちらのサイトに「マーブリング」という表現技法を再現したプログラムがあったので、HSPでも実装してみました

ソースコードはこちらのサイトをパクら参考にさせていただきました

処理が重すぎたり、もっとキャンパスをでかくしたい場合はgwとghのサイズを変更してみてください

 

VRAMを利用したりマシン語を用いたりすれば動作がさらに軽くなります

もっと軽快にしたい方は挑戦してみてください


randomize
gw=250:gh=250
screen 0,gw,gh,1
oncmd gosub *on_EXITSIZEMOVE, 0x0232
oncmd gosub *on_KEYDOWN, 0x0100
winx=ginfo(4):winy=ginfo(5)
;パレットカラー設定
colmax=10
repeat colmax-1,1
    hsvcolor (cnt-1)*19,255,255
    palette cnt,ginfo_r,ginfo_g,ginfo_b
loop
palette 0,255,255,255,1
;処理開始
dim board,gw,gh
dim tboard,gw,gh
tr=10.0
ncl=1
repeat
    getkey k1,1
    getkey k2,2
    muw=mousew
    if k1{    ;左クリックで滴下
        if k1flg=0{
            ;ncl=rnd(colmax-1)+1    ;色をランダム指定する場合はコメント解除
            r=tr
            k1flg=1
        }
        if x!=mousex|y!=mousey{
            r=tr
        }
        x=mousex:y=mousey
        gosub *drawcircle
        r+=1.0
    }else{
        r=tr
        k1flg=0
    }
    if k2{    ;右クリックしたままドラッグで引っ張り
        if k2flg=0{
            x=mousex:y=mousey
        }
        k2flg=1
    }else{
        if k2flg{
            tx=mousex:ty=mousey
            if tx!=x|ty!=y{
                theta=atan(ty-y,tx-x)
                ex=cos(theta)
                ey=sin(theta)
                rx=cos(theta+M_PI/2)
                ry=sin(theta+M_PI/2)
                alpha=sqrt(powf(ty-y,2)+powf(tx-x,2))
                beta=sqrt(alpha)
                gosub *drawline
                k2flg=0
            }
        }
    }
    if muw!=0{    ;マウスホイールを動かすと攪拌
        x=mousex:y=mousey
        r=0f+rnd(100)
        if muw>0{
            alpha=0f+muw
        }else{
            alpha=-0f+muw
        }
        beta=10.0
        gosub *drawspiral
    }
    redraw:wait:redraw 0
loop
*on_KEYDOWN
    if 48<=wparam&wparam<=57{    ;テンキーで描写する色を変更
        ncl=wparam-48
    }
    return
*on_EXITSIZEMOVE
    if winx!=ginfo(4)|winy!=ginfo(5){    ;ウィンドウを動かすと波打つ
        A=sqrt(powf(winx-ginfo(4),2)+powf(winy-ginfo(5),2))/50
        t=atan(ginfo(5)-winy,ginfo(4)-winx)
        fai=deg2rad(rnd(180))
        omega=0.5
        gosub *drawwave
    }
    winx=ginfo(4):winy=ginfo(5)
    return
*drawcircle
    memcpy tboard,board,gw*gh*4
    repeat gh:j=cnt
        repeat gw:i=cnt
            if powf(i-x,2)+powf(j-y,2)<=powf(r,2){
                board(i,j)=ncl
            }else{
                tmp=sqrt(1.0-powf(r,2)/(powf(i-x,2)+powf(j-y,2)))
                fx=0+(0.5+tmp*(i-x)+x)
                fy=0+(0.5+tmp*(j-y)+y)
                if 0<=fx&fx<gw&0<=fy&fy<gh{
                    board(i,j)=tboard(fx,fy)
                }
            }
            palcolor board(i,j)
            pset i,j
        loop
    loop
    return
*drawline
    memcpy tboard,board,gw*gh*4
    repeat gh:j=cnt
        repeat gw:i=cnt
            tmp=alpha*beta/(beta+absf(rx*(i-x)+ry*(j-y)))
            fx=0+((0.5+i)-tmp*ex)
            fy=0+((0.5+j)-tmp*ey)
            if 0<=fx&fx<gw&0<=fy&fy<gh{
                board(i,j)=tboard(fx,fy)
            }
            palcolor board(i,j)
            pset i,j
        loop
    loop
    return
*drawspiral
    memcpy tboard,board,gw*gh*4
    repeat gh:j=cnt
        repeat gw:i=cnt
            len=powf(i-x,2)+powf(j-y,2)
            if len>0{
                d=absf(sqrt(len)-r)
                theta=alpha*beta/((d+beta)*(sqrt(len)))
                fx=0+((cos(theta)*(i-x)+x+sin(theta)*(j-y))+0.5)
                fy=0+(((-sin(theta))*(i-x)+y+cos(theta)*(j-y))+0.5)
                if 0<=fx&fx<gw&0<=fy&fy<gh{
                    board(i,j)=tboard(fx,fy)
                }
            }
            palcolor board(i,j)
            pset i,j
        loop
    loop
    return
*drawwave
    memcpy tboard,board,gw*gh*4
    repeat gh:j=cnt
        repeat gw:i=cnt
            theta=omega*(sin(t)*i-cos(t)*j)+fai
            fx=0+((0f+i)-A*sin(theta)*cos(t)+0.5)
            fy=0+((0f+j)-A*sin(theta)*sin(t)+0.5)
            if 0<=fx&fx<gw&0<=fy&fy<gh{
                board(i,j)=tboard(fx,fy)
            }
            palcolor board(i,j)
            pset i,j
        loop
    loop
    return

0
    posted by higashijugem 11:55comments(0)|-|


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