前回に引き続き、今回はWorldクラス最後の解説として、PictureBoxから派生させてコントロールとなったWorldクラスの描画処理とアバター機能追加の為に新作した"AvatarController"ダイアログをやろうと思ったのですが、最後の最後で「文字数オーバーエラー」が出てしまいました。(エディターの「文字数:」はまだ16,140だったのですが...)
取り敢えず、PictureBoxから派生させてコントロールとなったWorldクラスの描画処理のみをやります。
【Worldクラス後半-その1】
///////////////////
//描画関係メソッド
///////////////////
//画面消去
public void Clear()
{
gHandle.Clear(this.BackColor); //解説:これは仮想画面Canvas(ビットマップ)の描画用ハンドルです。
}
//背景(Map)を表示する //解説:Mapは文字ベースのオリジナル地形図です。
public void ShowMap()
{
bool changed = false; //WorldのMapと論理マップ(PrevMap)との差異フラグ
for(int j = 0; j < Wld_Height; j++) //Y座標
{
for(int i = 0; i < Wld_Width; i++) //X座標
{
//ビットマップ表示
int n = Check_What(i, j); //(i, j)の位置に何があるか
if(PrevMap[Wld_Width * j + i] != n) //前回から変更があれば
{
PrevMap[Wld_Width * j + i] = n; //記録して
changed = true; //差異フラグを立てる
}
Cell c; //Cell(解説:セルがいた場合の情報収集用)
switch(n)
{
case 0: //野原
case 1: //山
case 2: //河川
case 3: //食物
if(changed) //前回から変更があれば(解説:正確には「あった場合のみ」
gHandle.DrawImage(Terrain_Bmp[n], i * 16, j * 16); //解説:nに応じた「地形ビットマップ配列」を表示
break;
default:
if(n > 3) //Cell(4 + ID)の場合
{
c = Get_Cell(i, j); //(i, j)の位置あるCellを取得
if(c.ID == MyID && c.Alive) //アバターの場合
gHandle.DrawImage(Cell_Bmp[Max_Tribe], i * 16, j * 16); //解説:アバタービットマップを表示
else //アバターではない場合
gHandle.DrawImage(Cell_Bmp[c.Tribe], i * 16, j * 16); //解説:死亡セルはTribeが"3"となり、ここで表示
}
else if(n == -1)
MessageBox.Show("地形ファイル(*.trn)に許容されない文字が含まれています。",
"エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
break;
}
}
if(changed) //変化が一つでもあれば、World(描画領域)を更新
this.Image = (Image)Canvas; //解説:Worldクラスインスタンスのコントロールの背景画面となる
}
}
}
次回にAvatarControllerダイアログをすべてカバーできるとよいのですが...(心配)