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

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





角が丸い四角(線)

線をひいて、角を丸めた四角形を描写するプログラムです

 


mcenx=210.0        ;中心X
mceny=150.0        ;中心Y
mxlen=94.0        ;縦幅/2
mylen=124.0        ;横幅/2
magari=32.0        ;カーブの丸み具合
fix=0.00001
dx=-1,-1,1,1
dy=1,-1,-1,1

ldir=90:l2dir=ldir+90
repeat 4
    sxlen=mxlen-magari
    sylen=mylen-magari
    clen=sqrt(powf(sxlen,2)+powf(sylen,2))
    cdir=atan(sylen*dy(cnt),sxlen*dx(cnt))
    ccrad=cos(cdir)
    csrad=sin(cdir)
    ccenx=ccrad*clen+mcenx
    cceny=csrad*clen+mceny
    lx=cos(deg2rad(ldir))*mxlen+mcenx
    ly=sin(deg2rad(ldir))*mylen+mceny
    
    l2crad=cos(deg2rad(l2dir))
    l2srad=sin(deg2rad(l2dir))
    line l2crad*sxlen-l2crad*magari+lx+fix,l2srad*sylen-l2srad*magari+ly+fix,lx+fix,ly+fix
    ddir=ldir+90
    repeat
        ldir+5
        rad=deg2rad(ldir)
        line cos(rad)*magari+ccenx,sin(rad)*magari+cceny
        if ldir>=ddir{
            ldir=ddir
            break
        }
    loop
    line cos(deg2rad(ldir))*mxlen+mcenx+fix,sin(deg2rad(ldir))*mylen+mceny+fix
    l2dir+90
