エレ玩 Konyaの開発記録

アクセスカウンタ

zoom RSS EGP01キット プログラミング講座(キャラを動かす編)

<<   作成日時 : 2011/01/16 23:17   >>

面白い ブログ気持玉 6 / トラックバック 0 / コメント 0

EGP01キット用のプログラミング講座です。
前回はグラフィックエディタでキャラを描画し、液晶に表示しました。
今回はその続き、キャラのアニメーションと移動です。前回講座を確認のうえ、本講座をお読みください。


1.キャラデータの作成

まずはグラフィックエディタで下記@Aを描画します。
グラフィックエディタの使い方は前回講座の「2.キャラデータの製作」を参照してください。

描くのがメンドイと言う方はこちらからセーブデータ(SpMario.pgd)をダウンロードし、グラフィックエディタで開いてください。

@Mario
下図、12パターンを描画します。
0〜11の数字はパターン番号を示しています。(プログラムの解説で使用)

(画面クリックで拡大)
画像

"キャラクタ設定"は以下に設定。
 ネーム    :Mario
 サイズX   :16
     Y   :16
 パターン数 :12
 データ出力 :チェック


ABlock
グラフィックエディタ下部"ページ(キャラクタ)切替"の[2]をクリックしページ2に切替、下図2パターンを描画します。

(画面クリックで拡大)
画像

"キャラクタ設定"は以下に設定。
 ネーム    :Block
 サイズX   :16
     Y   :16
 パターン数 : 2
 データ出力 :チェック


@Aを描画したら、セーブします。セーブ名はなんでも良いのですが、とりあえず"SpMario.pgd"としておきます。
次にPIC用のキャラデータをファイル名"ChrData.inc"で出力します。

描くのも、出力するのもメンドイという方はこちらからファイル(ChrData.inc)をダウンロードしてください。

2.プログラム作成

キャラを右に動かすだけの簡単なプログラムを作成します。

プログラムの流れは以下となります。

 〜 変数定義・初期設定 〜
 (1)キャラ用ステータス変数の定義
 (2)キャラデータの格納アドレス取得
 〜 メインループ 〜
 (3)PIC内VRAMのクリア
 (4)PIC内VRAMへのblock描画
 (5)Mario移動・描画
  @Mario表示位置 X座標+1(右に移動)
  Aアニメーションのためのパターン選択
  BPIC内VRAMへのMario描画
 (6)PIC内VRAM情報を液晶へ一括転送
 (7)速度調整用のウェイト
 (8)(3)へ


上記(1)〜(7)の処理を解説していきます。

(1)キャラ用ステータス変数の定義
 キャラのステータス記録用に以下の変数を定義します。

  St     :キャラの状態を示す。(各キャラによって値と状態の関係が異なる)
  Dir    :キャラの進行方向(向き)を示す。 0:上 2:右 4:下 6:左
  X     :キャラの位置(X座標)を示す。
  Y     :キャラの位置(Y座標)を示す。
  DrwPtn  :表示用のパターン番号
  AniCnt  :アニメ表示用のカウンタ


<ソースコード>
*)以下のソースコードは全角スペースでカラムを揃えています。
  そのため、そのままソースコードとして貼りつけることはできません。(全角スペースでエラーが発生)
  ソースコードは、こちらEGP01.cをダウンロードしてください。

//(1)キャラ用ステータスの定義
   struct ChrST0
   {
     char St;    // 状態(各キャラによって値と状態の関係が異なる)
     char Dir;    // 進行方向(向き) 0:上 2:右 4:下 6:左
     char X;     // 位置 X座標
     char Y;     // 位置 Y座標
     char DrwPtn; // 表示パターン番号
     char AniCnt; // アニメ用カウンタ
   };
      // St,Dir, X, Y,Ptn,Ani,
   struct  ChrST0 P1 ={ 0, 2, 0, 96, 0, 0,}; // P1(Player1)定義&ステータス初期化

(2)キャラデータの格納アドレス取得
  キャラデータ"Mario","Block"の格納先頭アドレスを取得、変数に格納しておきます。

  Mario_tp : キャラデータ Marioの格納tblpageアドレスの格納用
  Mario_to : キャラデータ Marioの格納tbloffsetアドレスの格納用
  Block_tp : キャラデータ Blockの格納tblpageアドレスの格納用
  Block_to : キャラデータ Blockの格納tbloffsetアドレスの格納用

<ソースコード>
//(2)ChrData 格納アドレス(TBLPAG,OffSet)取得
 //Mario
  asm("MOV #tblpage(_Mario),w0");
  Mario_tp = (unsigned char)WREG0;
  asm("MOV #tbloffset(_Mario),w0");
  Mario_to = WREG0;
 //Block
  asm("MOV #tblpage(_Block),w0");
  Block_tp = (unsigned char)WREG0;
  asm("MOV #tbloffset(_Block),w0");
  Block_to = WREG0;

(3)PIC内VRAMのクリア
  関数"VR_AllClr"でPIC内VRAMをオールクリアします。

  VR_AllClr(int ColPal)
   引数:ColPal = 4dot分のカラーパレット番号(0〜15)を16bitで指定
             bit15-12:dot3 , bit11-8: dot2, bit7-4:dot1 bit3-0:dot0
   戻値:なし

<ソースコード>
 //(3)PIC内VRAMをオールクリア
  VR_AllClr(0x1111);  //dot0-3をパレット番号"1"でクリア

