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

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





太陽

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

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

 


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





                    LOSアルゴリズム

                    キャラクターの追跡アルゴリズムです

                    直線する青を赤色が追いかけます

                     


                    #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)
                                    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)
                                        rot2=atan(fspy-espy,fspx-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 20:12comments(0)|-|