トップページ > 電子工作インデックス > シューティングゲーム > 困った!
前のページでつくった、「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文用変数などが定義できなくなります。) 次からは実際のシューティングゲーム用のハードウェアを作る作業に移っていきます。