ひろひろの生活日記(LIFE Of HIROHIRO)

パソコン講習とソフト開発をしています。自作小説も掲載しています。ネット情報発信基地(上野博隆)Hirotaka Ueno

テーブルデータからロボットの描画(テスト済みコーディング掲載)(2)

2022年04月13日 09時17分56秒 | ゲーム開発(Game development)

テーブルデータからロボットの描画(テスト済みコーディング掲載)(2)

 

 

//
//ロボットの描画
//

function robotdraw(){


//接合部を描画する
    join_draw();

//ロボットテーブルからデータを呼び出し描画する。
    for(y=0; y<robotsu; y++){
        //テーブル(配列)から図形種別のワークに入れる。

        shapetype = robotcode[y][4];
        idy = y;

        //値によって処理を分ける。
        switch(shapetype) {
          case "10":
              //イメージデータの描画処理
              image_draw();
              break;
          case "23":
              //線の描画処理(接合点(始点、終点))
              line3_draw();
              break;
          case "30":
              //円の描画処理
              if(robotcode[y][0] !="11") circle_draw();
              break;
          case "40":
              //多角形の描画処理
              polygon_draw();
              break;
          case "41":
              //多角形の描画処理(接合点)
              polygon2_draw();
              break;
          case "53":
              //逆台形の描画処理
              invtrapezoid3_draw();
              break;
          default:
              //その他(考え中)
              etc_syori();
       }
    }


}
//接合部の座標を計算する。
function join_calculate(){

    jointbl[joinsu].kinds = "S" + robotcode[idy][1];          //種別
    jointbl[joinsu].timing = robotcode[idy][2];         //描画タイミング
    jointbl[joinsu].shapetype = robotcode[idy][4];      //図形種別
    jointbl[joinsu].colorno = parseInt(robotcode[idy][8]);        //色No
    jointbl[joinsu].midpointx = robotcode[idy][9];       //中点x
    jointbl[joinsu].midpointy = robotcode[idy][10];       //中点y
// 前の接合点からの描画角度
    if(robotcode[idy][11] === "△") {
        jointbl[joinsu].fangle = 0;
    } else {
        jointbl[joinsu].fangle = parseInt(robotcode[idy][11].substr(1,2));          //前角度

    }
    dr = jointbl[joinsu].fangle;
//  左側の接合点の場合、角度を360度回転させる。
    if((robotcode[idy][1].substr(0,1) === "2") || (robotcode[idy][1].substr(0,1) === "4")){
          dr = 360 - dr;
          if(dr >= 360) dr = dr - 360;
    }

    jointbl[joinsu].radius = parseInt(robotcode[idy][12]);          //半径
    jointbl[joinsu].flength = parseInt(robotcode[idy][14]);         //前長さ
    jointbl[joinsu].length = parseInt(robotcode[idy][15]);          //長さ

    sx = 0; sy = 0;
    //中点xの値の頭が”S”であると前にある種別が同一の座標を参照して計算する。
    //リアル座標xの算出
    if(robotcode[idy][9].substr(0,1) === 'S'){
        //一つ前のテーブルの種別が中点xの値と同じならリアル座標xをsxに入れる。
        //以外は0を編集する。
        if(jointbl[joinsu-1].kinds === jointbl[joinsu].midpointx){
           sx = jointbl[joinsu-1].realadx;
        } else {
           sx = 0;
        }
        //cos(コサイン)でx座標を求める。(前の角度+90)ラジアンに直す(パイ/180を乗算する)
        if(dr === 0){
           jointbl[joinsu].realadx = sx;
        } else {
           jointbl[joinsu].realadx = parseInt(jointbl[joinsu].flength*Math.cos((dr+90)*Math.PI/180))+sx;
        }
    } else {
        //実座標が入っている場合、そのまま編集する。
        jointbl[joinsu].realadx = parseInt(robotcode[idy][9]);         //リアル座標x
    }
    
    //中点yの値の頭が”S”であると前にある種別が同一の座標を参照して計算する。
    //リアル座標yの算出
    if(robotcode[idy][10].substr(0,1) === 'S'){
        //一つ前のテーブルの種別が中点yの値と同じならリアル座標yをsyに入れる。
        //以外は0を編集する。
        if(jointbl[joinsu-1].kinds === jointbl[joinsu].midpointy){
           sy = jointbl[joinsu-1].realady;
        } else {
           sy = 0;
        }
        if(dr === 0){
            jointbl[joinsu].realady = jointbl[joinsu].flength + sy;
        } else  {
            //sin(サイン)でy座標を求める。(前の角度+90)ラジアンに直す(パイ/180を乗算する)
            jointbl[joinsu].realady = parseInt(jointbl[joinsu].flength*Math.sin((dr+90)*Math.PI/180))+sy;
        }
    } else {
        //実座標が入っている場合、そのまま編集する。
        jointbl[joinsu].realady = parseInt(robotcode[idy][10]);         //リアル座標y
    }


    joinsu = joinsu + 1;

}

