RECOMMEND
SELECTED ENTRIES
CATEGORIES
ARCHIVES
MOBILE
qrcode
LINKS
PROFILE
OTHERS

08
--
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
31
--
>>
<<
--

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

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

    最初は真っ暗で何も見えないマップを移動することで、プレイヤーの周辺の地形が見えるようになるプログラムです

    マウスカーソルを移動させることで見える範囲が広がっていきます

     


    gw=640:gh=480
    mc=64:mr=48
    mw=gw/mc:mh=gh/mr
    dim mlight,mc,mr    ;光源データ
    repeat mr:j=cnt
        repeat mc:i=cnt
            mlight(i,j)=255
        loop
    loop

    buffer 2    ;フィルターバッファ
    buffer 1    ;背景バッファ
    repeat 100
        x=rnd(gw):y=rnd(gh):h=rnd(192)
        hsvcolor h,255,255
        boxf x,y,x+20,y+20
    loop

    px=0f+gw/2:py=0f+gh/2
    gosub *lightdraw
    gsel 0
    repeat
        mux=mousex:muy=mousey
        if abs(px)!=mux|abs(py)!=muy{
            rad=atan(muy-py,mux-px)
            px+=cos(rad)*0.5
            py+=sin(rad)*0.5
            gosub *lightdraw
        }
        gmode 0
        pos 0,0:gcopy 1,,,gw,gh
        gmode 6,,,255
        pos 0,0:gcopy 2,,,gw,gh
        redraw:await 17:redraw 0
    loop

    *lightdraw
        gsel 2
        repeat mr:j=cnt
            cy=j*mh
            ay=cy+mh/2
            repeat mc:i=cnt
                cx=i*mw
                ax=cx+mw/2
                den=powf(px-ax,2)+powf(py-ay,2)
                h=limit(den/4-256,0,255)
                if mlight(i,j)>h{
                    color h,h,h:boxf cx,cy,cx+mw,cy+mh
                    mlight(i,j)=h
                }
            loop
        loop
        gsel 0
        return

    | HSP | 21:43 | comments(0) | - | - |
    スピログラフ
    0

      スピログラフを描写するプログラムです

       

       

      #const wid 600    ;画面の横幅
      #const hei 600    ;画面の縦幅

      #include "gdi32.as"
      #const SRCINVERT $00660046

      screen 0,wid,hei,0
      buffer 1,wid,hei,0    ;裏画面

      gsel 0
      color 255,255,255: boxf
      hdc0=hdc
      gsel 1
      hdc1=hdc
      gsel 0

      fcenx=int(wid/2) : fceny=int(hei/2)
      d=0
      rad=deg2rad(d)
      rcw=100.0    ;定円の半径
      rch=100.0
      rm=44.0        ;動円の半径
      rd=110.0    ;描画点の半径
      sx=(rcw-rm)*cos(rad)+rd*cos((rcw-rm)/rm*rad)+fcenx
      sy=(rch-rm)*sin(rad)-rd*sin((rch-rm)/rm*rad)+fceny
      tx=sx:ty=sy
      randomize
      redraw 0
      repeat
          d++
          rad=deg2rad(d)
          gsel 1        ;裏画面に描画する
          color:boxf    ;裏画面を真っ黒にクリア
          color 255,255,255
          nx=(rcw-rm)*cos(rad)+rd*cos((rcw-rm)/rm*rad)+fcenx
          ny=(rch-rm)*sin(rad)-rd*sin((rch-rm)/rm*rad)+fceny
          x=fcenx,fcenx,0+tx,0+nx
          y=fceny,fceny,0+ty,0+ny
          gsquare -1,x,y
          gosub *xor_copy
          tx=nx:ty=ny
          if absf(sx-tx)+absf(sy-ty)<1{
              break
          }
          gsel 0
          redraw:await 1:redraw 0
      loop
      gsel 0
      redraw 1
      stop

      *xor_copy
          ;裏画面の内容をメイン画面にxorコピー
          BitBlt hdc0,0,0,wid,hei,hdc1,0,0,SRCINVERT
          return

      | HSP | 07:31 | comments(0) | - | - |
      トロコイド曲線
      0

        トロコイド (trochoid) とは、円をある曲線(円や直線はその特殊な場合)に沿って滑らないように転がしたとき、その円の内部または外部の点が描く曲線のことです。

        直線状を円が通ることで作られる線を「トロコイド」または「余擺線(よはいせん)」、

        動円が定円の内側を通ることで作られる線を「内トロコイド」、

        動円が定円の外側を通ることで作られる線を「外トロコイド」と呼びます

         

         

        d=0            ;角度
        rcw=100.0    ;定円の半径
        rch=100.0
        rm=60.0        ;動円の半径
        rd=100.0    ;描画点の半径
        fcenx=320    ;x軸の中心点
        fceny=240    ;y軸の中心点

        buffer 2:boxf:color 1
        gsel
        repeat
            gsel 2
            d++
            rad=deg2rad(d)
            ;内トロコイド
            x=(rcw-rm)*cos(rad)+rd*cos((rcw-rm)/rm*rad)+fcenx
            y=(rch-rm)*sin(rad)-rd*sin((rch-rm)/rm*rad)+fceny
            ;外トロコイド
            ;x=(rcw+rm)*cos(rad)-rd*cos((rcw+rm)/rm*rad)+fcenx
            ;y=(rch+rm)*sin(rad)-rd*sin((rch+rm)/rm*rad)+fceny
            if cnt=0{
                line x,y,x,y
            }else{
                line x,y
            }
            
            ;以下は描写処理
            gsel:pget 3200:boxf:color
            color 200,200,200
            circle fcenx-rcw,fceny-rch,fcenx+rcw,fceny+rch,0    ;定円
            
            color
            circle x-2,y-2,x+2,y+2            ;描写点
            
            gmode 2:gcopy 2,,,640,480
            redraw:await 1:redraw 0
        loop

        | HSP | 07:30 | comments(0) | - | - |
        テイラー展開
        0

          自然対数の底(ネイピア数)をテイラー展開を用いて求めるプログラムです。

           

           

          gerr=0.0    ;誤差(error)

          x=1.0        ;入力
          num=20.0    ;項数
          prc=0.0001    ;精度(precision)

          seq=1.0        ;一般項
          sum=seq        ;総和
          val=expf(x)    ;自然対数の底
          ;テイラー展開の計算
          repeat num,1:k=cnt
              seq*=x/k            ;漸化式
              sum+=seq            ;加算
              gerr=absf(sum-val)    ;誤差
              if gerr<prc{break}    ;誤差の判定
          loop
          mes""+sum    ;テイラー展開による値
          mes""+val    ;関数による値
          mes""+gerr    ;誤差

          | HSP | 13:43 | comments(0) | - | - |
          Pendulum Waves
          0

            糸の長さを少しずつ変えた振り子を複数同時に動かしたプログラムです

            振り子の周期により様々な波が作り出されることから「Pendulum Waves」と呼ばれます

             


            #module pendulum
                #deffunc pen_init double m_d,double m_angle,double m_x,double m_y,int m_n
                    n=m_n
                    ddim len,n
                    ddim fx,n
                    ddim fy,n
                    ddim angle,2,n
                    ddim ppos,2,n    ;球の位置

                    m=1000.0    ;重さ
                    g=9.81        ;重力
                    dt=0.001    ;時間
                    
                    i=0
                    repeat n,45
                        l=4000000.0*g/powf(2.0*M_PI*cnt,2)
                        len(i)=l
                        fx(i)=m_x
                        fy(i)=m_y
                        angle(0,i)=m_angle,m_angle
                        pen_setpos i
                        i++
                    loop
                    return
                #deffunc pen_setpos int m_i
                    ppos(0,m_i)=len(m_i)*sin(angle(0,m_i))+fx(m_i)
                    ppos(1,m_i)=len(m_i)*cos(angle(0,m_i))+fy(m_i)
                    return
                #deffunc pen_getpos array r_arr,int m_i
                    r_arr(0,m_i)=ppos(0,m_i),ppos(1,m_i)
                    return
                #deffunc pen_newAngle int m_i    ;振り子の角度
                    angle(1,m_i)+=dt*(-m*g/len(m_i)*sin(angle(0,m_i)))
                    angle(0,m_i)+=angle(1,m_i)*dt
                    return
            #global

            #module graphic
                #deffunc gra_init    ;初期化
                    gw=640        ;画面の横幅
                    gh=480        ;画面の縦幅
                    pnum=60        ;球の総数
                    spd=5
                    pen_init 400,-M_PI/4,gw/2,0,pnum
                    return
                #deffunc gra_update        ;描写
                    color 255,255,255:boxf 0,0,gw,gh:color
                    repeat pnum:i=cnt
                        repeat spd
                            pen_newAngle i
                        loop
                    loop
                    repeat pnum:i=cnt
                        pen_setpos i
                    loop
                    ddim p,2,pnum
                    repeat pnum:i=cnt
                        pen_getpos p,i
                        color 200,200,200:line gw/2,0,p(0,i),p(1,i)
                        hsvcolor cnt*3,255,255:circle p(0,i)-8,p(1,i)-8,p(0,i)+8,p(1,i)+8
                    loop
                    return
            #global

            gra_init
            repeat
                gra_update
                redraw:await 17:redraw 0
            loop

            | HSP | 11:48 | comments(0) | - | - |
            残像
            0

              残像を表現したプログラムです

              マウスを動かすことで尾を引くような残像を発生させます

               


              r=16
              color:boxf
              repeat
                  mux=mousex:muy=mousey
                  gmode 3,,,1        ;半透明合成コピー
                  color:grect 320,240,0,640,480    ;半透明合成塗りつぶし
                  color 255,255
                  circle mux-r,muy-r,mux+r,muy+r    ;物体描写
                  redraw:await 1:redraw 0
              loop

              | HSP | 11:32 | comments(0) | - | - |
              振り子
              0

                単振り子を描写するプログラムです。

                振り子とは、糸で垂らして左右に揺れ動く物体を指します。

                 


                #module pendulum
                    #deffunc pen_init double m_d,double m_alpha,double m_x,double m_y
                        fx=m_x
                        fy=m_y
                        len=m_d
                        ddim angle,2
                        angle=m_alpha,m_alpha
                        ddim ppos,2    ;球の位置
                        pen_setpos

                        m=1000.0    ;重さ
                        g=9.81        ;重力
                        dt=0.001    ;時間
                        return
                    #deffunc pen_setpos
                        ppos(0)=len*sin(angle(0))+fx
                        ppos(1)=len*cos(angle(0))+fy
                        return
                    #deffunc pen_getpos array r_arr
                        r_arr=ppos(0),ppos(1)
                        return
                    #deffunc pen_newAngle    ;振り子の角度
                        angle(1)+=dt*(-m*g/len*sin(angle(0)))
                        angle(0)+=angle(1)*dt
                        return
                #global

                #module graphic
                    #deffunc gra_init    ;初期化
                        gw=640
                        gh=480
                        pen_init 400,-M_PI/4,gw/2,0
                        return
                    #deffunc gra_update        ;描写
                        color 255,255,255:boxf 0,0,gw,gh:color
                        repeat 5
                            pen_newAngle
                        loop
                        pen_setpos
                        ddim p,2
                        pen_getpos p
                        line gw/2,0,p(0),p(1)
                        circle p(0)-8,p(1)-8,p(0)+8,p(1)+8
                        return
                #global

                gra_init
                repeat
                    gra_update
                    await 17
                loop

                | HSP | 10:39 | comments(0) | - | - |
                自動で近づき攻撃するオブジェクト
                0

                  対象に対して一定の距離まで近づき、そこから遠距離攻撃を行うオブジェクトを作成するプログラムです

                  マウスカーソルに近づいて、弾か矢みたいなものを飛ばしてます

                   

                   

                  ;ユニットデータ
                  ddim unitdt,5
                  unitdt(0)=1.0    ;生存フラグ
                  unitdt(1)=320.0    ;X座標
                  unitdt(2)=240.0    ;Y座標
                  unitdt(3)=0.5    ;移動スピード
                  unitdt(4)=0.0    ;方向
                  ;銃データ
                  dim gundt,5
                  gundt(0)=60        ;射程距離
                  gundt(1)=0        ;インターバル現在値
                  gundt(2)=50        ;インターバル最大値
                  ;弾丸データ
                  bulletmax=100
                  ddim bulletdt,7,bulletmax:bulletid=0
                  ;処理開始
                  repeat
                      color 255,255,255:boxf:color
                      mux=mousex:muy=mousey
                      den=sqrt(powf(mux-unitdt(1),2)+powf(muy-unitdt(2),2))
                      if den>gundt(0){    ;射程距離まで近づく
                          if gundt(1){
                              gundt(1)--
                          }
                          rad=atan(muy-unitdt(2),mux-unitdt(1))
                          unitdt(4)=rad
                          unitdt(1)=cos(unitdt(4))*unitdt(3)+unitdt(1)
                          unitdt(2)=sin(unitdt(4))*unitdt(3)+unitdt(2)
                      }else{        ;攻撃
                          if gundt(1){
                              gundt(1)--
                          }else{
                              repeat bulletmax,bulletid:id=cnt
                                  if id>=bulletmax{id=0}
                                  if bulletdt(0,id)<1.0{
                                      rad=atan(muy-unitdt(2),mux-unitdt(1))
                                      bulletdt(0,id)=1.0        ;生存フラグ
                                      bulletdt(1,id)=unitdt(1)    ;X座標
                                      bulletdt(2,id)=unitdt(2)    ;Y座標
                                      bulletdt(3,id)=rad        ;移動方向
                                      bulletdt(4,id)=1.0        ;移動スピード
                                      bulletdt(5,id)=150.0    ;持続時間
                                      bulletid=id+1
                                      break
                                  }
                              loop
                              gundt(1)=gundt(2)
                          }
                      }
                      ;弾丸の処理
                      repeat bulletmax
                          if bulletdt(0,cnt)>=1.0{
                              bulletdt(5,cnt)--
                              if bulletdt(5,cnt)<1.0{
                                  bulletdt(0,cnt)=0.0
                              }else{
                                  bulletdt(1,cnt)=cos(bulletdt(3,cnt))*bulletdt(4,cnt)+bulletdt(1,cnt)
                                  bulletdt(2,cnt)=sin(bulletdt(3,cnt))*bulletdt(4,cnt)+bulletdt(2,cnt)
                                  x=bulletdt(1,cnt):y=bulletdt(2,cnt)
                                  circle x-2,y-2,x+2,y+2
                              }
                          }
                      loop
                      x=unitdt(1):y=unitdt(2)
                      circle x-4,y-4,x+4,y+4
                      redraw:await 17:redraw 0
                  loop

                   

                  | HSP | 22:44 | comments(0) | - | - |
                  近づくと出現するオブジェクト
                  0

                    範囲内に入るとオブジェクトが作成されるプログラムです

                    黒い円の中にマウスカーソルを持ってくると、赤い円の範囲内にオブジェクトが現れ、近づいていきます

                     

                     

                    ;中心の範囲データ
                    dim origindt,5
                    origindt=320,240,30,120
                    ;オブジェクトデータ
                    objmax=100
                    ddim objdt,5,objmax
                    objtmax=50
                    objtnum=0
                    repeat
                        mux=mousex:muy=mousey
                        den1=sqrt(powf(origindt(0)-mux,2)+powf(origindt(1)-muy,2))
                        len=origindt(2)
                        if den1<=origindt(3){
                            ;一定の間隔で作成される
                            if objtnum{
                                objtnum--
                            }else{
                                repeat objmax
                                    if objdt(0,cnt)<1.0{
                                        objdt(0,cnt)=1.0
                                        objdt(1,cnt)=0f+rnd(len)-len/2+origindt(0)
                                        objdt(2,cnt)=0f+rnd(len)-len/2+origindt(1)
                                        break
                                    }
                                loop
                                objtnum=objtmax
                            }
                        }
                        ;描写
                        color 255,255,255:boxf
                        x=origindt(0):y=origindt(1):r1=origindt(2):r2=origindt(3)
                        color 255:circle x-r1,y-r1,x+r1,y+r1,0
                        color:circle x-r2,y-r2,x+r2,y+r2,0
                        repeat objmax
                            if objdt(0,cnt)>=1.0{
                                den2=sqrt(powf(objdt(1,cnt)-mux,2)+powf(objdt(2,cnt)-muy,2))
                                if den2<2{
                                    ;消滅
                                    objdt(0,cnt)=0.0
                                }else{
                                    ;移動
                                    rad=atan(muy-objdt(2,cnt),mux-objdt(1,cnt))
                                    objdt(1,cnt)+cos(rad)
                                    objdt(2,cnt)+sin(rad)
                                    dx=objdt(1,cnt):dy=objdt(2,cnt)
                                    circle dx-2,dy-2,dx+2,dy+2
                                }
                            }
                        loop
                        redraw:await 17:redraw 0
                    loop

                    | HSP | 11:18 | comments(0) | - | - |
                    ひまわりの種の配置
                    0

                      ひまわりの種の配置を表現する計算式を実装してみました

                       


                      num=800
                      cenx=320
                      ceny=240

                      deg=((1.0+sqrt(5))/2)*360-360
                      repeat num
                          x=cos(deg*M_PI/180*cnt)*7*sqrt(cnt)+cenX
                          y=sin(deg*M_PI/180*cnt)*7*sqrt(cnt)+cenY
                          csz=4.0+sqrt(powf(x-cenx,2)+powf(y-ceny,2))/100
                          circle x-csz,y-csz,x+csz,y+csz
                      loop

                      | HSP | 22:57 | comments(0) | - | - |