タイマーによるアニメーション

「ボタン押したら」とか「何か起きたら」ではなくて、自動的にアニメーションする仕掛けも見てみます。タイマー制御ってやつですね。

サンプルソースはこちら。動かすとこういう感じです。以下の説明はソース見ながらどうぞ。

描画対象となるレイヤーは s_square_layerです。このレイヤーの更新関数を

layer_set_update_proc(s_square_layer, update_square_layer);

で登録してます。

画面の更新は、レイヤーをDirtyにマークすることで行われます。Dirtyにマークしているのは

static void timer_callback(void *context) {
  layer_mark_dirty(s_square_layer);
  app_timer_register(TIMER_INTERVAL_MS, timer_callback, NULL);
}

ここですね。そして、最初に、このコールバックを呼び出してるのは、init() の

app_timer_register(TIMER_INTERVAL_MS, timer_callback, NULL);

これです。初に呼び出された後は、timer_callback内で「自分自身の呼び出し」を登録することで、起動してからプログラムが終了するまで、TIMER_INTERVAL_MS のインターバルで、永遠に呼び出しが繰り返されるわけです。

タイマー登録のapp_timer_register の引数はこうなっています。

AppTimer * app_timer_register(uint32_t timeout_ms, AppTimerCallback callback, void * callback_data)

これを登録すると、「timeout_ms ミリセカンド後」に、callback 関数が、callback_dataの引数で呼び出されます。(今回は引数無しなのでNULL指定されてます。)

このプログラムでは、TIMER_INTERVAL_MSは50msに設定されています。

#define TIMER_INTERVAL_MS 50

50msごとに、画面描画 update_square_layer が呼び出されるのですね。
1000ms / 50ms = 20回 なので1秒間に20回書き換え、つまり20fpsということです。

呼び出され先の「update_square_layer」 の描画ロジックは、呼ばれるごとに 5度ずつ図形を回転させて描画しているだけですね。「#ifdef PBL_COLOR」 を使って、カラーとそうでない場合で描画色を替えています。

タイマーによる呼び出し動作が理解できると、リアルタイムのゲーム作れるようになりますね。