//イメージデータの描画処理
function image_draw(){
        //イメージテーブルの印字するイメージの番号
        imgno = parseInt(robotcode[idy][5])-1;
        //印字位置
        icenterx = parseInt(robotcode[idy][9]);
        icentery = parseInt(robotcode[idy][10]);
        //印字するサイズ 幅と高さ
        iwidth   = parseInt(robotcode[idy][14]);
        ilong    = parseInt(robotcode[idy][15]);

        ctx.drawImage(img_robot[imgno],icenterx*mgf+dfsx,icentery*mgf+dfsy,iwidth*mgf,ilong*mgf);


}


//線の描画処理
//
//線の描画処理(接合点(始点、終点)のからの表示)
//
function line3_draw(){
//   図形タイプをセーブする。
        shapetype = robotcode[idy][4];
//      接合点(始点)
        linestratx = 0; linestarty = 0;
    if(robotcode[idy][6] != "00"){
          linestart = "S" + robotcode[idy][6];
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === linestart){
                  linestartx = jointbl[i].realadx;
                  linestarty = jointbl[i].realady;
                  break;
              }
           }
       }
//      接合点(終点)
        lineendx = 0; lineendy = 0;
    if(robotcode[idy][7] != "00"){
          lineend = "S" + robotcode[idy][7];
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === lineend){
                  lineendx = jointbl[i].realadx;
                  lineendy = jointbl[i].realady;
                  break;
              }
           }
       }

//      (の中は、減算、加算する差異数値
        polysax = 0; polysay = 0;
        if(robotcode[idy][11].substr(0,1) === "(") {
           polysax = parseInt(robotcode[idy][11].substr(1,4));
           polysay = parseInt(robotcode[idy][11].substr(6,4));
        }
        y1sv = 0; x1sv =0;
//      始点を差異で修正する
        y1sv = linestarty + polysay;
        x1sv = linestartx + polysax;
//     線の幅
       linewidth = parseInt(robotcode[idy][14]);
//     線の長さ
       linelength = parseInt(robotcode[idy][15]);

//     線の角度
       lineangle = 0;
//     終点が無い場合は、角度と長さより終点を算出する。
       if(lineendx === 0){
           if((robotcode[idy][11].substr(0,1) != "△") && (robotcode[idy][11].substr(0,1) != "(")) {
              lineangle = parseInt(robotcode[idy][11]) + 90;
              if((robotcode[idy][1].substr(0,1) === "2") || (robotcode[idy][1].substr(0,1) === "4")) {
                 dr = 360 - lineangle;
              }
           } else {
                lineangle = 0;
           }
           if(lineangle === 0) {
              lx = 0 + x1sv;
              ly = linelength + y1sv;
           } else {
             lx = parseInt(linelength*Math.cos((lineangle)*(Math.PI/180))) + x1sv;
             ly = parseInt(linelength*Math.sin((lineangle)*(Math.PI/180))) + y1sv;
           }
       } else {
           lx = lineendx;
           ly = lineendy;
       }

//     線の角度によるlx(cos)とly(sin)で計算する。

//     線の開始座標
       xx = x1sv;
       yy = y1sv;
//     線の終点座標
       x1 = lx;
       y1 = ly;
//     カラーナンバーをワークに編集する。
        wkcolor = parseInt(robotcode[idy][8]);

        ctx.beginPath();
        ctx.lineWidth = linewidth*mgf;
        ctx.moveTo(xx*mgf+dfsx,yy*mgf+dfsy);
        ctx.lineTo(x1*mgf+dfsx,y1*mgf+dfsy);

//      カラーテーブル(配列)からカラーナンバーのレコードを編集する。
        ctx.strokeStyle = bordcolor[ocolno][wkcolor];
//      線を描画する。
        ctx.stroke();

}


function circle_draw(){

        shapetype = robotcode[idy][4];

        cradius   = parseInt(robotcode[idy][12]);
//     描画位置(x座標)を接合点テーブルより取得。
       if(robotcode[idy][9].substr(0,1) === "S") {
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === robotcode[idy][9]){
                  midpointx = jointbl[i].realadx;
                  break;
              }
           }
       } else {
           midpointx = parseInt(robotcode[idy][9]);
       }

//     描画位置(y座標)を接合点テーブルより取得。
       if(robotcode[idy][10].substr(0,1) === "S") {
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === robotcode[idy][10]){
                  midpointy = jointbl[i].realady;
                  break;
              }
           }
       } else {
           midpointy = parseInt(robotcode[idy][10]);
       }

