◇P/ECEで C言語 【スプライトを使う(プログラム)】

まずソースを書いて,それから詳細説明を行ないます。
短いですが,P/ECE専用関数の羅列で,最初は意味不明です。

◎ソース

#include <stdlib.h>
#include <string.h>

#include <piece.h>
#include <pclsprite.h>

extern int testcg[];

unsigned char dummy[128 * 88];

int sprwork[pclSpriteWork(1)];
unsigned char direct[128 * 88 / 4];

void pceAppInit(void){
  pclSpriteInit(testcg, sprwork, sizeof(sprwork));
  pclSpriteDispMode(4);

  pceLCDDispStop();
  pceLCDSetBuffer(dummy);
  pceLCDDispStart();

  pceAppSetProcPeriod(1000);
}

void pceAppProc(int cnt){
  pclSpriteSetCharacter(1, 10, 20, 1);
  pclSpriteMakeFrame(direct);
  pceLCDTransDirect(direct);
}

void pceAppExit(void){
}

◎解説

#include <stdlib.h>
#include <string.h>
#include <piece.h>
この3行は,通常の P/ECEアプリ用ヘッダです。

#include <pclsprite.h>
スプライトを使用する際には,更にこのヘッダが必要になります。

extern int testcg[];
先程作成した画像のファイル名です。
ちなみに,ここでは testcg.cのみを使用します。

unsigned char dummy[128 * 88];
実は使わないけれど,画面用バッファは必要です。
※これがもったいないと思う人へ
実はシステム用に用意されたワークを使う事も可能らしいです。
extern unsigned char _def_vbuff[DISP_X * DISP_Y];
[P/ECEオフィシャル掲示板より]
int sprwork[pclSpriteWork(1)];
スプライト用メモリの確保。
数値部分に定義するスプライト数を記述します。
注意ですが,スプライト表示数では無く,定義するスプライトのパターン数です。
例えば,ここでは1つのパターンを定義しました。これを画面上に100コ表示する事も可能です。

unsigned char direct[128 * 88 / 4];
スプライト用画面ワーク。
通常 APIを使用した画面用バッファと同等のものです。

void pceAppInit(void){
ここから処理が始まるのでしたね。

pclSpriteInit(testcg, sprwork, sizeof(sprwork));
スプライトパターンの初期化。
引数の変数名を見れば分かると思いますが,パターンデータをスプライト用メモリにセットしています。
つまり,この関数で,スプライトのパターンデータを変更する事ができます。

pclSpriteDispMode(4);
スプライト表示モードの設定。
4は,背景無しの純粋なスプライト表示のみのモードです。
実は P/ECEには画面上にドットが増えると表示が薄くなると言う欠陥があります。
ですから,画面全体にスプライトを配置する背景を表示すると具合が悪いです。

pceLCDDispStop();
pceLCDSetBuffer(dummy);
pceLCDDispStart();
サンプルを見ると,いちおう通常 API用の画面も作らなければならにようです。
意味の無い処理ですので,ワーク領域の変数名をダミーにしてみました。

pceAppSetProcPeriod(1000);
これは,1秒に1回 pceAppProcを呼び出すと言う意味ですね。

void pceAppProc(int cnt){
この関数は,pceAppSetProcPeriod関数で設定した時間毎に呼び出されるのでしたね。

pclSpriteSetCharacter(1, 10, 20, 1);
スプライトをセットします。
先頭から,パターンデータ番号,X座標,Y座標,表示番号です。
パターンデータ番号は,pclSpriteWork関数で定義した個数だけあります。
実は,それ以上の数値を指定してもゴミを表示して動いたりします(^^;
表示番号は,重複しない数値です。どうやらこの番号でスプライトを識別しているようです。
ここにを2にして,もう一行追加すると,2コ表示されます。
上限はマニュアルを見る限り 16383ですが,そこまで表示できるかは不明です。

pclSpriteMakeFrame(direct);
スプライトセット後は,必ずこの関数を呼び出す必要があります。

pceLCDTransDirect(direct);
画面表示関数です。
この関数は pceLCDTransの代わりとなるものです。

void pceAppExit(void){
プログラム終了時に呼び出される関数ですね。
スプライトには終了時処理は必要ありません。


トップメニュー開発言語メニューP/ECE