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

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





一日ゲーム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)|-|





              太陽

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

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

               


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