RECOMMEND
SELECTED ENTRIES
CATEGORIES
ARCHIVES
MOBILE
qrcode
LINKS
PROFILE
OTHERS

10
--
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でプログラミングされています。
重ならないように円を配置ver2
0

    円が重なり合わないように描写するプログラムその2です

    円の配置チェックを二次元マップのマスで行います
    青色の場合はクリックすることで配置可能、赤色の場合はすでに置かれた円と重なっているので配置できません

     


    gw=640:gh=480
    mcsz=16
    cw=gw/mcsz:ch=gh/mcsz
    dim mapdt,cw,ch    ;マップデータ

    len=5
    repeat
        ok1=k1:getkey k1,1:tk1=k1^ok1&k1
        mcx=mousex/mcsz:mcy=mousey/mcsz
        mapsetflg=0
        if tk1{
            if overflg=0{    ;重なっていたら配置できないようにする
                mapsetflg=1
            }                ;if文をコメントアウトで配置可能
        }
        overflg=0
        repeat len*2+1,mcy-len:c1=cnt
            repeat len*2+1,mcx-len
                if 0<=cnt&cnt<cw&0<=c1&c1<ch{
                    dis=0+sqrt(powf(mcx-cnt,2)+powf(mcy-c1,2))
                    if dis<len{
                        if mapdt(cnt,c1){    ;配置された円と重なっている
                            overflg=1
                        }
                        if mapsetflg{    ;マップに配置
                            mapdt(cnt,c1)=1
                        }
                    }
                }
            loop
        loop
        color 255,255,255:boxf
        repeat ch:c1=cnt
            repeat cw
                x=cnt*mcsz:y=c1*mcsz
                if mapdt(cnt,c1){
                    color
                    boxf x,y,x+mcsz-1,y+mcsz-1
                }
                dis=0+sqrt(powf(mcx-cnt,2)+powf(mcy-c1,2))
                if dis<len{
                    if overflg{
                        color 255
                    }else{
                        color ,,255
                    }
                    boxf x,y,x+mcsz-1,y+mcsz-1
                }
            loop
        loop
        redraw:await 17:redraw 0
    loop

    | HSP | 12:46 | comments(0) | - | - |
    重ならないように円を配置
    0

      円が重なり合わないように描写するプログラムです

      青色の場合はクリックすることで配置可能、赤色の場合はすでに置かれた円と重なっているので配置できません

       


      crmax=10
      dim crdt,4,crmax    ;円データ
      len=50
      repeat
          mux=mousex:muy=mousey
          ok1=k1:getkey k1,1:tk1=k1^ok1&k1
          color 255,255,255:boxf
          mapsetflg=0
          if tk1{
              mapsetflg=1
          }
          overflg=0
          color
          repeat crmax    ;配置円の描写と、配置円との重なりがないかチェック
              if crdt(0,cnt){
                  tx=crdt(1,cnt):ty=crdt(2,cnt):tlen=crdt(3,cnt)
                  dis=sqrt(powf(mux-tx,2)+powf(muy-ty,2))
                  if dis<=tlen+len{
                      overflg=1
                  }
                  circle tx-tlen,ty-tlen,tx+tlen,ty+tlen
              }
          loop
          if overflg=0{    ;重なっていなければ
              if mapsetflg{    ;円を配置可能
                  repeat crmax
                      if crdt(0,cnt)=0{
                          crdt(0,cnt)=1,mux,muy,len
                          break
                      }
                  loop
              }
              mapsetflg=0
              color ,,255
          }else{
              color 255
          }
          circle mux-len,muy-len,mux+len,muy+len
          redraw:await 17:redraw 0
      loop

      | HSP | 12:42 | comments(0) | - | - |
      ジャパニーズアトラクタ
      0

        ジャパニーズアトラクタ(Japanese attractor)はローレンツアトラクタと同時期に作られたカオスです

        Bの値を変えることで形を変えられます

         


        k=0.1    ;定数
        B=12.0    ;定数
        x=0.0    ;X座標
        y=0.0    ;Y座標
        n=10000    ;繰り返し回数
        bn=800    ;微分の項数
        dt=2.0*M_PI/bn
        t=0.0    ;時間
        kw=100    ;横倍率
        kh=15    ;縦倍率
        boxf:color 255,255,255
        repeat n
            repeat bn
                t=t+dt
                xx=x+dt*y;
                yy=y+dt*(-k*y-powf(x,3)+B*cos(t));
                x=xx;
                y=yy;
            loop
            pset x*kw,y*kh+240
            await
        loop
        title"stop"

        | HSP | 18:48 | comments(0) | - | - |
        ローレンツアトラクタ
        0

          ローレンツアトラクタを描写するプログラムです

          三次元上に描写して、立体的に見えるようにしました

           

           

          #include "d3m.hsp"
          #define global sgm 10.0
          #define global r 28.0
          #define global b 8.0/3.0
          ;ローレンツ方程式の関数
          #module
          #defcfunc m_f double x,double y
              return sgm*(-x + y)
          #defcfunc m_g double x,double y,double z
              return r*x - y - x*z
          #defcfunc m_h double x,double y,double z
              return -b*z + x*y
          #global
          ddim ps,3    ;現在位置
          ddim nps,3    ;描写位置
          ddim k,3,4
          ddim calc,3
          dt=0.01    ;時間
          n=5000    ;繰り返し回数
          kd=20    ;拡大率
          repeat
              ct++
              redraw 0
              color:boxf:color 255,255,255
              ;カメラを回転させる
              d3setcam cos(0.04*ct)*1500,sin(0.04*ct)*1500,cos(0.03*ct)*1000,,,500
              ps=1.0,1.0,1.0
              d3initlineto
              repeat n:i=cnt
                  ;4次ルンゲクッタ法
                  k(0,0)=dt*m_f(ps(0),ps(1))
                  k(1,0)=dt*m_g(ps(0),ps(1),ps(2))
                  k(2,0)=dt*m_h(ps(0),ps(1),ps(2))
              
                  k(0,1)=dt*m_f(ps(0)+k(0,0)/2,ps(1)+k(1,0)/2)
                  k(1,1)=dt*m_g(ps(0)+k(0,0)/2,ps(1)+k(1,0)/2,ps(2)+k(2,0)/2)
                  k(2,1)=dt*m_h(ps(0)+k(0,0)/2,ps(1)+k(1,0)/2,ps(2)+k(2,0)/2)
                  
                  k(0,2)=dt*m_f(ps(0)+k(0,1)/2,ps(1)+k(1,1)/2)
                  k(1,2)=dt*m_g(ps(0)+k(0,1)/2,ps(1)+k(1,1)/2,ps(2)+k(2,1)/2)
                  k(2,2)=dt*m_h(ps(0)+k(0,1)/2,ps(1)+k(1,1)/2,ps(2)+k(2,1)/2)
                  
                  k(0,3)=dt*m_f(ps(0)+k(0,2),ps(1)+k(1,2))
                  k(1,3)=dt*m_g(ps(0)+k(0,2),ps(1)+k(1,2),ps(2)+k(2,2))
                  k(2,3)=dt*m_h(ps(0)+k(0,2),ps(1)+k(1,2),ps(2)+k(2,2))
                  repeat 3
                      nps(cnt)=ps(cnt)+(k(cnt,0)+k(cnt,1)*2.0+k(cnt,2)*2.0+k(cnt,3))/6.0
                      ps(cnt)=nps(cnt)
                  loop
                  ;描写
                  d3lineto nps(0)*kd,nps(1)*kd,nps(2)*kd
              loop
              redraw
              await
          loop

          | HSP | 15:54 | comments(0) | - | - |
          オブジェクトのドラッグver3
          0

            オブジェクトをドラッグ&ドロップするプログラムです

            複数の図形をそれぞれ移動させたり大きさを変えたりできます

             


            randomize
            objmax=5
            dim objdt,5,objmax
            repeat objmax
                objdt(0,cnt)=cnt
                x=rnd(390):y=rnd(260)
                objdt(0,cnt)=x,y
                objdt(2,cnt)=x+rnd(100)+50,y+rnd(80)+40
            loop
            repeat
                mux=mousex:muy=mousey
                ok1=k1
                getkey k1,1
                tk1=k1^ok1&k1
                if tk1{
                    ;図形の辺や角をクリックする
                    id=-1:type=0
                    repeat objmax
                        ltx=objdt(0,cnt)
                        lty=objdt(1,cnt)
                        rbx=objdt(2,cnt)
                        rby=objdt(3,cnt)
                        if ltx-8<=mux&mux<=rbx+8&lty-8<=muy&muy<rby+8{
                            id=cnt
                            if abs(mux-ltx)<8{
                                type|%0001
                            }
                            if abs(muy-lty)<8{
                                type|%0010
                            }
                            if abs(mux-rbx)<8{
                                type|%0100
                            }
                            if abs(muy-rby)<8{
                                type|%1000
                            }
                            if type=0{
                                type|%1111
                            }
                            sltx=mux-objdt(0,cnt)
                            slty=muy-objdt(1,cnt)
                            srbx=mux-objdt(2,cnt)
                            srby=muy-objdt(3,cnt)
                            break
                        }
                        if id>=0:break
                    loop
                }
                if k1{
                    if id>=0{
                        ;伸ばしたり縮めたりする
                        if type&%0001{
                            objdt(0,id)=mux-sltx
                        }
                        if type&%0010{
                            objdt(1,id)=muy-slty
                        }
                        if type&%0100{
                            objdt(2,id)=mux-srbx
                        }
                        if type&%1000{
                            objdt(3,id)=muy-srby
                        }
                    }
                }
                ;描写
                color 255,255,255:boxf:color
                repeat objmax
                    ltx=objdt(0,cnt)
                    lty=objdt(1,cnt)
                    rbx=objdt(2,cnt)
                    rby=objdt(3,cnt)
                    boxf ltx,lty,rbx,rby
                loop
                redraw:await 17:redraw 0
            loop

            | HSP | 06:49 | comments(0) | - | - |
            マウスによるオブジェクトのサイズ変更
            0

              ダイアログボックスのように、辺や角をドラッグすることで大きさを変えるプログラムです

              画面内の図形のサイズをマウスで変更することができます

               


              randomize
              ;オブジェクトデータ
              dim objdt,4
              x=rnd(490):y=rnd(360)
              objdt(0)=x,y
              objdt(2)=x+rnd(100)+50,y+rnd(80)+40

              repeat
                  mux=mousex:muy=mousey
                  ok1=k1
                  getkey k1,1
                  tk1=k1^ok1&k1
                  if tk1{
                      ;図形の辺や角をクリックする
                      type=0
                      ltx=objdt(0)
                      lty=objdt(1)
                      rbx=objdt(2)
                      rby=objdt(3)
                      if abs(mux-ltx)<8{
                          type|%0001
                      }
                      if abs(muy-lty)<8{
                          type|%0010
                      }
                      if abs(mux-rbx)<8{
                          type|%0100
                      }
                      if abs(muy-rby)<8{
                          type|%1000
                      }
                      sltx=mux-objdt(0)
                      slty=muy-objdt(1)
                      srbx=mux-objdt(2)
                      srby=muy-objdt(3)
                  }
                  if k1{
                      if type>0{
                          ;伸ばしたり縮めたりする
                          if type&%0001{
                              objdt(0)=mux-sltx
                          }
                          if type&%0010{
                              objdt(1)=muy-slty
                          }
                          if type&%0100{
                              objdt(2)=mux-srbx
                          }
                          if type&%1000{
                              objdt(3)=muy-srby
                          }
                      }
                  }
                  ;描写
                  color 255,255,255:boxf:color
                  ltx=objdt(0)
                  lty=objdt(1)
                  rbx=objdt(2)
                  rby=objdt(3)
                  boxf ltx,lty,rbx,rby
                  redraw:await 17:redraw 0
              loop

              | HSP | 07:38 | comments(0) | - | - |
              ダメージアニメーション
              0

                RPGでよくある、キャラクターに攻撃を当てたり回復したりすると数字が出てくるアニメを作成しました

                画面上の物体をクリックすることでアニメが実行されます

                 

                 

                ;オブジェクト生成
                csz=20
                buffer 2,csz,csz:celdiv 2,csz,csz,csz/2,csz/2
                color ,255,255:boxf
                dim emyxy,2,3
                x=220:y=280
                repeat 3
                    emyxy(0,cnt)=x,y
                    x+100
                loop
                ;背景バッファ
                buffer 1
                boxf
                repeat 3
                    pos emyxy(0,cnt),emyxy(1,cnt)
                    celput 2,0
                loop
                ;ダメージアニメーション
                dim dmganidt,6,50
                repeat 50
                    dmganidt(4,cnt)=50
                loop
                ;処理開始
                gsel 0
                repeat
                    mux=mousex:muy=mousey
                    ok1=k1
                    getkey k1,1
                    tk1=k1^ok1&k1
                    if tk1{
                        pshnum=-1
                        repeat 3
                            ltx=emyxy(0,cnt)-csz/2
                            lty=emyxy(1,cnt)-csz/2
                            rbx=emyxy(0,cnt)+csz/2
                            rby=emyxy(1,cnt)+csz/2
                            ;オブジェクトをクリックしたかどうか判定
                            if ltx<=mux&mux<rbx&lty<=muy&muy<rby{
                                pshnum=cnt
                                break
                            }
                        loop
                        ;クリックしたらダメージアニメーションを作成
                        if pshnum>=0{
                            repeat 50
                                if dmganidt(0,cnt)=0{
                                    dmganidt(0,cnt)=1
                                    dmganidt(1,cnt)=emyxy(0,pshnum)
                                    dmganidt(2,cnt)=emyxy(1,pshnum)-10
                                    dmganidt(3,cnt)=0
                                    dmganidt(5,cnt)=rnd(100)
                                    break
                                }
                            loop
                        }
                    }
                    ;描写処理
                    gmode 0:pos 0,0:gcopy 1,,,640,480
                    color 255
                    repeat 50
                        if dmganidt(0,cnt){
                            x=dmganidt(1,cnt)
                            y=dmganidt(2,cnt)-dmganidt(3,cnt)
                            pos x,y:mes""+dmganidt(5,cnt)
                            dmganidt(3,cnt)++
                            if dmganidt(3,cnt)>dmganidt(4,cnt){
                                dmganidt(0,cnt)=0
                            }
                        }
                    loop
                    redraw:await 17:redraw 0
                loop

                | HSP | 07:52 | comments(0) | - | - |
                視界フィルター
                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) | - | - |