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

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





折れ線の生成

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

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

 

 

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





      傾いた曲線

      斜め方向に凸凹した曲線を描写します

      timesの値を変えると曲線のぐにゃぐにゃ具合も変わります

       

       

      ddim lndt,4
      lndt(0)=200.0,100.0,400.0,400.0
      color 125,125,125
      line lndt(2),lndt(3),lndt(0),lndt(1)
      ;法線ベクトルは線の傾きの逆数(-X/Y)
      dir=-atan(lndt(2)-lndt(0),lndt(3)-lndt(1))
      ;描写処理
      times=1
      sec=360.0*times
      color 255
      repeat sec
          tx=(lndt(2)-lndt(0))/sec*cnt+lndt(0)
          ty=(lndt(3)-lndt(1))/sec*cnt+lndt(1)
          setx=cos(dir)*(cos(deg2rad(cnt))*50)+tx
          sety=sin(dir)*(cos(deg2rad(cnt))*50)+ty
          if cnt=0{
              pos setx,sety
          }else{
              line setx,sety
          }
      loop

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





        一日ゲームNo.18「カメとアキレス」

        一日ゲーム第十八弾

         

        カメをアキレスに追いつかれる前にゴールにたどり着かせるゲームです

        計算式の空欄に正しい数字を入れて、カメをゴールまで進ませましょう

        レベルが高いほど計算が難しくなります

         

        ダウンロード

        ソースコード

         

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





          二次元マップのスクロール

          マップチップを並べた画面内を移動するアルゴリズムです

          キャラクターはマスに捉われない動き方をします

           


          csz=32:cszh=csz/2
          gmw=640/csz:gmh=480/csz        ;画面に表示されるマス数
          mpw=gmw*2:mph=gmh*2        ;マップ全体のマス数
          gmwmx=mpw*csz:gmhmx=mph*csz    ;マップ全体の大きさ
          dim mpdt,mpw,mph
          repeat 600
              mpdt(rnd(mpw-2)+1,rnd(mph-2)+1)=1
          loop
          ;マップチップ
          buffer 2,csz*3,csz:celdiv 2,csz,csz,cszh,cszh
          boxf:x=0
          color 1:boxf x,0,x+csz-1,csz:x+csz
          color 255,255,255:boxf x,0,x+csz-1,csz:x+csz
          color 255:circle x,0,x+csz-1,csz
          gsel 0
          gmode 2
          plx=cszh:ply=cszh
          *main
              color:boxf
              getkey k37,37
              getkey k38,38
              getkey k39,39
              getkey k40,40
              if k37{
                  plx-4
              }
              if k38{
                  ply-4
              }
              if k39{
                  plx+4
              }
              if k40{
                  ply+4
              }
              plx=limit(plx,cszh,gmwmx-cszh)
              ply=limit(ply,cszh,gmhmx-cszh)
              ;表示
              gstx=limit(plx-csz*gmw/2,0,csz*mpw-csz*gmw)
              gsty=limit(ply-csz*gmh/2,0,csz*mph-csz*gmh)
              sx=gstx/csz-1:sy=gsty/csz-1
              ix=gstx¥csz:iy=gsty¥csz
              repeat gmh+2:j=cnt
                  repeat gmw+2:i=cnt
                      tx=sx+i:ty=sy+j
                      if 0<=tx&tx<mpw&0<=ty&ty<mph{
                          pos (i-1)*csz+cszh-ix,(j-1)*csz+cszh-iy
                          celput 2,mpdt(tx,ty)
                      }
                  loop
              loop
              pos plx-gstx,ply-gsty:celput 2,2
              redraw:await 17:redraw 0
              goto *main

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





            あみだくじ

            あみだくじ表を自動で作成するプログラムです



            cmx=20    ;横線の数
            rmx=5    ;平行線の数
            randomize
            dim linedt,cmx,rmx
            cnm=0
            repeat
                if cnm>=cmx:break
                x=rnd(cmx):y=rnd(rmx)
                if linedt(x,y)=0{
                    setflg=0
                    if y=0{
                        dir=0
                    }else:if y=rmx-1{
                        dir=1
                    }else{
                        dir=rnd(2)
                    }
                    if dir=0{
                        if linedt(x,y+1)=0{
                            linedt(x,y)=1
                            linedt(x,y+1)=-1
                            setflg=1
                        }
                    }else{
                        if linedt(x,y-1)=0{
                            linedt(x,y)=-1
                            linedt(x,y-1)=1
                            setflg=1
                        }
                    }
                    if setflg{
                        cnm++
                    }
                }
                await
            loop
            sx=120:sy=80
            inlr=100
            inlc=16
            repeat rmx:y=cnt
                line sx,sy-inlc,sx,sy+(cmx+1)*inlc
                repeat cmx:x=cnt
                    if linedt(x,y)=1{
                        ty=sy+x*inlc
                        line sx,ty,sx+inlr,ty
                    }
                loop
                sx+inlr
            loop

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





              慣性の法則

              慣性の法則のプログラムです

              十字キーを押すことで物体を移動させます

               

               

              cx=320.0
              cy=240.0
              mv=0.1
              vis=0.02
              cmx=0.0
              cmy=0.0
              angle=0
              cszh=16
              gw=640:gh=480
              *main
                  color:boxf:color 255,255,255
                  getkey k37,37
                  getkey k38,38
                  getkey k39,39
                  getkey k40,40
                  angle=0:kpush=0
                  if k37{
                      angle+180:kpush++
                  }
                  if k38{
                      angle+90:kpush++
                  }
                  if k40{
                      angle+270:kpush++
                  }
                  if k39{
                      if k40{
                          angle+360
                      }else{
                          angle+0
                      }
                      kpush++
                  }
                  if kpush>0{
                      angle/kpush
                      cmx+=cos(deg2rad(angle))*mv
                      cmy-=sin(deg2rad(angle))*mv
                  }else{
                      cmx-=vis*cmx
                      cmy-=vis*cmy
                  }
                  cx+=cmx
                  cy+=cmy
                  ;バウンド
                  if cx<cszh{        ;左壁
                      cx=0f+cszh
                      cmx=-cmx
                  }
                  if cx>gw-cszh{    ;右壁
                      cx=0f+gw-cszh
                      cmx=-cmx
                  }
                  if cy<cszh{        ;上壁
                      cy=0f+cszh
                      cmy=-cmy
                  }
                  if cy>gh-cszh{    ;下壁
                      cy=0f+gh-cszh
                      cmy=-cmy
                  }
                  color 255,255,255
                  circle cx-cszh,cy-cszh,cx+cszh,cy+cszh
                  redraw:await 17:redraw 0
                  goto *main

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





                落下と上昇

                落下と上昇を組み合わせたアルゴリズムです

                そのままでは物体が落ちていくだけですが、上キーを押すことで上昇させることができます

                 


                vy=0.0        ;速度
                ay=0.0        ;加速度
                vis=0.05    ;粘性抵抗係数
                grav=0.8    ;重力

                chx=320.0
                chy=240.0
                border=480
                chcsz=24:chcszh2=chcsz/2
                fallflg=1
                *main
                    color:boxf
                    getkey k38,38
                    if k38{
                        if fallflg=0{
                            ay=0.0
                            vy=0.0
                            chy-=1.0
                        }
                        fallflg=1
                        ay=-grav+(vis*(-vy))
                    }else{
                        if fallflg=1{
                            ay=grav-(vis*vy)
                        }
                    }
                    vy+ay
                    chy+vy
                    if chy>=border{
                        chy=border
                        fallflg=0
                    }
                    color 255,255,255
                    boxf chx-chcszh2,chy-chcsz,chx+chcszh2,chy
                    redraw:await 17:redraw 0
                    goto *main

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





                  縄張りアルゴリズム

                  一定の範囲内に進入した場合のみ、キャラクターを追いかけるプログラムです

                   

                   

                  #enum e_i_sflg=0
                  #enum e_i_stype
                  #enum e_i_rsensx
                  #enum e_i_rsensy
                  #enum e_i_rsenslen
                  #enum e_i_target
                  #enum e_d_sx=0
                  #enum e_d_sy
                  #enum e_d_srad
                  #enum e_d_sspd
                  pirad2=M_PI*2

                  spsum=2
                  steer=0.01
                  dim i_shipdt,6,spsum
                  ddim d_shipdt,4,spsum
                  i_shipdt(0,0)=1,0
                  d_shipdt(0,0)=600.0, 400.0, deg2rad(220), 0.5
                  i_shipdt(0,1)=1,1,300,320,200,-1
                  d_shipdt(0,1)=300.0, 320.0, deg2rad(0), 0.0

                  *main
                      color 255,255,255:boxf:color
                      repeat spsum:spid=cnt
                          if i_shipdt(e_i_sflg,spid){
                              rad=d_shipdt(e_d_srad,spid)
                              spd=d_shipdt(e_d_sspd,spid)
                              d_shipdt(e_d_sx,spid)+=cos(rad)*spd
                              d_shipdt(e_d_sy,spid)+=sin(rad)*spd
                              if i_shipdt(e_i_stype,spid)=0{
                                  color ,,255
                              }else{    ;相手のなわばりアルゴリズム
                                  rsx=0f+i_shipdt(e_i_rsensx,spid)
                                  rsy=0f+i_shipdt(e_i_rsensy,spid)
                                  len=0f+i_shipdt(e_i_rsenslen,spid)
                                  ;なわばり範囲
                                  color:circle rsx-len,rsy-len,rsx+len,rsy+len,0
                                  espx=d_shipdt(e_d_sx,spid)
                                  espy=d_shipdt(e_d_sy,spid)
                                  esprad=d_shipdt(e_d_srad,spid)
                                  espspd=d_shipdt(e_d_sspd,spid)
                                  losid=-1
                                  if i_shipdt(e_i_target,spid)>=0{
                                      fspx=d_shipdt(e_d_sx,i_shipdt(e_i_target,spid))
                                      fspy=d_shipdt(e_d_sy,i_shipdt(e_i_target,spid))
                                      tlen=sqrt(powf(rsx-fspx,2)+powf(rsy-fspy,2))
                                      if len>tlen{
                                          i_shipdt(e_i_target,spid)=-1
                                      }
                                  }
                                  if i_shipdt(e_i_target,spid)<0{
                                      repeat spsum:tspid=cnt
                                          if spid!=tspid&i_shipdt(e_i_stype,tspid)=0{
                                              fspx=d_shipdt(e_d_sx,tspid)
                                              fspy=d_shipdt(e_d_sy,tspid)
                                              tlen=sqrt(powf(rsx-fspx,2)+powf(rsy-fspy,2))
                                              if len>tlen{
                                                  len=tlen
                                                  losid=tspid
                                                  d_shipdt(e_d_sspd,spid)=0.8
                                              }
                                          }
                                      loop
                                  }
                                  if losid>=0{    ;縄張り内に侵入者
                                      i_shipdt(e_i_target,spid)=losid
                                      rot2=atan(fspy-espy,fspx-espx)
                                      rot1=esprad
                                      ;下の行をアンコメントするとどこまでも追いかける
                                      ;i_shipdt(e_i_rsenslen,spid)=999999
                                  }else{    ;侵入者が縄張り外に出た場合
                                      tlen=sqrt(powf(rsx-espx,2)+powf(rsy-espy,2))
                                      if tlen>10{    ;ほぼ中心地に戻る
                                          rot2=atan(rsy-espy,rsx-espx)
                                          rot1=esprad
                                      }else{
                                          d_shipdt(e_d_sspd,spid)=0.0
                                      }
                                  }
                                  ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                                  rad=rot2-rot1
                                  ;方向の値が0〜円周率に収まるようにする
                                  if rad>M_PI:rad-pirad2
                                  if rad<-M_PI:rad+pirad2
                                  if rad>steer{d_shipdt(e_d_srad,spid)+steer}
                                  if rad<-steer{d_shipdt(e_d_srad,spid)-steer}
                                  color 255
                              }
                              x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
                              circle x-10,y-10,x+10,y+10
                          }
                      loop
                      redraw:await 17:redraw 0
                      goto *main

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





                    迎撃アルゴリズム

                    キャラクターの接触ポイントを予測し、それに基づいた行動をさせるアルゴリズムです

                     


                    #enum e_i_sflg=0
                    #enum e_i_stype
                    #enum e_d_sx=0
                    #enum e_d_sy
                    #enum e_d_srad
                    #enum e_d_sspd
                    pirad2=M_PI*2

                    spsum=2
                    steer=0.01
                    dim i_shipdt,2,spsum
                    ddim d_shipdt,4,spsum
                    i_shipdt(0,0)=1,0
                    d_shipdt(0,0)=600.0, 400.0, deg2rad(220), 0.5
                    i_shipdt(0,1)=1,1
                    d_shipdt(0,1)=50.0, 420.0, deg2rad(0), 0.8

                    *main
                        color 255,255,255:boxf:color
                        repeat spsum:spid=cnt
                            if i_shipdt(e_i_sflg,spid){
                                rad=d_shipdt(e_d_srad,spid)
                                spd=d_shipdt(e_d_sspd,spid)
                                d_shipdt(e_d_sx,spid)+=cos(rad)*spd
                                d_shipdt(e_d_sy,spid)+=sin(rad)*spd
                                x=d_shipdt(e_d_sx,spid):y=d_shipdt(e_d_sy,spid)
                                if i_shipdt(e_i_stype,spid)=0{
                                    color ,,255
                                }else{    ;相手の迎撃アルゴリズム
                                    len=999999.0
                                    espx=d_shipdt(e_d_sx,spid)
                                    espy=d_shipdt(e_d_sy,spid)
                                    esprad=d_shipdt(e_d_srad,spid)
                                    espspd=d_shipdt(e_d_sspd,spid)
                                    losid=-1
                                    repeat spsum:tspid=cnt
                                        if spid!=tspid&i_shipdt(e_i_stype,tspid)=0{
                                            fspx=d_shipdt(e_d_sx,tspid)
                                            fspy=d_shipdt(e_d_sy,tspid)
                                            tlen=sqrt(powf(espx-fspx,2)+powf(espy-fspy,2))
                                            if len>tlen{
                                                len=tlen
                                                losid=tspid
                                            }
                                        }
                                    loop
                                    if losid>=0{
                                        fspx=d_shipdt(e_d_sx,losid)
                                        fspy=d_shipdt(e_d_sy,losid)
                                        fsprad=d_shipdt(e_d_srad,losid)
                                        fspspd=d_shipdt(e_d_sspd,losid)
                                        fax=cos(fsprad)*fspspd:fay=sin(fsprad)*fspspd
                                        eax=cos(esprad)*espspd:eay=sin(esprad)*espspd
                                        vrx=fax-eax:vry=fay-eay
                                        srx=fspx-espx:sry=fspy-espy
                                        tc=sqrt(srx*srx+sry*sry)/sqrt(vrx*vrx+vry*vry)
                                        stx=fspx+fax*tc:sty=fspy+fay*tc
                                        ;予測衝突地点
                                        color:circle stx-10,sty-10,stx+10,sty+10,0
                                        rot2=atan(sty-espy,stx-espx)
                                        rot1=esprad
                                        ;ターゲットの進行方向と、ターゲットから見た標的の角度差
                                        rad=rot2-rot1
                                        ;方向の値が0〜円周率に収まるようにする
                                        if rad>M_PI:rad-pirad2
                                        if rad<-M_PI:rad+pirad2
                                        if rad>steer{d_shipdt(e_d_srad,spid)+steer}
                                        if rad<-steer{d_shipdt(e_d_srad,spid)-steer}
                                    }
                                    color 255
                                }
                                circle x-10,y-10,x+10,y+10
                            }
                        loop
                        redraw:await 17:redraw 0
                        goto *main

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