//     カラーナンバーをワークに編集する。
        wkcolor = parseInt(robotcode[idy][8]);

        ctx.beginPath();
        ctx.fillStyle = bordcolor[ocolno][wkcolor];
        ctx.arc(midpointx*mgf+dfsx,midpointy*mgf+dfsy,cradius*mgf,0,Math.PI*2,false);
//      中心座標を指定(円)
        ctx.fill();


}
function polygon_draw(){

        shapetype = robotcode[idy][4];
        polygonno = parseInt(robotcode[idy][5])-1;
//      接合点テーブルから中点の座標xの取得
       if(robotcode[idy][9].substr(0,1) === "S") {
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === robotcode[idy][9]){
                  midpointx = jointbl[i].realadx;
                  break;
              }
           }
       } else {
           midpointx = parseInt(robotcode[idy][9]);
       }

//      接合点テーブルから中点の座標yの取得
       if(robotcode[idy][10].substr(0,1) === "S") {
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === robotcode[idy][10]){
                  midpointy = jointbl[i].realady;
                  break;
              }
           }
       } else {
           midpointy = parseInt(robotcode[idy][10]);
       }

        polysax = 0; polysay = 0;
        if(robotcode[idy][11].substr(0,1) === "(") {
           polysax = parseInt(robotcode[idy][11].substr(1,4));
           polysay = parseInt(robotcode[idy][11].substr(6,4));
        } else {
           if((robotcode[idy][11].substr(0,1) != "△") && (robotcode[idy][11].substr(0,1) != "(")) {
              dr = parseInt(robotcode[idy][11]);
              if((robotcode[idy][1].substr(0,1) === "2") || (robotcode[idy][1].substr(0,1) === "4")) {
                 dr = 360 - dr;
              }
           } else {
                dr = 0;
           }

        }
        y1sv = 0; x1sv =0;

//      差異が0でない場合は、中点に差異を加味する。
        if(polysay != 0) y1sv = midpointy + polysay;
        if(polysax != 0) x1sv = midpointx + polysax;
//      角度が設定されているなら回転させる。
        if(dr != 0) {
            vBase1_c = Math.cos(ANGLE*(Math.PI/180));
            vBase1_s = Math.sin(ANGLE*(Math.PI/180));
        }

        fsw = 1;
        for(j=0;j<bw;j++){
            if(polygonzh[polygonno][j].flag === 1){
                if(dr !=0){
                  xx = polygonzh[polygonno][j].polyx+x1sv - midpointx;
                  yy = polygonzh[polygonno][j].polyy+y1sv - midpointy;
                  px =  parseInt(xx * vBase1_c - yy * vBase1_s)+midpointx;
                  py =  parseInt(xx * vBase1_s + yy * vBase1_c)+midpointy;
                } else {
                  px = polygonzh[polygonno][j].polyx+x1sv;
                  py = polygonzh[polygonno][j].polyy+y1sv;
                }
                  if(fsw === 1){
                       //     カラーナンバーをワークに編集する。
                       wkcolor = parseInt(robotcode[idy][8]);
                       ctx.beginPath();
                       ctx.moveTo(px*mgf+dfsx,py*mgf+dfsy);
                       fsw = 0;
                  } else { 
                       ctx.lineTo(px*mgf+dfsx,py*mgf+dfsy);
                  }
              }
         }
         if(fsw === 0){
             ctx.closePath();
             ctx.fillStyle = bordcolor[ocolno][wkcolor];
             ctx.fill();
         }

 


}
//接合点からの多角形の描画(差異の計算なし)
function polygon2_draw(){

        shapetype = robotcode[idy][4];
        polygonno = parseInt(robotcode[idy][5])-1;
//      接合点テーブルから中点の座標xの取得
       if(robotcode[idy][9].substr(0,1) === "S") {
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === robotcode[idy][9]){
                  midpointx = jointbl[i].realadx;
                  break;
              }
           }
       } else {
           midpointx = parseInt(robotcode[idy][9]);
       }

//      接合点テーブルから中点の座標yの取得
       if(robotcode[idy][10].substr(0,1) === "S") {
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === robotcode[idy][10]){
                  midpointy = jointbl[i].realady;
                  break;
              }
           }
       } else {
           midpointy = parseInt(robotcode[idy][10]);
       }


        fsw = 1;
        for(j=0;j<bw;j++){
            if(polygonzh[polygonno][j].flag === 1){
                  px = polygonzh[polygonno][j].polyx + midpointx;
                  py = polygonzh[polygonno][j].polyy + midpointy;
                  if(fsw === 1){
                       //     カラーナンバーをワークに編集する。
                       wkcolor = parseInt(robotcode[idy][8]);
                       ctx.beginPath();
                       ctx.moveTo(px*mgf+dfsx,py*mgf+dfsy);
                       fsw = 0;
                  } else { 
                       ctx.lineTo(px*mgf+dfsx,py*mgf+dfsy);
                  }
              }
         }
         if(fsw === 0){
             ctx.closePath();
             ctx.fillStyle = bordcolor[ocolno][wkcolor];
             ctx.fill();
         }

 


}

