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

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





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





        多角形の内部の反射処理

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

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

         

        #include"hgimg3.as"
        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}
                    wex=0f+wldt(0,wlct):wey=0f+wldt(1,wlct):wsx=0f+wldt(2,wlct):wsy=0f+wldt(3,wlct)
                    bsx=bldt(0):bsy=bldt(1):bex=tblx:bey=tbly
                    d=(wex-wsx)*(bey-bsy)-(wey-wsy)*(bex-bsx)
                    if d<-0.00001|0.00001<d{
                        u=((bsx-wsx)*(bey-bsy)-(bsy-wsy)*(bex-bsx))/d
                        v=((bsx-wsx)*(wey-wsy)-(bsy-wsy)*(wex-wsx))/d
                        if (u>=0.0&u<=1.0)&(v>=0.0&v<=1.0){
                            ;壁とボールの軌道の交点
                            crsx=0f+wsx+u*(wex-wsx)
                            crsy=0f+wsy+u*(wey-wsy)
                            ;壁同士の境目に来た場合、位置調整
                            wrad=atan(wey-wsy,wex-wsx)
                            if sqrt(powf(crsx-wex,2)+powf(crsy-wey,2))<=1{
                                crsx-=cos(wrad):crsy-=sin(wrad)
                                twlct=wlct+1:if twlct>=length2(wldt){twlct=0}
                                wnrad=atan(wldt(3,twlct)-wldt(1,twlct),wldt(2,twlct)-wldt(0,twlct))
                                crsx-=cos(wnrad):crsy-=sin(wnrad)
                            }else:if sqrt(powf(crsx-wsx,2)+powf(crsy-wsy,2))<=1{
                                crsx+=cos(wrad):crsy+=sin(wrad)
                                twlct=wlct-1:if twlct<0{twlct=length2(wldt)-1}
                                wnrad=atan(wldt(3,twlct)-wldt(1,twlct),wldt(2,twlct)-wldt(0,twlct))
                                crsx+=cos(wnrad):crsy+=sin(wnrad)
                            }
                            ;反射ベクトル計算
                            ndir=-atan(wex-wsx,wey-wsy)
                            fx=cos(bldt(3)):fy=sin(bldt(3))
                            nx=cos(ndir):ny=sin(ndir)
                            dot=(-fx)*nx+(-fy)*ny
                            rx=fx+2.0*dot*nx
                            ry=fy+2.0*dot*ny
                            bldt(3)=atan(ry,rx)
                            ;反射後のボールの位置
                            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)|-|





                      あみだくじ

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



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





                                  三次元極座標

                                  三次元の球面上に点を描写するプログラムです

                                  原点から一定の距離にランダムで点を配置します

                                   

                                  #include "d3m.hsp"
                                  #const double CAMERA_R 180
                                  #const double PI 3.1415
                                  randomize
                                  r=60.0
                                  camera_phi=PI/3.0
                                  camera_theta=0.0
                                  old_mx=0
                                  old_my=0
                                  d3mkparticle 0,255,255,255

                                  sum=120
                                  dim x,sum
                                  dim y,sum
                                  dim z,sum
                                  repeat sum    ;球面上にパーティクル配置
                                      rad0=deg2rad(rnd(360))
                                      rad1=deg2rad(rnd(360))
                                      ;曲座標を求める式
                                      x(cnt)=r*sin(rad0)*cos(rad1)
                                      y(cnt)=r*sin(rad0)*sin(rad1)
                                      z(cnt)=r*cos(rad0)
                                  loop
                                  *main
                                      color:boxf:color 255,255,255
                                      ok1=k1:getkey k1,1:tk1=k1^ok1&k1
                                      gosub *move_camera
                                      gosub *draw
                                      redraw:await 17:redraw 0
                                      goto *main

                                  *draw        ;座標軸とパーティクルの描写
                                      color 255:d3line -r,0,0,r,0,0
                                      color ,255:d3line 0,-r,0,0,r,0
                                      color ,,255:d3line 0,0,-r,0,0,r
                                      gmode 5, , , 255
                                      repeat sum
                                          d3particle 0, x(cnt), y(cnt), z(cnt), 5
                                      loop
                                      return
                                  *move_camera    ;ドラッグでカメラ視点移動
                                      if k1{
                                          if ok1{
                                              camera_theta += 0.01 * ( old_mx - ginfo_mx )
                                              camera_phi   = limitf( camera_phi + 0.01 * ( old_my - ginfo_my ), 0.01, PI - 0.01 )
                                          }
                                          old_mx = ginfo_mx
                                          old_my = ginfo_my
                                      }
                                      d3vrotate camera_x, camera_y, camera_z, 0, 0, CAMERA_R, 0, 1, 0, camera_phi
                                      d3vrotate camera_x, camera_y, camera_z, camera_x, camera_y, camera_z, 0, 0, 1, camera_theta
                                      d3setcam  camera_x, camera_y, camera_z
                                      return

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





                                    点同士を繋ぐ線

                                    点と点の間に直線を描写するプログラムです

                                    点同士をドラッグすることで線を引けます


                                    randomize
                                    areal=20
                                    sum=10
                                    dim ptcct,sum,sum
                                    cctnum=0
                                    dim ptxy,2,sum
                                    repeat sum
                                        ptxy(0,cnt)=rnd(640),rnd(480)
                                    loop
                                    setid=-1
                                    *main
                                        mux=mousex:muy=mousey
                                        ok1=k1:getkey k1,1:tk1=k1^ok1&k1:rk1=k1^ok1&ok1
                                        color 255,255,255:boxf:color
                                        if tk1{    ;点をクリック
                                            repeat sum
                                                len=sqrt(powf(mux-ptxy(0,cnt),2)+powf(muy-ptxy(1,cnt),2))
                                                if len<=areal{
                                                    setid=cnt
                                                    break
                                                }
                                            loop
                                        }
                                        if k1{
                                            if setid>=0{    ;別の点にドラッグすることでラインを描写
                                                repeat sum
                                                    len=sqrt(powf(mux-ptxy(0,cnt),2)+powf(muy-ptxy(1,cnt),2))
                                                    if len<=areal{
                                                        if cnt!=setid{
                                                            ptcct(cnt,setid)=1
                                                            ptcct(setid,cnt)=1
                                                            setid=cnt
                                                            break
                                                        }
                                                    }
                                                loop
                                            }
                                        }else{
                                            setid=-1
                                        }
                                        ;点描写
                                        repeat sum
                                            x=ptxy(0,cnt):y=ptxy(1,cnt)
                                            circle x-10,y-10,x+10,y+10
                                        loop
                                        ;ライン描写
                                        repeat sum-1:j=cnt
                                            repeat sum-(j+1),j+1:i=cnt
                                                if ptcct(i,j)=1{
                                                    sx=ptxy(0,i):sy=ptxy(1,i)
                                                    gx=ptxy(0,j):gy=ptxy(1,j)
                                                    line gx,gy,sx,sy
                                                }
                                            loop
                                        loop
                                        redraw:await 17:redraw 0
                                        goto *main

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





                                      一日ゲームNo.17「PolyhedronSuffle」

                                      一日ゲーム第十七弾

                                       

                                      カップシャッフルゲームの三次元版みたいなものです

                                      多面体の角の一つが黄色くなっており、クリックするとランダムに移動します

                                      移動先をクリックすれば正解し、次のステージに進めます

                                      全5ステージです

                                       

                                      ダウンロード

                                      ソースコード

                                       

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





                                        一日ゲームNo.16「打斬張」

                                        一日ゲーム第十六弾

                                        少し複雑なじゃんけんゲームです

                                         

                                        打(赤)は斬(緑)に強く、斬(緑)は張(青)に強く、張(青)は打(赤)に強いです

                                        「並び替え」・・・個体の並び替えを行います。先頭の五体のみ戦闘に参加させられます

                                        「交配」・・・二つの個体を組み合わせます。ステータスは組み合わせた個体のステータスからランダムで決定します

                                        「解雇」・・・個体を削除します。

                                         

                                        ダウンロード

                                        ソースコード

                                         

                                         

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





                                          一日ゲームNo.15「円迷路」

                                          一日ゲーム第十五弾

                                          一風変わった迷路ゲームです

                                           

                                          白い線がルートで、サークルの外側がゴールになります

                                          操作キーは十字キーのみです

                                           

                                          ダウンロード

                                          ソースコード

                                          ※10/31修正

                                           

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





                                            一日ゲームNo.14「KnightJumper」

                                            久々の一日ゲーム、第十四弾です

                                             

                                            チェスのナイトのような動きをするキャラクターを操作し、ステージをクリアしていきます

                                            キャラクターが移動するごとにマスが減っていくので、身動きが取れなくなる前にゴール(青枠のマス)までたどり着く必要があります

                                            また、キャラクターがいるマスと移動先のマスが二段以上差がある場合は移動できません

                                            マップ上には攻略に役立つアイテム(紫のマス)があります、上手く活用して攻略を有利に進めてください

                                             

                                            操作方法

                                            マップ上をクリック・・・移動

                                            アイテム名をクリック・・・アイテムを使用

                                             

                                            gキーを押すことでゲームオーバー、その時点でのクリアステージ数が表示されます

                                            ※10/24 システムを調整しました

                                             

                                            ダウンロード

                                            ソースコード

                                             

                                             

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





                                              壁の透過

                                              壁の向こう側にいるキャラクターがいる場合、キャラと壁が重なる部分を半透明で表示するプログラムです

                                               

                                               

                                              ;壁の透過
                                              #enum d_main=0
                                              #enum d_wallwd
                                              #enum d_maskchip
                                              #enum d_chip
                                              #enum d_bb0
                                              #enum d_bb1
                                              #enum d_maskwd
                                              #include "gdi32.as"
                                              #const SRCINVERT $00660046
                                              csz=64
                                              ;チップ画像
                                              buffer d_chip,csz*3,csz*2:celdiv d_chip,csz,csz
                                              color:boxf:x=0:y=0
                                              color 255:circle x,y,x+csz-1,y+csz-1:y+csz    ;キャラ
                                              color ,,255:boxf x,y,x+csz-1,y+csz-1:y+csz    ;壁
                                              ;チップの黒白画像を作成
                                              x1=csz:x2=csz*2
                                              ty=0
                                              repeat 2
                                                  repeat csz:j=cnt
                                                      repeat csz:i=cnt
                                                          pget i,ty+j
                                                          cl=ginfo(16)+ginfo(17)+ginfo(18)
                                                          if cl>0{
                                                              color 1
                                                              pset x1+i,ty+j
                                                              color 255,255,255
                                                              pset x2+i,ty+j
                                                          }
                                                      loop
                                                  loop
                                                  ty+csz
                                              loop
                                              ;マップ作成
                                              mc=11:mr=8
                                              gw=mc*csz:gh=mr*csz
                                              dim mapdt,mc,mr
                                              repeat 24
                                                  x=rnd(mc):y=rnd(mr)
                                                  mapdt(x,y)=1
                                              loop
                                              buffer d_bb0,gw,gh    ;XOR用1
                                              hdc0=hdc
                                              buffer d_bb1,gw,gh    ;XOR用2
                                              hdc1=hdc
                                              buffer d_wallwd,gw*2,gh    ;壁表示用
                                              buffer d_maskwd,gw,gh    ;重複範囲用
                                              ;処理開始
                                              screen d_main,gw,gh
                                              repeat
                                                  mux=mousex:muy=mousey
                                                  gsel d_bb0:color 255,255,255:boxf
                                                  gsel d_bb1:color 255,255,255:boxf
                                                  gsel d_wallwd:color:boxf
                                                  gsel d_maskwd:color 255,255,255:boxf
                                                  ;障害物の画像とマスク画像を描写
                                                  gsel d_wallwd
                                                  gmode 2
                                                  gsel d_bb1
                                                  gmode 2
                                                  repeat mr:j=cnt
                                                      repeat mc:i=cnt
                                                          if mapdt(i,j){
                                                              gsel d_bb1
                                                              x=csz*i:y=csz*j
                                                              pos x,y:celput d_chip,1*3+1
                                                              gsel d_wallwd
                                                              pos x,y:celput d_chip,1*3
                                                              pos x+gw,y:celput d_chip,1*3+2
                                                          }
                                                      loop
                                                  loop
                                                  ;XORコピーを用いて重なる範囲を取得する
                                                  BitBlt hdc0,0,0,gw,gh,hdc1,0,0,$00660046
                                                  gsel d_bb1
                                                  pos mux,muy:celput d_chip,0*3+2
                                                  BitBlt hdc0,0,0,gw,gh,hdc1,0,0,$00660046
                                                  ;重複範囲を半透明にする
                                                  gsel d_maskwd:color 128,128,128:boxf
                                                  gmode 6,,,255:gcopy d_bb0,,,gw,gh
                                                  ;壁表示用バッファに作成した重複範囲を重ねる
                                                  gsel d_wallwd
                                                  pos gw,0:gcopy d_maskwd,,,gw,gh
                                                  ;メイン画像に表示
                                                  gsel 0
                                                  gmode 2
                                                  color 255,255,255:boxf
                                                  x=mux:y=muy
                                                  pos x,y:celput d_chip,0*3
                                                  gmode 7,,,125
                                                  pos 0,0:gcopy d_wallwd,,,gw,gh
                                                  redraw:await:redraw 0
                                              loop

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





                                                重ならないように円を配置ver2

                                                円が重なり合わないように描写するプログラムその2です

                                                円の配置チェックを二次元マップのマスで行います
                                                青色の場合はクリックすることで配置可能、赤色の場合はすでに置かれた円と重なっているので配置できません

                                                 


                                                gw=640:gh=480
                                                mcsz=16
                                                cw=gw/mcsz:ch=gh/mcsz
                                                dim mapdt,cw,ch    ;マップデータ

                                                len=5
                                                repeat
                                                    ok1=k1:getkey k1,1:tk1=k1^ok1&k1
                                                    mcx=mousex/mcsz:mcy=mousey/mcsz
                                                    mapsetflg=0
                                                    if tk1{
                                                        if overflg=0{    ;重なっていたら配置できないようにする
                                                            mapsetflg=1
                                                        }                ;if文をコメントアウトで配置可能
                                                    }
                                                    overflg=0
                                                    repeat len*2+1,mcy-len:c1=cnt
                                                        repeat len*2+1,mcx-len
                                                            if 0<=cnt&cnt<cw&0<=c1&c1<ch{
                                                                dis=0+sqrt(powf(mcx-cnt,2)+powf(mcy-c1,2))
                                                                if dis<len{
                                                                    if mapdt(cnt,c1){    ;配置された円と重なっている
                                                                        overflg=1
                                                                    }
                                                                    if mapsetflg{    ;マップに配置
                                                                        mapdt(cnt,c1)=1
                                                                    }
                                                                }
                                                            }
                                                        loop
                                                    loop
                                                    color 255,255,255:boxf
                                                    repeat ch:c1=cnt
                                                        repeat cw
                                                            x=cnt*mcsz:y=c1*mcsz
                                                            if mapdt(cnt,c1){
                                                                color
                                                                boxf x,y,x+mcsz-1,y+mcsz-1
                                                            }
                                                            dis=0+sqrt(powf(mcx-cnt,2)+powf(mcy-c1,2))
                                                            if dis<len{
                                                                if overflg{
                                                                    color 255
                                                                }else{
                                                                    color ,,255
                                                                }
                                                                boxf x,y,x+mcsz-1,y+mcsz-1
                                                            }
                                                        loop
                                                    loop
                                                    redraw:await 17:redraw 0
                                                loop

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





                                                  重ならないように円を配置

                                                  円が重なり合わないように描写するプログラムです

                                                  青色の場合はクリックすることで配置可能、赤色の場合はすでに置かれた円と重なっているので配置できません

                                                   


                                                  crmax=10
                                                  dim crdt,4,crmax    ;円データ
                                                  len=50
                                                  repeat
                                                      mux=mousex:muy=mousey
                                                      ok1=k1:getkey k1,1:tk1=k1^ok1&k1
                                                      color 255,255,255:boxf
                                                      mapsetflg=0
                                                      if tk1{
                                                          mapsetflg=1
                                                      }
                                                      overflg=0
                                                      color
                                                      repeat crmax    ;配置円の描写と、配置円との重なりがないかチェック
                                                          if crdt(0,cnt){
                                                              tx=crdt(1,cnt):ty=crdt(2,cnt):tlen=crdt(3,cnt)
                                                              dis=sqrt(powf(mux-tx,2)+powf(muy-ty,2))
                                                              if dis<=tlen+len{
                                                                  overflg=1
                                                              }
                                                              circle tx-tlen,ty-tlen,tx+tlen,ty+tlen
                                                          }
                                                      loop
                                                      if overflg=0{    ;重なっていなければ
                                                          if mapsetflg{    ;円を配置可能
                                                              repeat crmax
                                                                  if crdt(0,cnt)=0{
                                                                      crdt(0,cnt)=1,mux,muy,len
                                                                      break
                                                                  }
                                                              loop
                                                          }
                                                          mapsetflg=0
                                                          color ,,255
                                                      }else{
                                                          color 255
                                                      }
                                                      circle mux-len,muy-len,mux+len,muy+len
                                                      redraw:await 17:redraw 0
                                                  loop

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





                                                    ジャパニーズアトラクタ

                                                    ジャパニーズアトラクタ(Japanese attractor)はローレンツアトラクタと同時期に作られたカオスです

                                                    Bの値を変えることで形を変えられます

                                                     


                                                    k=0.1    ;定数
                                                    B=12.0    ;定数
                                                    x=0.0    ;X座標
                                                    y=0.0    ;Y座標
                                                    n=10000    ;繰り返し回数
                                                    bn=800    ;微分の項数
                                                    dt=2.0*M_PI/bn
                                                    t=0.0    ;時間
                                                    kw=100    ;横倍率
                                                    kh=15    ;縦倍率
                                                    boxf:color 255,255,255
                                                    repeat n
                                                        repeat bn
                                                            t=t+dt
                                                            xx=x+dt*y;
                                                            yy=y+dt*(-k*y-powf(x,3)+B*cos(t));
                                                            x=xx;
                                                            y=yy;
                                                        loop
                                                        pset x*kw,y*kh+240
                                                        await
                                                    loop
                                                    title"stop"

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





                                                      ローレンツアトラクタ

                                                      ローレンツアトラクタを描写するプログラムです

                                                      三次元上に描写して、立体的に見えるようにしました

                                                       

                                                       

                                                      #include "d3m.hsp"
                                                      #define global sgm 10.0
                                                      #define global r 28.0
                                                      #define global b 8.0/3.0
                                                      ;ローレンツ方程式の関数
                                                      #module
                                                      #defcfunc m_f double x,double y
                                                          return sgm*(-x + y)
                                                      #defcfunc m_g double x,double y,double z
                                                          return r*x - y - x*z
                                                      #defcfunc m_h double x,double y,double z
                                                          return -b*z + x*y
                                                      #global
                                                      ddim ps,3    ;現在位置
                                                      ddim nps,3    ;描写位置
                                                      ddim k,3,4
                                                      ddim calc,3
                                                      dt=0.01    ;時間
                                                      n=5000    ;繰り返し回数
                                                      kd=20    ;拡大率
                                                      repeat
                                                          ct++
                                                          redraw 0
                                                          color:boxf:color 255,255,255
                                                          ;カメラを回転させる
                                                          d3setcam cos(0.04*ct)*1500,sin(0.04*ct)*1500,cos(0.03*ct)*1000,,,500
                                                          ps=1.0,1.0,1.0
                                                          d3initlineto
                                                          repeat n:i=cnt
                                                              ;4次ルンゲクッタ法
                                                              k(0,0)=dt*m_f(ps(0),ps(1))
                                                              k(1,0)=dt*m_g(ps(0),ps(1),ps(2))
                                                              k(2,0)=dt*m_h(ps(0),ps(1),ps(2))
                                                          
                                                              k(0,1)=dt*m_f(ps(0)+k(0,0)/2,ps(1)+k(1,0)/2)
                                                              k(1,1)=dt*m_g(ps(0)+k(0,0)/2,ps(1)+k(1,0)/2,ps(2)+k(2,0)/2)
                                                              k(2,1)=dt*m_h(ps(0)+k(0,0)/2,ps(1)+k(1,0)/2,ps(2)+k(2,0)/2)
                                                              
                                                              k(0,2)=dt*m_f(ps(0)+k(0,1)/2,ps(1)+k(1,1)/2)
                                                              k(1,2)=dt*m_g(ps(0)+k(0,1)/2,ps(1)+k(1,1)/2,ps(2)+k(2,1)/2)
                                                              k(2,2)=dt*m_h(ps(0)+k(0,1)/2,ps(1)+k(1,1)/2,ps(2)+k(2,1)/2)
                                                              
                                                              k(0,3)=dt*m_f(ps(0)+k(0,2),ps(1)+k(1,2))
                                                              k(1,3)=dt*m_g(ps(0)+k(0,2),ps(1)+k(1,2),ps(2)+k(2,2))
                                                              k(2,3)=dt*m_h(ps(0)+k(0,2),ps(1)+k(1,2),ps(2)+k(2,2))
                                                              repeat 3
                                                                  nps(cnt)=ps(cnt)+(k(cnt,0)+k(cnt,1)*2.0+k(cnt,2)*2.0+k(cnt,3))/6.0
                                                                  ps(cnt)=nps(cnt)
                                                              loop
                                                              ;描写
                                                              d3lineto nps(0)*kd,nps(1)*kd,nps(2)*kd
                                                          loop
                                                          redraw
                                                          await
                                                      loop

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





                                                        オブジェクトのドラッグver3

                                                        オブジェクトをドラッグ&ドロップするプログラムです

                                                        複数の図形をそれぞれ移動させたり大きさを変えたりできます

                                                         


                                                        randomize
                                                        objmax=5
                                                        dim objdt,5,objmax
                                                        repeat objmax
                                                            objdt(0,cnt)=cnt
                                                            x=rnd(390):y=rnd(260)
                                                            objdt(0,cnt)=x,y
                                                            objdt(2,cnt)=x+rnd(100)+50,y+rnd(80)+40
                                                        loop
                                                        repeat
                                                            mux=mousex:muy=mousey
                                                            ok1=k1
                                                            getkey k1,1
                                                            tk1=k1^ok1&k1
                                                            if tk1{
                                                                ;図形の辺や角をクリックする
                                                                id=-1:type=0
                                                                repeat objmax
                                                                    ltx=objdt(0,cnt)
                                                                    lty=objdt(1,cnt)
                                                                    rbx=objdt(2,cnt)
                                                                    rby=objdt(3,cnt)
                                                                    if ltx-8<=mux&mux<=rbx+8&lty-8<=muy&muy<rby+8{
                                                                        id=cnt
                                                                        if abs(mux-ltx)<8{
                                                                            type|%0001
                                                                        }
                                                                        if abs(muy-lty)<8{
                                                                            type|%0010
                                                                        }
                                                                        if abs(mux-rbx)<8{
                                                                            type|%0100
                                                                        }
                                                                        if abs(muy-rby)<8{
                                                                            type|%1000
                                                                        }
                                                                        if type=0{
                                                                            type|%1111
                                                                        }
                                                                        sltx=mux-objdt(0,cnt)
                                                                        slty=muy-objdt(1,cnt)
                                                                        srbx=mux-objdt(2,cnt)
                                                                        srby=muy-objdt(3,cnt)
                                                                        break
                                                                    }
                                                                    if id>=0:break
                                                                loop
                                                            }
                                                            if k1{
                                                                if id>=0{
                                                                    ;伸ばしたり縮めたりする
                                                                    if type&%0001{
                                                                        objdt(0,id)=mux-sltx
                                                                    }
                                                                    if type&%0010{
                                                                        objdt(1,id)=muy-slty
                                                                    }
                                                                    if type&%0100{
                                                                        objdt(2,id)=mux-srbx
                                                                    }
                                                                    if type&%1000{
                                                                        objdt(3,id)=muy-srby
                                                                    }
                                                                }
                                                            }
                                                            ;描写
                                                            color 255,255,255:boxf:color
                                                            repeat objmax
                                                                ltx=objdt(0,cnt)
                                                                lty=objdt(1,cnt)
                                                                rbx=objdt(2,cnt)
                                                                rby=objdt(3,cnt)
                                                                boxf ltx,lty,rbx,rby
                                                            loop
                                                            redraw:await 17:redraw 0
                                                        loop

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





                                                          マウスによるオブジェクトのサイズ変更

                                                          ダイアログボックスのように、辺や角をドラッグすることで大きさを変えるプログラムです

                                                          画面内の図形のサイズをマウスで変更することができます

                                                           


                                                          randomize
                                                          ;オブジェクトデータ
                                                          dim objdt,4
                                                          x=rnd(490):y=rnd(360)
                                                          objdt(0)=x,y
                                                          objdt(2)=x+rnd(100)+50,y+rnd(80)+40

                                                          repeat
                                                              mux=mousex:muy=mousey
                                                              ok1=k1
                                                              getkey k1,1
                                                              tk1=k1^ok1&k1
                                                              if tk1{
                                                                  ;図形の辺や角をクリックする
                                                                  type=0
                                                                  ltx=objdt(0)
                                                                  lty=objdt(1)
                                                                  rbx=objdt(2)
                                                                  rby=objdt(3)
                                                                  if abs(mux-ltx)<8{
                                                                      type|%0001
                                                                  }
                                                                  if abs(muy-lty)<8{
                                                                      type|%0010
                                                                  }
                                                                  if abs(mux-rbx)<8{
                                                                      type|%0100
                                                                  }
                                                                  if abs(muy-rby)<8{
                                                                      type|%1000
                                                                  }
                                                                  sltx=mux-objdt(0)
                                                                  slty=muy-objdt(1)
                                                                  srbx=mux-objdt(2)
                                                                  srby=muy-objdt(3)
                                                              }
                                                              if k1{
                                                                  if type>0{
                                                                      ;伸ばしたり縮めたりする
                                                                      if type&%0001{
                                                                          objdt(0)=mux-sltx
                                                                      }
                                                                      if type&%0010{
                                                                          objdt(1)=muy-slty
                                                                      }
                                                                      if type&%0100{
                                                                          objdt(2)=mux-srbx
                                                                      }
                                                                      if type&%1000{
                                                                          objdt(3)=muy-srby
                                                                      }
                                                                  }
                                                              }
                                                              ;描写
                                                              color 255,255,255:boxf:color
                                                              ltx=objdt(0)
                                                              lty=objdt(1)
                                                              rbx=objdt(2)
                                                              rby=objdt(3)
                                                              boxf ltx,lty,rbx,rby
                                                              redraw:await 17:redraw 0
                                                          loop

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





                                                            ダメージアニメーション

                                                            RPGでよくある、キャラクターに攻撃を当てたり回復したりすると数字が出てくるアニメを作成しました

                                                            画面上の物体をクリックすることでアニメが実行されます

                                                             

                                                             

                                                            ;オブジェクト生成
                                                            csz=20
                                                            buffer 2,csz,csz:celdiv 2,csz,csz,csz/2,csz/2
                                                            color ,255,255:boxf
                                                            dim emyxy,2,3
                                                            x=220:y=280
                                                            repeat 3
                                                                emyxy(0,cnt)=x,y
                                                                x+100
                                                            loop
                                                            ;背景バッファ
                                                            buffer 1
                                                            boxf
                                                            repeat 3
                                                                pos emyxy(0,cnt),emyxy(1,cnt)
                                                                celput 2,0
                                                            loop
                                                            ;ダメージアニメーション
                                                            dim dmganidt,6,50
                                                            repeat 50
                                                                dmganidt(4,cnt)=50
                                                            loop
                                                            ;処理開始
                                                            gsel 0
                                                            repeat
                                                                mux=mousex:muy=mousey
                                                                ok1=k1
                                                                getkey k1,1
                                                                tk1=k1^ok1&k1
                                                                if tk1{
                                                                    pshnum=-1
                                                                    repeat 3
                                                                        ltx=emyxy(0,cnt)-csz/2
                                                                        lty=emyxy(1,cnt)-csz/2
                                                                        rbx=emyxy(0,cnt)+csz/2
                                                                        rby=emyxy(1,cnt)+csz/2
                                                                        ;オブジェクトをクリックしたかどうか判定
                                                                        if ltx<=mux&mux<rbx&lty<=muy&muy<rby{
                                                                            pshnum=cnt
                                                                            break
                                                                        }
                                                                    loop
                                                                    ;クリックしたらダメージアニメーションを作成
                                                                    if pshnum>=0{
                                                                        repeat 50
                                                                            if dmganidt(0,cnt)=0{
                                                                                dmganidt(0,cnt)=1
                                                                                dmganidt(1,cnt)=emyxy(0,pshnum)
                                                                                dmganidt(2,cnt)=emyxy(1,pshnum)-10
                                                                                dmganidt(3,cnt)=0
                                                                                dmganidt(5,cnt)=rnd(100)
                                                                                break
                                                                            }
                                                                        loop
                                                                    }
                                                                }
                                                                ;描写処理
                                                                gmode 0:pos 0,0:gcopy 1,,,640,480
                                                                color 255
                                                                repeat 50
                                                                    if dmganidt(0,cnt){
                                                                        x=dmganidt(1,cnt)
                                                                        y=dmganidt(2,cnt)-dmganidt(3,cnt)
                                                                        pos x,y:mes""+dmganidt(5,cnt)
                                                                        dmganidt(3,cnt)++
                                                                        if dmganidt(3,cnt)>dmganidt(4,cnt){
                                                                            dmganidt(0,cnt)=0
                                                                        }
                                                                    }
                                                                loop
                                                                redraw:await 17:redraw 0
                                                            loop

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