上記ソースコードではパレット番号1に青色が設定してあるため、青色でクリアします。
<画面イメージ>
画像


(4)PIC内VRAMへのblock描画
  画面下部に床を描画します。
  Y座標=112、X座標=0,16,32,48,64,80,96,112の8箇所にBlock(パターン番号0)を配置。
  描画には関数"VR_ChrSclDraw"を使用します。

  VR_ChrSclDraw(int X,int Y, unsigned int tbloffset, int DrwPtn)
   引数: X=表示座標X
       Y=表示座標Y
       tbloffset=キャラデータ格納tbloffsetアドレス
       DrwPtn = パターン番号
   戻値:なし


<ソースコード>
//(4)PIC内VRAMへのblock描画
  TBLPAG = Block_tp;  //Blockデータ格納TBLPAGアドレスを設定
  for(i=0; i<128; i+=16)
  {
    VR_ChrSclDraw(i, 112, Block_to, 0);  //座標(i,112)にBlockパターン0を描画
  }

<画面イメージ>
画像


(5)Mario移動・描画
  @Mario表示位置 X座標+1(右に移動)
  ループ毎にP1.XをインクリメントしMarioを右に動かします。
  P1.Xが128を超えると画面から消え、255を超えると0に戻り左から現れます。

<ソースコード>
//(5)Mario移動・描画
//@Mario表示 X座標+1(右に移動)

  P1.X ++;

  Aアニメーションのためのパターン選択

  P1.AniCntの値で表示パターンを変え、アニメーション表示させます。
  パターン番号1→2→1→3の順で表示することで走っているように見せることができます。
  P1.AniCntは0からインクリメントしていき、16で0に戻ります。
  パターン選択
   P1.AniCnt = 0〜 3 :パターン番号1
          = 4〜 7 :パターン番号2
          = 8〜11:パターン番号1
          =12〜15 :パターン番号3

画像


<ソースコード>
//Aアニメーションのためのパターン選択
  if (P1.AniCnt <4)
  {
    P1.DrwPtn = 1;
  }
  else if (P1.AniCnt <8)
  {
    P1.DrwPtn = 2;
  }
  else if (P1.AniCnt <12)
  {
    P1.DrwPtn = 1;
  }
  else
  {
    P1.DrwPtn = 3;
  }

//AniCnt更新
  if (P1.AniCnt == 16)
  {
    P1.AniCnt = 0;
  }
  else
  {
    P1.AniCnt++;
  }

  BPIC内VRAMへのMario描画

  描画には関数"VR_ChrSclDraw"を使用します。"VR_ChrSclDraw"は(4)解説を参照。

<ソースコード>
//BPIC内VRAMへのMario描画
  TBLPAG = Mario_tp;                    //Marioデータ格納TBLPAGアドレスを設定
  VR_ChrSclDraw(P1.X, P1.Y, Mario_to, P1.DrwPtn);  //座標(P0.X,P0.Y)にMario P0.DrwPtnを描画

<画面イメージ>
画像


 (6)PIC内VRAM情報を液晶へ一括転送
  PIC内VRAMの情報を液晶モジュールへ一括転送します。

  VR_LCDDraw(void)
   引数:なし
   戻値:なし


<ソースコード>
//(6)PIC内VRAM情報を液晶へ一括転送
  VR_LCDDraw();

 (7)速度調整用のウェイト
  (3)〜(7)のループ時間をウェイトで調整します。
  実際のゲームプログラムでは、タイマーを使いループ時間を一定に保つようウェイトを入れるのですが、
  今回は固定時間のウェイトを入れます。

  Wait_ms(unsigned int time)
    引数:time(ms)
    戻値:なし
  *)ウェイト時間は正確ではありません。

<ソースコード>
//(7)速度調整用のウェイト
  Wait_ms(10);  //ウェイト 10ms


3.実機動作

プログラムの動作確認を実機で行います。
以下の手順でプロジェクトファイルを作成、ビルドします。

 (1)雛形プログラムのコピー
  前回講座でダウンロードの雛形プログラム(EGP01_Template01)をフォルダーごとコピーしします。
  私の環境ではフォルダー名を"EGP01_Lesson2"にリネームし、以下のフォルダー構成に格納しています。

   C:\EGP\EGP01\EGP01_Lesson2

 (2)キャラデータのコピー
  「1.キャラデータの作成」で出力の"ChrData.inc"をフォルダ"EGP01_Lesson2"に上書きコピーします。

 (3)ソースコードのダウンロード
  EGP01.cをダウンロードし、フォルダ"EGP01_Lesson2"に上書きコピーします。

 (4)Hexファイル作成
  "EGP01.mcp"をダブルクリックしMPLABを起動、Build AllでHexファイルを作成します。

 (5)Hexファイルの実機書込み
  PICkit2、EGP01キットをPCに接続、"EGP01.hex"を書き込みます。
  詳細はEGP01スタートアップガイドの「4.2 プログラム書込み(ICSP)の確認」を参照ください。

画像


今回は、ただキャラを右に動かしただけですが、何だかワクワクしてきます。
そう思うのは私だけでしょうか?

次回はJoyStick入力でキャラを操作してみます。

以上





テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 6
面白い 面白い 面白い 面白い
なるほど(納得、参考になった、ヘー)
ナイス

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
EGP01キット プログラミング講座(キャラを動かす編) エレ玩 Konyaの開発記録/BIGLOBEウェブリブログ
文字サイズ:       閉じる