トップページ > 電子工作インデックス > シューティングゲーム > 困った!

画面出力関数を修正する

前のページでつくった、「1ドット分をchar型配列の1要素分にあてる」…という 非常に無駄(データ量が8倍かさばる)な画面処理関数なのですが、 もしコレを実際のゲーム画面(要可変)に使用するとなると、当然H8のRAMを利用 することになります。ここで、液晶1画面の128×64=8192ドットっていうのは… 1ドットあたりchar型配列ですから1バイト使用することになるので、 ピッタリ8KBのRAM領域が必要になります。これはH8-3052の全RAM容量ですね。 …ということは、他に変数を定義することができなくなってしまいます!(爆) これではマズイので、ちゃんと1ドットあたり1ビット使用の経済的な配列の 使い方をする画像表示関数を作ることにします。 配列変換 のほうも、この関数に適したタイプのデータ(16進数出力というやつ)を出力できるように改良しておきます。


//********************************************************************

//表示用データを入れておく配列を用意。(ヨコ128ドットが8列並んでいるイメージです。)
//この配列には”配列変換”で生成した画像データや、ゲーム画面を扱う配列などを用意します。

//ちゃんと1bitを1pixelとして使用する配列なので、char型をタテに8個分…ということで。
char display_data[8][128]={};


//********************************************************************
//配列からデータを取り込んで1画面表示を行う関数 (改良版)

void array_out(void)
{
  //for文用変数。高速化のためにregister指定としました。
  register char i,j,k;

  //配列のデータを一時的に移すための変数。
  //今回は普通のchar型変数です。
  char temp;

  //チップセレクト(k=0でchip1(左)、k=1でchip2(右))
  for(k=0;k<=1;k++)
  {  
 
    //表示位置を0番地に指定。
    out(0x40,k+1,0);
    out(0xc0,k+1,0);
 

    //ページセレクト(一番上のラインから、8ビットごとに8列  = 64ドット)
    for(j=0;j<8;j++) 
    {
      out((0xb8|j),k+1,0);


      //コラムセレクト(ヨコ方向への移動。 自動ですが…)
      for(i=0;i<64;i++)
      { 
        if(i==0)
        {
           //最初のときだけ、左寄せにして位置をリセットします。
           out(0x40,k+1,0);
        }

        //1バイトまとめて転送。
        temp = display_data[j][i+64*k];
  
        //out()関数を呼び出して出力。
        out(temp.byte,k+1,1);

      }
    }
  }
}
//********************************************************************


以上で画像を出力する関数の基本は出来上がったことになります。H8の内部RAM上で扱える 画像の枚数は7枚となりました。(8枚ピッタリだとfor文用変数などが定義できなくなります。) 次からは実際のシューティングゲーム用のハードウェアを作る作業に移っていきます。




前へ   次へ