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

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





一日ゲームNo.16「打斬張」

一日ゲーム第十六弾

少し複雑なじゃんけんゲームです

 

打(赤)は斬(緑)に強く、斬(緑)は張(青)に強く、張(青)は打(赤)に強いです

「並び替え」・・・個体の並び替えを行います。先頭の五体のみ戦闘に参加させられます

「交配」・・・二つの個体を組み合わせます。ステータスは組み合わせた個体のステータスからランダムで決定します

「解雇」・・・個体を削除します。

 

ダウンロード

ソースコード

 

 

0
    posted by higashijugem 17:33comments(0)|-|





    一日ゲームNo.15「円迷路」

    一日ゲーム第十五弾

    一風変わった迷路ゲームです

     

    白い線がルートで、サークルの外側がゴールになります

    操作キーは十字キーのみです

     

    ダウンロード

    ソースコード

    ※10/31修正

     

    0
      posted by higashijugem 18:47comments(0)|-|





      一日ゲームNo.14「KnightJumper」

      久々の一日ゲーム、第十四弾です

       

      チェスのナイトのような動きをするキャラクターを操作し、ステージをクリアしていきます

      キャラクターが移動するごとにマスが減っていくので、身動きが取れなくなる前にゴール(青枠のマス)までたどり着く必要があります

      また、キャラクターがいるマスと移動先のマスが二段以上差がある場合は移動できません

      マップ上には攻略に役立つアイテム(紫のマス)があります、上手く活用して攻略を有利に進めてください

       

      操作方法

      マップ上をクリック・・・移動

      アイテム名をクリック・・・アイテムを使用

       

      gキーを押すことでゲームオーバー、その時点でのクリアステージ数が表示されます

      ※10/24 システムを調整しました

       

      ダウンロード

      ソースコード

       

       

      0
        posted by higashijugem 19:14comments(0)|-|





        壁の透過

        壁の向こう側にいるキャラクターがいる場合、キャラと壁が重なる部分を半透明で表示するプログラムです

         

         

        ;壁の透過
        #enum d_main=0
        #enum d_wallwd
        #enum d_maskchip
        #enum d_chip
        #enum d_bb0
        #enum d_bb1
        #enum d_maskwd
        #include "gdi32.as"
        #const SRCINVERT $00660046
        csz=64
        ;チップ画像
        buffer d_chip,csz*3,csz*2:celdiv d_chip,csz,csz
        color:boxf:x=0:y=0
        color 255:circle x,y,x+csz-1,y+csz-1:y+csz    ;キャラ
        color ,,255:boxf x,y,x+csz-1,y+csz-1:y+csz    ;壁
        ;チップの黒白画像を作成
        x1=csz:x2=csz*2
        ty=0
        repeat 2
            repeat csz:j=cnt
                repeat csz:i=cnt
                    pget i,ty+j
                    cl=ginfo(16)+ginfo(17)+ginfo(18)
                    if cl>0{
                        color 1
                        pset x1+i,ty+j
                        color 255,255,255
                        pset x2+i,ty+j
                    }
                loop
            loop
            ty+csz
        loop
        ;マップ作成
        mc=11:mr=8
        gw=mc*csz:gh=mr*csz
        dim mapdt,mc,mr
        repeat 24
            x=rnd(mc):y=rnd(mr)
            mapdt(x,y)=1
        loop
        buffer d_bb0,gw,gh    ;XOR用1
        hdc0=hdc
        buffer d_bb1,gw,gh    ;XOR用2
        hdc1=hdc
        buffer d_wallwd,gw*2,gh    ;壁表示用
        buffer d_maskwd,gw,gh    ;重複範囲用
        ;処理開始
        screen d_main,gw,gh
        repeat
            mux=mousex:muy=mousey
            gsel d_bb0:color 255,255,255:boxf
            gsel d_bb1:color 255,255,255:boxf
            gsel d_wallwd:color:boxf
            gsel d_maskwd:color 255,255,255:boxf
            ;障害物の画像とマスク画像を描写
            gsel d_wallwd
            gmode 2
            gsel d_bb1
            gmode 2
            repeat mr:j=cnt
                repeat mc:i=cnt
                    if mapdt(i,j){
                        gsel d_bb1
                        x=csz*i:y=csz*j
                        pos x,y:celput d_chip,1*3+1
                        gsel d_wallwd
                        pos x,y:celput d_chip,1*3
                        pos x+gw,y:celput d_chip,1*3+2
                    }
                loop
            loop
            ;XORコピーを用いて重なる範囲を取得する
            BitBlt hdc0,0,0,gw,gh,hdc1,0,0,$00660046
            gsel d_bb1
            pos mux,muy:celput d_chip,0*3+2
            BitBlt hdc0,0,0,gw,gh,hdc1,0,0,$00660046
            ;重複範囲を半透明にする
            gsel d_maskwd:color 128,128,128:boxf
            gmode 6,,,255:gcopy d_bb0,,,gw,gh
            ;壁表示用バッファに作成した重複範囲を重ねる
            gsel d_wallwd
            pos gw,0:gcopy d_maskwd,,,gw,gh
            ;メイン画像に表示
            gsel 0
            gmode 2
            color 255,255,255:boxf
            x=mux:y=muy
            pos x,y:celput d_chip,0*3
            gmode 7,,,125
            pos 0,0:gcopy d_wallwd,,,gw,gh
            redraw:await:redraw 0
        loop

        0
          posted by higashijugem 08:16comments(0)|-|





          重ならないように円を配置ver2

          円が重なり合わないように描写するプログラムその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

          0
            posted by higashijugem 12:46comments(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

            0
              posted by higashijugem 12:42comments(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"

              0
                posted by higashijugem 18:48comments(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

                0
                  posted by higashijugem 15:54comments(0)|-|





                  オブジェクトのドラッグver3

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

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

                   


                  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

                  0
                    posted by higashijugem 06:49comments(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

                    0
                      posted by higashijugem 07:38comments(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

                      0
                        posted by higashijugem 07:52comments(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

                        0
                          posted by higashijugem 21:43comments(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

                          0
                            posted by higashijugem 07:31comments(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

                            0
                              posted by higashijugem 07:30comments(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    ;誤差

                              0
                                posted by higashijugem 13:43comments(0)|-|





                                Pendulum Waves

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

                                振り子の周期により様々な波が作り出されることから「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

                                0
                                  posted by higashijugem 11:48comments(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

                                  0
                                    posted by higashijugem 11:32comments(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

                                    0
                                      posted by higashijugem 10:39comments(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

                                       

                                      0
                                        posted by higashijugem 22:44comments(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

                                        0
                                          posted by higashijugem 11:18comments(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

                                          0
                                            posted by higashijugem 22:57comments(0)|-|





                                            船の陣形

                                            360度移動するオブジェクトに取り巻きを追加したプログラムです。

                                            複数の味方による隊形を組むなど、RTSなどで使えるアルゴリズムです。

                                             


                                            ;画像作成
                                            csz=32
                                            buffer 2,csz*2,csz:celdiv 2,csz,csz,csz/2,csz/2
                                            zx=csz,csz,csz/4,csz/4
                                            zy=csz/2,csz/2,csz,0
                                            color:gsquare -1,zx,zy
                                            color ,,255:boxf 0,0,4,csz
                                            repeat 4:zx(cnt)+csz:loop
                                            color 255:gsquare -2,zx,zy
                                            color ,,255:boxf csz,0,csz+4,csz
                                            ;味方の隊列の相対的な位置
                                            ddim kankaku,2,4
                                            kankaku(0,0)=deg2rad(150),50.0
                                            kankaku(0,1)=deg2rad(150),100.0
                                            kankaku(0,2)=deg2rad(210),50.0
                                            kankaku(0,3)=deg2rad(210),100.0
                                            ddim kantai,4,4
                                            ;処理開始
                                            gsel
                                            urad=0.0
                                            spd=5
                                            cx=320.0:cy=240.0
                                            repeat 4
                                                moverad=kankaku(0,cnt)
                                                x=cos(urad)*kankaku(1,cnt)
                                                y=sin(urad)*kankaku(1,cnt)
                                                kantai(1,cnt)=(x*cos(moverad)-y*sin(moverad))+cx
                                                kantai(2,cnt)=(x*sin(moverad)+y*cos(moverad))+cy
                                            loop
                                            repeat:c1=cnt
                                                mux=mousex:muy=mousey
                                                getkey k1,1
                                                color 255,255,255:boxf
                                                if k1{
                                                    mdir=atan(muy-cy,mux-cx)
                                                    ;旋回
                                                    rad=mdir-deg2rad((urad*180.0/M_PI)¥360)
                                                    if rad>M_PI:rad-M_PI*2
                                                    if rad<-M_PI:rad+M_PI*2
                                                    if rad>0.1{
                                                        urad+0.1
                                                    }
                                                    if rad<-0.1{
                                                        urad-0.1
                                                    }
                                                    ;移動
                                                    urad=deg2rad((urad*180.0/M_PI)¥360)
                                                    h0=sqrt(powf(muy-cy,2)+powf(mux-cx,2))
                                                    if h0>spd&absf(rad)<=M_PI/3{
                                                        cx+=cos(urad)*spd
                                                        cy+=sin(urad)*spd
                                                    }
                                                }
                                                ;艦隊の位置と向きを揃えるように動く
                                                repeat 4
                                                    moverad=kankaku(0,cnt)
                                                    x=cos(urad)*kankaku(1,cnt)
                                                    y=sin(urad)*kankaku(1,cnt)
                                                    nx=(x*cos(moverad)-y*sin(moverad))+cx
                                                    ny=(x*sin(moverad)+y*cos(moverad))+cy

                                                    kx=kantai(1,cnt)
                                                    ky=kantai(2,cnt)
                                                    krad=kantai(3,cnt)
                                                    h0=sqrt(powf(ny-ky,2)+powf(nx-kx,2))
                                                    if h0>spd{
                                                        ;旋回
                                                        mdir=atan(ny-ky,nx-kx)
                                                        rad=mdir-krad
                                                        if rad>M_PI:rad-M_PI*2
                                                        if rad<-M_PI:rad+M_PI*2
                                                        if rad>0.1{
                                                            krad+0.1
                                                        }else:if rad<-0.1{
                                                            krad-0.1
                                                        }
                                                        ;移動
                                                        if absf(rad)<=M_PI/3{
                                                            kx=kx+cos(krad)*spd*1.2
                                                            ky=ky+sin(krad)*spd*1.2
                                                        }
                                                    }else{
                                                        ;旋回
                                                        rad=urad-krad
                                                        if rad>M_PI:rad-M_PI*2
                                                        if rad<-M_PI:rad+M_PI*2
                                                        if rad>0.1{
                                                            krad+0.1
                                                        }else:if rad<-0.1{
                                                            krad-0.1
                                                        }
                                                    }
                                                    kantai(1,cnt)=kx
                                                    kantai(2,cnt)=ky
                                                    kantai(3,cnt)=deg2rad((krad*180.0/M_PI)¥360)
                                                loop
                                                pos  cx,cy:celput 2,0,,,urad
                                                color 255
                                                repeat 4
                                                    pos kantai(1,cnt),kantai(2,cnt)
                                                    celput 2,1,,,kantai(3,cnt)
                                                loop
                                                redraw:await 17:redraw 0
                                            loop

                                            0
                                              posted by higashijugem 20:37comments(0)|-|





                                              船の移動

                                              プレイヤーの機体を360度全ての方向に移動させるプログラムです。

                                              リアリティを出すために曲がる時は円を描くように移動します。

                                               

                                               

                                              csz=32
                                              ;ユニット画像作成
                                              buffer 2,csz,csz:celdiv 2,csz,csz,csz/2,csz/2
                                              zx=csz,csz,csz/4,csz/4
                                              zy=csz/2,csz/2,csz,0
                                              color:gsquare -1,zx,zy
                                              ;処理開始
                                              gsel
                                              urad=0.0
                                              cx=320.0:cy=240.0
                                              spd=5
                                              repeat
                                                  mux=mousex:muy=mousey
                                                  getkey k1,1
                                                  color 255,255,255:boxf
                                                  if k1{
                                                      mdir=atan(muy-cy,mux-cx)
                                                      ;砲の方向とマウスカーソルの角度差
                                                      rad=mdir-deg2rad((urad*180.0/M_PI)¥360)
                                                      if rad>M_PI:rad-M_PI*2
                                                      if rad<-M_PI:rad+M_PI*2
                                                      ;旋回
                                                      if rad>=0.02{urad+0.1}
                                                      if rad<=-0.02{urad-0.1}
                                                      h0=sqrt(powf(muy-cy,2)+powf(mux-cx,2))
                                                      if h0>spd{
                                                          cx+=cos(urad)*spd
                                                          cy+=sin(urad)*spd
                                                      }
                                                  }
                                                  pos cx,cy:celput 2,0,,,urad
                                                  title""+cx+", "+cy        ;オブジェクトの現在位置
                                                  redraw:await 17:redraw 0
                                              loop

                                              0
                                                posted by higashijugem 20:26comments(0)|-|





                                                マウスによるマスの配置ver2

                                                マスで区切られた画面内をクリックしたかどうか確認するアルゴリズムです。

                                                マップ上にチップやオブジェクトを配置したり、ペイントソフトでドット単位で色を付けたりするプログラムなどに使えます。

                                                オブジェクトを選択できる機能を追加しました。

                                                 


                                                mc=20:mr=20:bufcsz=32:tmpcsz=16
                                                objnum=5
                                                ;オブジェクト画像作成
                                                buffer 2,bufcsz*objnum,bufcsz:celdiv 2,bufcsz,bufcsz
                                                x=0
                                                repeat objnum
                                                    hsvcolor cnt*20,255,255:boxf x,0,x+bufcsz,bufcsz:x+bufcsz
                                                loop
                                                ;初期設定
                                                dim objlrtb,4,objnum
                                                dim map,mc,mr
                                                x=400:y=50
                                                repeat objnum
                                                    objlrtb(0,cnt)=x,y,x+bufcsz,y+bufcsz
                                                    y+70
                                                loop
                                                repeat mr:j=cnt
                                                    repeat mc:i=cnt
                                                        map(i,j)=-1
                                                    loop
                                                loop
                                                sel=0
                                                ;処理開始
                                                gsel
                                                repeat
                                                    mux=mousex:muy=mousey
                                                    getkey k1,1
                                                    getkey k2,2
                                                    if k1{    ;左クリックで描写
                                                        x=mux/tmpcsz:y=muy/tmpcsz
                                                        if x>=0&x<mc&y>=0&y<mr{
                                                            map(x,y)=sel
                                                        }else{
                                                            repeat objnum
                                                                if mux>=objlrtb(0,cnt)&mux<objlrtb(2,cnt){
                                                                    if muy>=objlrtb(1,cnt)&muy<objlrtb(3,cnt){
                                                                        sel=cnt        ;オブジェクト選択
                                                                        break
                                                                    }
                                                                }
                                                            loop
                                                        }
                                                    }
                                                    if k2{    ;右クリックで削除
                                                        x=mux/tmpcsz:y=muy/tmpcsz
                                                        if x>=0&x<mc&y>=0&y<mr{
                                                            map(x,y)=-1
                                                        }
                                                    }
                                                    ;描写
                                                    color:boxf
                                                    color 255,255,255:boxf 0,0,mc*tmpcsz,mr*tmpcsz
                                                    color 255
                                                    repeat mr:j=cnt
                                                        repeat mc:i=cnt
                                                            if map(i,j)>=0{
                                                                pos i*tmpcsz,j*tmpcsz:celput 2, map(i,j), 0.5, 0.5
                                                            }
                                                        loop
                                                    loop
                                                    color 255,255,255
                                                    repeat objnum
                                                        if sel=cnt{
                                                            boxf objlrtb(0,cnt)-5,objlrtb(1,cnt)-5,objlrtb(2,cnt)+5,objlrtb(3,cnt)+5
                                                        }
                                                        pos objlrtb(0,cnt),objlrtb(1,cnt):celput 2,cnt
                                                    loop
                                                    redraw:await 17:redraw 0
                                                loop

                                                0
                                                  posted by higashijugem 20:10comments(0)|-|





                                                  マウスによるマスの配置

                                                  マスで区切られた画面内をクリックしたかどうか確認するアルゴリズムです。

                                                  マップ上にチップやオブジェクトを配置したり、ペイントソフトでドット単位で色を付けたりするプログラムなどに使えます。

                                                   


                                                  mc=16:mr=16:csz=16
                                                  dim map,mc,mr
                                                  repeat
                                                      mux=mousex:muy=mousey
                                                      getkey k1,1
                                                      getkey k2,2
                                                      if k1{    ;左クリックで描写
                                                          x=mux/csz:y=muy/csz
                                                          if x>=0&x<mc&y>=0&y<mr{
                                                              map(x,y)=1
                                                          }
                                                      }
                                                      if k2{    ;右クリックで削除
                                                          x=mux/csz:y=muy/csz
                                                          if x>=0&x<mc&y>=0&y<mr{
                                                              map(x,y)=0
                                                          }
                                                      }
                                                      ;描写
                                                      color:boxf
                                                      color 255,255,255:boxf 0,0,mc*csz,mr*csz
                                                      color 255
                                                      repeat mr:j=cnt
                                                          repeat mc:i=cnt
                                                              if map(i,j){
                                                                  boxf i*csz,j*csz,(i+1)*csz-1,(j+1)*csz-1
                                                              }
                                                          loop
                                                      loop
                                                      redraw:await 17:redraw 0
                                                  loop

                                                  0
                                                    posted by higashijugem 19:36comments(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

                                                    0
                                                      posted by higashijugem 22:04comments(0)|-|





                                                      DLA

                                                      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"終了"

                                                      0
                                                        posted by higashijugem 21:17comments(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

                                                        0
                                                          posted by higashijugem 14:48comments(0)|-|





                                                          Peter de Jong Attractors

                                                          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

                                                          0
                                                            posted by higashijugem 09:38comments(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

                                                            0
                                                              posted by higashijugem 19:48comments(0)|-|