RECOMMEND
SELECTED ENTRIES
CATEGORIES
ARCHIVES
MOBILE
qrcode
LINKS
PROFILE
OTHERS

06
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--

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

私がその日作った短めのソースを簡単な解説とともに載せていきます。
ゲーム制作初心者にとって参考になるかもしれないソースが多いです。
主にHSPでプログラミングされています。
ブロックエリア
0

    四角い範囲の中を、任意の大きさのピースで隙間なく埋めるプログラムです

    ピースの大きさは実数で指定しています

    キーボードのように様々なサイズのマスをエリア内に配置した描写を行う時に使えます

    このプログラムでは横方向のサイズのみしか指定できず、縦方向は統一されています

     


    ddim pieceprop,20,20
    pieceprop(0,0)=1.0, 1.0, 1.0, 1.0, 1.0
    pieceprop(0,1)=1.5, 1.0, 1.0, 1.5
    pieceprop(0,2)=1.7, 1.0, 1.0, 1.3
    pieceprop(0,3)=2.0, 2.0, 1.0
    pieceprop(0,4)=1.5, 3.5

    areaw=300    ;エリアの横幅
    areah=300    ;エリアの縦幅

    dim piecesize,2,20,20
    ;それぞれのピースの横幅
    repeat length2(pieceprop):j=cnt
        if pieceprop(0,j)<0.00001{
            break
        }
        x=0.0
        repeat length(pieceprop):i=cnt
            if pieceprop(i,j)<0.00001{
                break
            }
            x+pieceprop(i,j)
        loop
        len=(0f+areaw)/x
        repeat i:k=cnt
            piecesize(0,k,j)=0+(len*pieceprop(k,j))
        loop
        k+1
        piecesize(0,k,j)=0+(len*pieceprop(k,j))
    loop
    ;それぞれのピースの縦幅
    ylen=areah/(j+1)
    repeat length2(pieceprop):j=cnt
        if pieceprop(0,j)<0.00001{
            break
        }
        repeat length(pieceprop):i=cnt
            if pieceprop(i,j)<0.00001{
                break
            }
            piecesize(1,i,j)=ylen
        loop
    loop
    ;表示
    ltx=100:lty=100
    cl=0
    repeat length2(pieceprop):j=cnt
        tx=ltx:ty=lty+cnt*ylen
        repeat length(pieceprop):i=cnt
            hsvcolor cl,255,255:cl+6
            w=piecesize(0,i,j)
            h=piecesize(1,i,j)
            boxf tx,ty,tx+w-2,ty+h-2
            tx+w
        loop
    loop

    | HSP | 22:04 | comments(0) | - | - |
    DLA
    0

      diffusion-limited aggregation(拡散律速凝集)のプログラムです

      DLAとは運動する粒子が核にくっついて成長させる過程を指し、以下のプログラムを実行すると枝が伸びた放射線状の模様が描写されます

       


      #include"hspda.as"
      rndf_ini
      randomize
      lpnum=10000    ;繰り返し回数
      cenx=320:ceny=240    ;中心点
      r=0.0
      maxr=0.0
      theta=0.0
      boxf
      color 255,255,255
      pset cenx,ceny    ;中心(核)描写
      repeat lpnum:n=cnt
          ;外周から粒子を出す
          rndf_get r
          theta=r*M_PI*2
          ix=cos(theta)*maxr+cenx
          iy=sin(theta)*maxr+ceny
          ;結晶に接触するまで粒子を泳がせる
          repeat
              nix=ix+rnd(3)-1
              niy=iy+rnd(3)-1
              if sqrt(powf(nix-cenx,2)+powf(niy-ceny,2))<=maxr{
                  ix=nix:iy=niy
              }
              found=0
              repeat 3,-1:i=cnt
                  repeat 3,-1:j=cnt
                      pget ix+i,iy+j
                      if (ginfo(16)+ginfo(17)+ginfo(18)!=0){
                          found=1
                          break
                      }
                  loop
                  if found:break
              loop
              if found:break
              await
          loop
          ;表示
          color 255,255,255
          pset ix,iy
          ;結晶が成長するにつれて外周も大きくする
          nwr=sqrt(powf(ix-cenx,2)+powf(iy-ceny,2))+0.5
          if maxr<nwr{
              maxr=nwr
          }
          await
      loop
      title"終了"

      | HSP | 21:17 | comments(0) | - | - |
      高性能な点描写
      0

        小数部分も考慮した点の描写を行うプログラムです

        通常はウィンドウ上(クライアントエリア)に点を表示する時は、座標を整数で指定してその位置のみに色を付けます

        しかしこのプログラムでは、例えば「x=1.2, y=2,6」の位置に点を打ちたい場合、(1,2), (2,2), (1,3), (2,3)の周囲4点に色を付けることができます

        このプログラムでは点を円状に打っていますが、普通の点描写に比べて滑らかに表示されています

         


        #module
        #deffunc hpset double x,double y
            selid=ginfo(3)
            r=ginfo(16)
            g=ginfo(17)
            b=ginfo(18)
            ;未使用のバッファに点の色を設定
            if hpsetflg=0{
                newid=ginfo_newid
                buffer newid,1,1
                hpsetflg=1
            }
            gsel newid:color r,g,b:pset 0,0
            gsel selid
            ;描写対象の座標
            ltx=0+x
            rbx=ltx+1
            lty=0+y
            rby=lty+1
            ;濃度の割合
            ltcx=1.0-(x-ltx)
            ltcy=1.0-(y-lty)
            rbcx=x-ltx
            rbcy=y-lty
            ;左上の点
            cc=ltcx*ltcy
            gmode 3,,,256.0*cc
            pos ltx,lty
            gcopy newid,,,1,1
            ;右上の点
            cc=rbcx*ltcy
            gmode 3,,,256.0*cc
            pos rbx,lty
            gcopy newid,,,1,1
            ;左下の点
            cc=ltcx*rbcy
            gmode 3,,,256.0*cc
            pos ltx,rby
            gcopy newid,,,1,1
            ;右下の点
            cc=rbcx*rbcy
            gmode 3,,,256.0*cc
            pos rbx,rby
            gcopy newid,,,1,1

            return
        #global
        pos 110,100:mes"普通の点描写"
        r=100
        repeat 360
            x=cos(deg2rad(cnt))*r+160
            y=sin(deg2rad(cnt))*r+240
            pset x,y
        loop
        pos 430,100:mes"高性能点描写"
        r=100
        repeat 360
            x=cos(deg2rad(cnt))*r+480
            y=sin(deg2rad(cnt))*r+240
            hpset x,y
        loop

        | HSP | 14:48 | comments(0) | - | - |
        Peter de Jong Attractors
        0

          Peter de Jong Attractors」はカオスの一種です

          こちらのサイトを参考にしました

          a, b, c, dに適当な値を割り当てることで、様々な模様(図形)を描写します

           

           

          ;パラメータ
          a=1.641
          b=1.902
          c=0.316
          d=1.525
          ;代入した値が整数の場合、実数に変換
          a=0f+a
          b=0f+b
          c=0f+c
          d=0f+d
          title"a="+a+", b="+b+", c="+c+", d="+d
          x=0.0:y=0.0
          tx=0.0:ty=0.0
          repeat 100000
              x=tx:y=ty
              ;計算式
              tx=sin(a*y)-cos(b*x)
              ty=sin(c*x)-cos(d*y)
              pset tx*100+320,ty*100+240
              await
          loop

          | HSP | 09:38 | comments(0) | - | - |
          繋がった部品
          0

            パーツを作成し、それを繋げて相互に関連付けることで、一つのオブジェクトとして動かすプログラムです

            このプログラムでは一つのオブジェクトを動かすことしかできませんが、

            ソースを加工すれば色をつけたり画像を用いたり数を増やしたり、もっと複雑な動きをさせることができるかもしれません

             

             

            #module
            ;ボディデータ作成
            #deffunc allbodycreate array tbodydt
                dim bodydt,length(tbodydt)+1,length2(tbodydt),length3(tbodydt)
                return
            ;パーツセット
            #deffunc setparts int bodyid,int partsid,array tpartsdt
                bodydt(0,partsid,bodyid)=1
                repeat length(tpartsdt),1
                    bodydt(cnt,partsid,bodyid)=tpartsdt(cnt-1)
                loop
                return
            ;ボディ描写
            #deffunc drawbody int bodyid
                repeat length2(bodydt)
                    if bodydt(0,cnt,bodyid){
                        ltx=bodydt(1,cnt,bodyid)
                        lty=bodydt(2,cnt,bodyid)
                        rbx=bodydt(3,cnt,bodyid)
                        rby=bodydt(4,cnt,bodyid)
                        boxf ltx,lty,rbx,rby
                    }
                loop
                return
            ;ボディ移動
            #deffunc addbody int bodyid,int vx,int vy
                repeat length2(bodydt)
                    if bodydt(0,cnt,bodyid){
                        bodydt(1,cnt,bodyid)+vx
                        bodydt(2,cnt,bodyid)+vy
                        bodydt(3,cnt,bodyid)+vx
                        bodydt(4,cnt,bodyid)+vy
                    }
                loop
                return
            #global
            ;パーツのデータ
            dim h0,4
            h0=100,100,120,120
            dim h1,4
            h1=120,120,140,140
            dim h2,4
            h2=100,140,120,160
            ;ボディ作成
            dim bodydt,8,3,2
            allbodycreate bodydt
            setparts 0,0,h0
            setparts 0,1,h1
            setparts 0,2,h2

            repeat
                getkey k37,37
                getkey k38,38
                getkey k39,39
                getkey k40,40
                if k37{
                    addbody 0,-1,0
                }
                if k38{
                    addbody 0,0,-1
                }
                if k39{
                    addbody 0,1,0
                }
                if k40{
                    addbody 0,0,1
                }
                color 255,255,255:boxf:color
                drawbody 0
                redraw:await 17:redraw 0
            loop

            | HSP | 19:48 | comments(0) | - | - |
            円弧
            0

              円弧を描写するプログラムです

               


              #module
              ;中心座標X、中心座標Y、半径、始まりの角度、終わりの角度、描写方向
              #deffunc arc int cenx,int ceny,int r,double tstang,double tedang,int acw
                  ensyu=M_PI*r*2
                  move=360.0/ensyu
                  stang=tstang
                  pos cos(deg2rad(stang))*r+cenx,sin(deg2rad(stang))*r+ceny
                  edang=tedang
                  ;acwが1の時反時計回りに描写し、0の時時計回りに描写する
                  if acw{
                      vang=-move
                      repeat
                          if edang<stang:break
                          edang-360.0
                      loop
                  }else{
                      vang=move
                      repeat
                          if edang>stang:break
                          edang+360.0
                      loop
                  }
                  ;描写処理開始
                  nwang=stang
                  repeat
                      nwang+vang
                      if acw{
                          if edang>nwang{
                              line cos(deg2rad(edang))*r+cenx,sin(deg2rad(edang))*r+ceny
                              break
                          }
                      }else{
                          if edang<nwang{
                              line cos(deg2rad(edang))*r+cenx,sin(deg2rad(edang))*r+ceny
                              break
                          }
                      }
                      line cos(deg2rad(nwang))*r+cenx,sin(deg2rad(nwang))*r+ceny
                  loop
                  return
              #global
              ;サンプル
              arc 320,240,50,120,-30,1
              arc 320,240,100,60,210,1
              arc 320,240,150,150,-60,0

              | HSP | 19:44 | comments(0) | - | - |
              hgimg3を用いたceldivとcelput
              0

                hspではhgimg3やhgimg4を使うことで立体描写や高速描画を行うことができます

                しかし画像の小領域(マップチップなど)を描写する時は、標準命令とは若干処理が異なります

                そこでこのプログラムでは、画像をセル分割する「celdiv」と、セル画像を描写する「celput」をhgimg3で再現しました

                 


                #include "hgimg3.as"
                /* ここからモジュール */
                #module
                ;ウインドゥID。横の分割サイズ。縦の〃。横の中心座標。縦の〃、オブジェクトID、モデルID
                #deffunc hg3celdiv int selscr,int celw,int celh,int tcenx,int tceny,array objid,array mdlid
                    actscr=ginfo(3)
                    gsel selscr
                    gw=ginfo(12)
                    gh=ginfo(13)
                    row=gw/celw
                    col=gh/celh
                    repeat col:j=cnt
                        repeat row:i=cnt
                            if cnt>=length(mdlid):break
                            addspr mdlid(j*row+i),1,i*celw,j*celh,i*celw+celw-1,j*celh+celh-1
                        loop
                    loop
                    gsel actscr
                    repeat row*col
                        regobj objid(cnt),mdlid(cnt)
                        setpos objid(cnt),gw,gh
                    loop
                    settex gw,gh,0,-1
                    clhw=celw/2
                    clhh=celh/2
                    cenx=tcenx
                    ceny=tceny
                    return
                ;カレントポジションのX座標、〃のY座標、オブジェクトID
                #deffunc hg3pos_celput int x,int y,int id
                    setpos id,x-ginfo(12)/2+clhw-cenx,y-ginfo(13)/2+clhh-ceny
                    return
                #global
                /* ここまでモジュール */
                hgini        ;hgimgを使う場合は必ず最初に書く
                ;画像チップ作成
                chipsum=100
                x=0:y=0:w=32
                buffer 2,w*16,w*8    ;縦横のサイズは2の乗数にしないと表示がおかしくなる
                repeat chipsum
                    if cnt¥16=0&cnt!=0{
                        x=0:y+w
                    }
                    hsvcolor cnt*2,255,255
                    boxf x,y,x+w,y+w
                    x+w
                loop

                ;処理の都合上IDを格納するのは配列が望ましい
                dim objid,chipsum        ;オブジェクトID
                dim mdlid,chipsum        ;モデルID
                hg3celdiv 2,w,w,0,0,objid,mdlid        ;画像の分割

                screen 0,640,480,0
                color:boxf
                repeat chipsum
                    hg3pos_celput rnd(640-w),rnd(480-w),objid(cnt)    ;画像の位置指定と表示
                loop
                hgdraw
                hgsync 17

                | HSP | 18:10 | comments(0) | - | - |
                模様(剰余)
                0

                  剰余(割り算の余り)を元に導き出した模様パターンです

                  剰余の値を変えることで新しい模様を出すこともできます

                   


                  buffer 1
                  gsel 0
                  repeat 29:p=cnt        ;パターン
                      gsel 1
                      color 255,255,255:boxf:color
                      repeat 128:y=cnt
                          repeat 128:x=cnt
                              h0=(x*x+y*y)¥29
                              if h0=p{
                                  pset x,y
                              }
                          loop
                      loop
                      gsel 0            ;拡大して表示
                      title""+p
                      gzoom 512,512,1,0,0,128,128
                      wait 100
                  loop

                  | HSP | 22:00 | comments(0) | - | - |
                  模様(波線)
                  0

                    波の模様を作成するプログラムです

                     


                    repeat 256:y=cnt
                        repeat 256:x=cnt
                            y0=y+6.0*cos((12.0*(0f+x)/255)*M_PI)
                            flag=0
                            if y0<0{
                                flag=1
                            }
                            if (y0/20)¥2=flag{
                                color 255,0,0
                            }else{
                                color 255,255,255
                            }
                            pset x,y
                        loop
                    loop

                    | HSP | 11:04 | comments(0) | - | - |
                    模様(渦巻き)
                    0

                      うずまき模様を描写するプログラムです

                       


                      repeat 256,-128:y=cnt
                          repeat 256,-128:x=cnt
                              len=0+sqrt(x*x+y*y)
                              a=rad2deg(atan(y,x))
                              t=len+(41*a/360)
                              if (t/20)¥2=0&t>=0{
                                  color 255-len,0,len
                              }else{
                                  color 255,255,255
                              }
                              tx=x+128
                              ty=-y+127
                              pset tx,ty
                          loop
                      loop

                      | HSP | 23:05 | comments(0) | - | - |