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

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





角が丸い四角(線)

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

 


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)|-|





          一日ゲームNo.19「迷路RPG」

          一日ゲーム第十九弾

           

          アクションRPGです

          マウスクリックで自キャラ(赤)を移動させ、敵キャラ(青)と接触することで戦闘を行います

          敵を倒すとレベルが上がります

          最終的にボスを倒すとゲームクリアーです

          草や岩を踏むと時々体力が回復します

           

          ダウンロード

           

           

          ソースコード

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