「ボタン押したら」とか「何か起きたら」ではなくて、自動的にアニメーションする仕掛けも見てみます。タイマー制御ってやつですね。
サンプルソースはこちら。動かすとこういう感じです。以下の説明はソース見ながらどうぞ。
描画対象となるレイヤーは 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」 を使って、カラーとそうでない場合で描画色を替えています。
タイマーによる呼び出し動作が理解できると、リアルタイムのゲーム作れるようになりますね。