//
//逆台形(接合点(始点、終点)描画
//
function invtrapezoid3_draw(){

        shapetype = robotcode[idy][4];
//      接合点(始点)の座標を取得する。
        invstratx = 0; invstarty = 0;
    if(robotcode[idy][6] != "00"){
          invstart = "S" + robotcode[idy][6];
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === invstart){
                  invstartx = jointbl[i].realadx;
                  invstarty = jointbl[i].realady;
                  break;
              }
           }
        }
//      接合点(終点)の座標を取得する。
        invendx = 0; invendy = 0;
    if(robotcode[idy][7] != "00"){
          invend = "S" + robotcode[idy][7];
           for(i=0; i<joinsumax; i++){
              if(jointbl[i].kinds === invend){
                  invendx = jointbl[i].realadx;
                  invendy = jointbl[i].realady;
                  break;
              }
           }
       }

 

 

        inradius = parseInt(robotcode[idy][12]);
        inmdr = parseInt(robotcode[idy][13]);
        inlong = parseInt(robotcode[idy][15]);
//      角度を算出(右は、(360度)反転させる)
        dr = parseInt(robotcode[idy][11]);
        if((robotcode[idy][1].substr(0,1) === "2") || (robotcode[idy][1].substr(0,1) === "4")){
              dr = 360 - dr;
        }
//      始点、終点から両端の座標を算出する。
        yp = Math.sin(dr*(Math.PI/180));
        xp = Math.cos(dr*(Math.PI/180));
        yp1 = Math.sin((dr+180)*(Math.PI/180));
        xp1 = Math.cos((dr+180)*(Math.PI/180));

        sy = (inradius*yp1+invstarty);
        sx = (inradius*xp1+invstartx);
        sy1 = (inradius*yp+invstarty);
        sx1 = (inradius*xp+invstartx);

        y1 = (inmdr*yp1+invendy);
        x1 = (inmdr*xp1+invendx);
        y2 = (inmdr*yp+invendy);
        x2 = (inmdr*xp+invendx);


//     カラーナンバーをワークに編集する。
        wkcolor = parseInt(robotcode[idy][8]);
        ctx.beginPath();
        ctx.moveTo(sx*mgf+dfsx,sy*mgf+dfsy);
        ctx.lineTo(sx1*mgf+dfsx,sy1*mgf+dfsy);
        ctx.lineTo(x2*mgf+dfsx,y2*mgf+dfsy);
        ctx.lineTo(x1*mgf+dfsx,y1*mgf+dfsy);

//全て座標を指定 逆多角形

        ctx.closePath();
        ctx.fillStyle = bordcolor[ocolno][wkcolor];
        ctx.fill();

        wcol = bordcolor[ocolno+1][wkcolor];


//     影の描画(色の数値を減らして影をつける)
        s1col = parseInt(wcol.substr(1,2),16);
        s2col = parseInt(wcol.substr(3,2),16);
        s3col = parseInt(wcol.substr(5,2),16);

        for(i=5;i > 0; i--){

          so1col = s1col - i*5;
          so2col = s2col - i*5;
          so3col = s3col - i*5;
          wkcolor = "rgb(" + so1col + "," + so2col + "," + so3col + ")";


          sax = 5 - i; say = 0;
          ctx.beginPath();
          ctx.lineWidth = 1*mgf;
          ctx.moveTo(sx*mgf+dfsx+sax,sy*mgf+dfsy+say);
          ctx.lineTo(x1*mgf+dfsx+sax,y1*mgf+dfsy-say);
//全て座標を指定(腕下・影)

          ctx.strokeStyle = wkcolor;
          ctx.stroke();
        }


}

function join_draw(){

       for(i = 0; i          ccenterx = jointbl[i].realadx;
          ccentery = jointbl[i].realady;
          cradius  = jointbl[i].radius;

          ctx.beginPath();
          ctx.fillStyle = bordcolor[ocolno][jointbl[i].colorno];
          ctx.arc(ccenterx*mgf+dfsx,ccentery*mgf+dfsy,cradius*mgf,0,Math.PI*2,false);
//        中心座標を指定(接合点)
          ctx.fill();
       }
}


function etc_syori(){

//    element = document.getElementById("idresult");
//    displayarea = " polayarea=" + polytext[0].substr(1,3);
//    element.innerHTML = displayarea;


}


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« テーブルデータからロボット... | トップ | テーブルデータからロボット... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

ゲーム開発(Game development)」カテゴリの最新記事