理論は後からついてくる?!

12/20/2000 by Shigeyuki Seko


応用編

9) 設定条件の保存

ゲーム等で最高得点を保存したり起動の度に条件を設定するのが煩わしい場合に、アプリケーションを終了させても一部データを保存したい場合がよくあります。この場合プリファレンスを使用すると比較的簡単に実現できます。
その方法について説明します。

プログラムの先頭に以下の定義文を追加します。
これはプリフェランスを保存するPrefGetAppPreferencesV10で使用します。
(このページの最後に説明するDWord PilotMainで使用します)

#define AppType 0x5069426b /* 'PiBk' */
#define AppVersion 1

AppTypeの後ろに付いた 0x5069426b はアプリケーションのクリエーターIDのアスキーコードです。
アスキーコードとは文字を標準的なコードで表現したものです。
実際のアスキーコードについては、こちらのアスキーコード表を参照してください
Picture Book の場合、クリエーターIDは PiBk ですから

P = 0x50
i = 0x69
B = 0x42
k = 0x6b

で、それを並べて 0x5069426b となります。大文字と小文字が区別されますので注意してください。

次に保存するデータの構造体を定義します。
構造体とは簡単に言えば、データをひとまとめにして扱いやすくしたものです。

static struct {
  Int  item1;
  Int  item2;
  Int  item3;
  Int  item4;
} data;

のように定義します。ここでitem1のデータを参照したい場合、data.item1 とします。詳しくはC言語の解説書を見てください。:-)

今回は、最後に開いていたページと音のON/OFFの情報を保存する為に LastPageLastSound を定義します。StartFは最初に起動した時のみ保存するデータを初期化するためのフラグです。

static struct {
  Int  StartF;
  Int  LastPage;
  Int  LastSound;
  Int  LastData1;
  Int  LastData2;
  Int  LastData3;
  Int  LastData4;
} pass;

ここで定義した pass.LastPage や pass.LastSound をそのまま使用してもいいのですが
今回はプログラム本体にできるだけ手を加えなくてすむよう、もともと使用していたグローバル変数の Page と SoundSW に代入して使います。

void GetPassData(void)
{
  if (pass.StartF != 0x06){
    pass.StartF = 0x06;
    pass.LastPage = 0;
    pass.LastSound = ON;
    pass.LastData1 = 0;
    pass.LastData2 = 0;
    pass.LastData3 = 0;
    pass.LastData4 = 0;
  }
  Page = pass.LastPage;
  SoundSW = pass.LastSound;
}

最初のif文はインストール後、最初の起動時のみデータを初期化するためのものです。

グローバル変数に代入して使用したため、プログラム終了時には再び pass.LastPage と pass.LastSound に書き戻す必要があります。

void SetPassData(void)
{
  pass.LastPage = Page;
  pass.LastSound = SoundSW;
}

設定条件をプリフェランスから読み込むようにする訳ですから、この条件をプログラムの起動時に初期化してしまっては意味がありません。
したがって、StartApplication の中で Page と SoundSW を初期化している部分を削除します。

static void StartApplication(void)
{
  FormPtr    frm;
  FieldPtr     opPtr;
  unsigned char  data[150];
  Int       len;

  frm = FrmInitForm(1000);
  FrmSetActiveForm(frm);
  FrmDrawForm(frm);

  drawBitmap(5, 20, 7000);

  // Page=0; ←削除

  // SoundSW=ON; ←削除

  StrCopy (data,"8/23/00psnd{PHVDVDQM|Y@WKWHWBVEUIVOVMVGV@UKUBTMTJTHUKUHUCTMTGTASOSMSLSKSK}");
  len=StrLen(data);
  if (SoundDecode(data,len)){
    drawBitmap(5, 20, 7000);
  }
}

最後に一番大切なメインルーチンを修正します。
起動時にPrefGetAppPreferencesV10でプリファレンスデータを呼び出します。この時、構造体passに保存されていたデータが渡されます。
GetPassDataは前で説明したように、プログラム本体にできるだけ手を加えたくなかったので、あらかじめ使っていたグローバル変数にデータを代入しています。
SetPassDataはそのグローバル変数の値を再び書き戻しています。
PrefSetAppPreferencesV10で、プリフェランスデータに値を書き込みプログラムを終了します。
これで次回起動した場合には、ここで保存されたデータを呼び出す事ができます。

DWord PilotMain(Word cmd, Ptr cmdPBP, Word launchFlags)
{
  Err error;

  if(cmd == sysAppLaunchCmdNormalLaunch){
    PrefGetAppPreferencesV10(AppType, AppVersion, &pass, sizeof(pass));
    GetPassData();
    StartApplication();
    EventLoop();
    SetPassData();
    PrefSetAppPreferencesV10(AppType, AppVersion, &pass, sizeof(pass));
  }
  return(0);
}

さて、今回の説明に使用した Picture Book Ver.0.6 のソースコードを用意しました。
自由にダウンロードして試してみてください。

book06.zip

 次はSONYのジョグダイヤルに対応したアプリケーションの作り方です。

 




seko@jps.net