loop

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





    通路生成(一本道)

    穴掘り法で一本道の通路を作成するプログラムです

     


    randomize
    mc=11:mr=11
    csz=24
    gsel 0
    dim mapdt,mc,mr
    dim dx,4:dx=-1,0,1,0
    dim dy,4:dy=0,-1,0,1
    repeat 4
        r0=rnd(4):r1=rnd(4)
        if r0!=r1{
            tmp=dx(r0):dx(r0)=dx(r1):dx(r1)=tmp
            tmp=dy(r0):dy(r0)=dy(r1):dy(r1)=tmp
        }
    loop
    stx=1:sty=1:max=(mc/2)*(mr/2)
    edx=mc-2:edy=mr-2
    mapdt(stx,sty-1)=1
    mapdt(edx,edy+1)=1
    dim stack,4,max
    id=0
    i=stx:j=sty
    ;穴掘り法
    mapdt(i,j)=1
    repeat
        if stack(3,id)=0{
            r=rnd(4)
            stack(2,id)=r
        }else{
            if stack(3,id)>=4{
                stack(3,id)=0
                id--
                if id<=0:break
                ttdir=stack(2,id)
                mapdt(stack(0,id)+dx(ttdir),stack(1,id)+dy(ttdir))=0
                mapdt(stack(0,id)+dx(ttdir)*2,stack(1,id)+dy(ttdir)*2)=0
                i=stack(0,id):j=stack(1,id)
            }
            stack(2,id)++:if stack(2,id)>=4{stack(2,id)=0}
            r=stack(2,id)
        }
        ti=i+dx(r)*2
        tj=j+dy(r)*2
        stack(3,id)++
        if 0<=ti&ti<mc&0<=tj&tj<mr{
            if mapdt(ti,tj)=0{
                stack(0,id)=i,j,r
                mapdt(i+dx(r),j+dy(r))=1
                mapdt(ti,tj)=1
                i=ti:j=tj:id++
                if i=edx&j=edy{
                    break
                }
            }
        }
        await
    loop
    ;描写
    pget 3200:boxf:color
    repeat mr:cj=cnt
        repeat mc:ci=cnt
            pos ci*csz,cj*csz
            if mapdt(ci,cj)=0{
                mes"■"
            }
        loop
    loop

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





      穴掘り法

      「穴掘り法」というアルゴリズムを用いて迷路を作成するプログラムです

       


      randomize
      mc=17:mr=17
      csz=24
      dim mapdt,mc,mr
      dim dx,4:dx=-1,0,1,0
      dim dy,4:dy=0,-1,0,1
      stx=1:sty=1:max=(mc/2)*(mr/2)
      dim stack,4,max
      id=0
      i=stx:j=sty
      ;穴掘り法
      mapdt(i,j)=1
      repeat
          if stack(3,id)=0{
              r=rnd(4)
          }else{
              if stack(3,id)>4{
                  stack(3,id)=0
                  id--
                  if id<=0:break
                  i=stack(0,id):j=stack(1,id)
              }
              stack(2,id)++:if stack(2,id)>=4{stack(2,id)=0}
              r=stack(2,id)
          }
          ti=i+dx(r)*2
          tj=j+dy(r)*2
          flg=0
          stack(3,id)++
          if 0<=ti&ti<mc&0<=tj&tj<mr{
              if mapdt(ti,tj)=0{
                  stack(0,id)=i,j,r
                  mapdt(i+dx(r),j+dy(r))=1
                  mapdt(ti,tj)=1
                  i=ti:j=tj:id++
              }
          }
          await 1
      loop
      ;描写
      pget 3200:boxf:color
      repeat mr:j=cnt
          repeat mc:i=cnt
              pos i*csz,j*csz
              if mapdt(i,j)=0{
                  mes"■"
              }
          loop
      loop

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





        波データ

        研究所の機器とかで見る波形データみたいなものを表示するプログラムです

        マウスの左右クリックやマウスホイールで、波の形を変えることができます



        buffer 2
        gsel 0
        ceny=240.0
        rad=deg2rad(0)
        sp=1
        hi=100
        tx=50.0
        ty=sin(rad)*100+ceny
        repeat
        title""+hi+", "+sp
            muw=mousew
            getkey k1,1
            getkey k2,2
            if muw<0{sp--}
            else:if muw>0{sp++}
            if k1{
                hi+=1
            }
            if k2{
                hi-=1
            }
            gsel 2
            pos 0,0:gcopy 0,,,640,480
            rad=deg2rad(cnt*sp)
            x=50.0
            y=sin(rad)*hi+ceny
            line x,y,tx+1,ty
            tx=x:ty=y
            gsel 0
            pos 1,0:gcopy 2,0,,640,480
            redraw:await 17:redraw 0
        loop

        0
          posted by higashijugem 06:09comments(0)|-|





          左右対称の線

          画面の真ん中を軸に、複数の線を鏡のように左右対称に描写するプログラムです

          白い線の角をドラッグすることで線を動かせます

           


          ;片側の線データ
          dim lndt,4,2
          cenx=320
          lndt(0,0)=200,240,cenx,80
          lndt(0,1)=cenx,400,200,240
          repeat
              color:boxf:color 255,255,255
              mux=mousex:muy=mousey
              ok1=k1:getkey k1,1:tk1=k1^ok1&k1:rk1=k1^ok1&ok1
              if tk1{    ;角をクリックで線を動かせる
                  pushct=-1
                  repeat 2
                      dis=sqrt(powf(lndt(2,cnt)-mux,2)+powf(lndt(3,cnt)-muy,2))
                      if dis<=10{
                          pushct=cnt
                          break
                      }
                  loop
                  if pushct<0{
                      dis=sqrt(powf(lndt(0,length2(lndt)-1)-mux,2)+powf(lndt(1,length2(lndt)-1)-muy,2))
                      if dis<=10{
                          pushct=length2(lndt)
                      }
                  }
              }
              if k1{
                  if 0=pushct{
                      lndt(3,pushct)=muy
                  }else:if pushct=length2(lndt){
                      lndt(1,pushct-1)=muy
                  }else:if 0<pushct&pushct<length2(lndt){
                      lndt(0,pushct-1)=mux:lndt(1,pushct-1)=muy
                      lndt(2,pushct)=mux:lndt(3,pushct)=muy
                  }
              }
              if rk1{
                  pushct=-1
              }
              ;左右対称に描写
              repeat length2(lndt)
                  ex=lndt(0,cnt):ey=lndt(1,cnt)
                  sx=lndt(2,cnt):sy=lndt(3,cnt)
                  color 255,255,255
                  line ex,ey,sx,sy
                  ex=(cenx-lndt(0,cnt))+cenx:ey=lndt(1,cnt)
                  sx=(cenx-lndt(2,cnt))+cenx:sy=lndt(3,cnt)
                  color 255
                  line ex,ey,sx,sy
              loop
              redraw:await 17:redraw 0
          loop

          0
            posted by higashijugem 21:58comments(0)|-|





            徐々に線引き

            時間経過とともに線が引かれるようにするプログラムです

            vnumの値を変えることで描写速度を変更できます

             

             

            randomize
            ddim lndt,4,20
            deg=0:sum=0
            repeat
                x=cos(deg2rad(deg))*(rnd(151)+50)+320
                y=sin(deg2rad(deg))*(rnd(151)+50)+240
                deg+=rnd(20)+20
                sum++
                if deg>=360{
                    lndt(0,cnt)=x,y
                    lndt(2,0)=x,y
                    break
                }else{
                    lndt(0,cnt)=x,y
                    lndt(2,cnt+1)=x,y
                }
            loop
            ;描写
            vnum=30
            repeat sum
                ex=0f+lndt(0,cnt):ey=0f+lndt(1,cnt)
                sx=0f+lndt(2,cnt):sy=0f+lndt(3,cnt)
                vx=(ex-sx)/vnum
                vy=(ey-sy)/vnum
                pos sx,sy
                repeat vnum,1
                    line sx+vx*cnt,sy+vy*cnt
                    redraw:await 17:redraw 0
                loop
            loop

            0
              posted by higashijugem 21:31comments(0)|-|





              多角形の内部の反射処理

              図形の内部にバウンドするボール(オブジェクト)を置き、それらを跳ね回らせるプログラムです

              マウスホイールを動かすことでボールが動く速度を変えることができます

               


              randomize
              ddim bldt,4        ;ボールデータ
              bldt(0)=320.0,240.0,30.0,deg2rad(rnd(360))
              ddim wldt,5,4    ;壁データ
              wldt(0,0)=500,100,100,50
              wldt(0,1)=600,300,500,100
              wldt(0,2)=300,400,600,300
              wldt(0,3)=50,250,300,400
              wldt(0,4)=100,50,50,250
              repeat
                  color:boxf:color 255,255,255
                  tmuw=mousew
                  if tmuw<0{    ;速度変更
                      bldt(2)=limitf(bldt(2)-5,0,100)
                  }else:if tmuw>0{
                      bldt(2)=limitf(bldt(2)+5,0,100)
                  }
                  repeat length2(wldt)
                      line wldt(0,cnt),wldt(1,cnt),wldt(2,cnt),wldt(3,cnt)
                  loop
                  tspd=bldt(2)
                  pos bldt(0),bldt(1)
                  hh0=bldt(0):hh1=bldt(1):hh2=bldt(2):hh3=bldt(3)
                  repeat
                      ;線分交差判定
                      tblx=bldt(0)+(cos(bldt(3))*tspd)
                      tbly=bldt(1)+(sin(bldt(3))*tspd)
                      csflg=0:wlflg=0
                      repeat length2(wldt)+1:wlct=cnt:if wlct>=length2(wldt){wlct=0}
                          x1=0f+wldt(0,wlct):y1=0f+wldt(1,wlct):x2=0f+wldt(2,wlct):y2=0f+wldt(3,wlct)
                          x3=bldt(0):y3=bldt(1):x4=tblx:y4=tbly
                          d=(x2-x1)*(y4-y3)-(y2-y1)*(x4-x3)
                          if d<-0.00001|0.00001<d{
                              u=((x3-x1)*(y4-y3)-(y3-y1)*(x4-x3))/d
                              v=((x3-x1)*(y2-y1)-(y3-y1)*(x2-x1))/d
                              if (u>=0.0&u<=1.0)&(v>=0.0&v<=1.0){
                                  ;壁とボールの軌道の交点
                                  crsx=0f+x1+u*(x2-x1)
                                  crsy=0f+y1+u*(y2-y1)
                                  ;反射ベクトル計算
                                  wldir=atan(y1-y2,x1-x2)
                                  cnflg=0:twlct=wlct
                                  wlcos=cos(wldir):wlsin=sin(wldir)
                                  blcos=-cos(bldt(3)):blsin=-sin(bldt(3))
                                  l=(wlcos*wlcos+wlsin*wlsin)*2.0
                                  if l<-0.00001|0.00001<l{
                                      t=-(wlcos*blcos+wlsin*blsin)/(wlcos*wlcos+wlsin*wlsin)*2.0
                                  }else{
                                      t=-(wlcos*blcos+wlsin*blsin)
                                  }
                                  ;反射後の移動ベクトル
                                  x=blcos+t*wlcos:y=blsin+t*wlsin
                                  bldt(3)=atan(y,x)
                                  exspd=sqrt(powf(tblx-crsx,2)+powf(tbly-crsy,2))
                                  if exspd<1{exspd=1.0}
                                  tblx=crsx+cos(bldt(3))*exspd
                                  tbly=crsy+sin(bldt(3))*exspd
                                  csflg=1
                              }
                          }
                      loop
                      if csflg{
                          bldt(0)=crsx+cos(bldt(3))
                          bldt(1)=crsy+sin(bldt(3))
                          line bldt(0),bldt(1)
                          tspd=exspd
                      }else{
                          bldt(0)=tblx
                          bldt(1)=tbly
                          break
                      }
                      await
                  loop
                  ;描写
                  tx=bldt(0):ty=bldt(1)
                  line bldt(0),bldt(1)
                  circle tx-10,ty-10,tx+10,ty+10
                  redraw:await 17:redraw 0
              loop

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





                2直線と平行のベクトル

                二つの線分に対して平行の線を求めるプログラムです

                マウスドラッグで線を動かすことで、常に平行線が再描写されてます

                 


                ;線データ
                ddim lndt,4,2
                lndt(0,0)=100.0,100.0,320.0,240.0
                lndt(0,1)=320.0,240.0,320.0,460.0
                x1=0:y1=0:x2=0:y2=0
                repeat
                    color:boxf
                    mux=mousex:muy=mousey
                    getkey k1,1
                    getkey k2,2
                    if k1{    ;左ドラッグで線を動かす
                        lndt(0,0)=0f+mux:lndt(1,0)=0f+muy
                    }
                    if k2{    ;右ドラッグで線を動かす
                        lndt(2,1)=0f+mux:lndt(3,1)=0f+muy
                    }
                    repeat 2
                        color 255,((cnt+1)/2)*255,((cnt+1)¥2)*255
                        line lndt(0,cnt),lndt(1,cnt),lndt(2,cnt),lndt(3,cnt)
                    loop
                    color 255,255,255
                    circle lndt(0,0)-20,lndt(1,0)-20,lndt(0,0)+20,lndt(1,0)+20,0
                    circle lndt(2,1)-20,lndt(3,1)-20,lndt(2,1)+20,lndt(3,1)+20,0
                    x1=lndt(0,0):y1=lndt(1,0)
                    x2=lndt(2,0):y2=lndt(3,0)
                    wldir1=atan(y2-y1,x2-x1)        ;線1のベクトル
                    x1=lndt(0,1):y1=lndt(1,1)
                    x2=lndt(2,1):y2=lndt(3,1)
                    wldir2=atan(y2-y1,x2-x1)        ;線2のベクトル
                    wldir3=(wldir1+wldir2)/2        ;線1と線2の平行ベクトル
                    ;平行ベクトルの描写
                    color ,255
                    line -cos(wldir3)*100+320,-sin(wldir3)*100+240,cos(wldir3)*100+320,sin(wldir3)*100+240
                    redraw:await 17:redraw 0
                loop

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





                  折れ線の生成

                  接続された線分を作成するプログラムです

                  線分上を左クリックすることで角が生成されていき、右クリックで角が消去されます

                   

                   

                  dim ldt,5,1000
                  ldt(0,0)=1,100,50
                  ldt(0,1)=1,500,400
                  repeat
                      ok1=k1:getkey k1,1:tk1=k1^ok1&k1:rk1=k1^ok1&ok1
                      ok2=k2:getkey k2,2:tk2=k2^ok2&k2
                      mux=mousex:muy=mousey
                      color 255,255,255:boxf:color
                      ;線分描写
                      repeat
                          if ldt(0,cnt)=0:break
                          sx=ldt(1,cnt)
                          sy=ldt(2,cnt)
                          dlen=sqrt(powf(sx-mux,2)+powf(sy-muy,2))
                          if dlen<10{
                              circle sx-10,sy-10,sx+10,sy+10,0
                          }
                          if cnt=0{
                              pos ldt(1,cnt),ldt(2,cnt)
                          }else{
                              line ldt(1,cnt),ldt(2,cnt)
                          }
                      loop
                      if tk1{
                          phid=-1
                          repeat
                              ;端の移動
                              if ldt(0,cnt)=0:break
                              sx=ldt(1,cnt)
                              sy=ldt(2,cnt)
                              dlen=sqrt(powf(sx-mux,2)+powf(sy-muy,2))
                              if dlen<10{
                                  phid=cnt
                                  break
                              }
                              if ldt(0,cnt+1)=0:break
                              ex=ldt(1,cnt+1)
                              ey=ldt(2,cnt+1)
                              dlen=sqrt(powf(ex-mux,2)+powf(ey-muy,2))
                              if dlen<10{
                                  phid=cnt+1
                                  break
                              }
                              ;角の生成
                              abx=ex-sx:aby=ey-sy            ;(直線の始点→直線の終点)ベクトル
                              apx=mux-sx:apy=muy-sy        ;(直線の始点→任意の点)ベクトル
                              d=absf(abx*apy-aby*apx)        ;ベクトルの外積
                              l=sqrt(powf(ex-sx,2)+powf(ey-sy,2))    ;始点〜終点の距離
                              if d!=0{
                                  if (d/l)<10{
                                      phid=cnt+1
                                      memcpy ldt,ldt,5*4*(1000-phid),5*4*phid,5*4*cnt
                                      break
                                  }
                              }
                              await
                          loop
                      }
                      if k1{
                          if phid>=0{
                              ldt(1,phid)=mux
                              ldt(2,phid)=muy
                          }
                      }
                      if rk1{
                          phid=-1
                      }
                      if tk2{    ;角の削除
                          repeat
                              if ldt(0,cnt)=0:break
                              sx=ldt(1,cnt)
                              sy=ldt(2,cnt)
                              dlen=sqrt(powf(sx-mux,2)+powf(sy-muy,2))
                              if dlen<10{
                                  phid=cnt+1
                                  memcpy ldt,ldt,5*4*(1000-phid),5*4*cnt,5*4*phid
                                  break
                              }
                          loop
                      }
                      redraw:await 17:redraw 0
                  loop

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





                    太陽

                    太陽を描写するプログラムです

                    波は太陽から出る光をそれっぽく描いたものです

                     


                    hlen=120
                    sllen=130
                    ellen=180
                    ldiv=15
                    lnum=360/ldiv
                    cenx=320:ceny=240
                    times=7
                    sec=(0f+ellen-sllen)*times
                    sdiv=0
                    repeat
                        color:boxf
                        color 255,64
                        ;太陽描写
                        circle cenx-hlen,ceny-hlen,cenx+hlen,ceny+hlen
                        ;波描写
                        repeat lnum
                            tdiv=ldiv*cnt
                            sx=cos(deg2rad(tdiv))*sllen+cenx
                            sy=sin(deg2rad(tdiv))*sllen+ceny
                            ex=cos(deg2rad(tdiv))*ellen+cenx
                            ey=sin(deg2rad(tdiv))*ellen+ceny
                            ;法線ベクトルは線の傾きの逆数(-X/Y)
                            dir=-atan(ex-sx,ey-sy)
                            repeat sec
                                tx=(sx-ex)/sec*cnt+ex
                                ty=(sy-ey)/sec*cnt+ey
                                setx=cos(dir)*(cos(deg2rad(sdiv+cnt))*8)+tx
                                sety=sin(dir)*(cos(deg2rad(sdiv+cnt))*8)+ty
                                if cnt=0{
                                    pos setx,sety
                                }else{
                                    line setx,sety
                                }
                            loop
                        loop
                        sdiv++
                        if sdiv>=360{sdiv=0}
                        redraw:await 17:redraw 0
                    loop

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