読者です 読者をやめる 読者になる 読者になる

背筋を伸ばして深呼吸

折角なので専門知識を活かしたい

Arduboy ButtonTest

Arduboy

f:id:ant0720:20160429235414p:plain

十字キーでキャラクターを動かしたい。
ということで。まずは、キャラクターから作った。
通勤時間に、スマホで16x16pixelのドット絵を作成。

 

f:id:ant0720:20160429232719p:plain

1. リソースファイルを作成する

f:id:ant0720:20160429232817p:plain

変数には、PROGMEMをつけることで、プログラム領域に置いてくれるようだ。
アプリケーション実行のメモリ領域は、2.5KBしかないようなので、節約を意識した設計が今後必要になるのかな。

 

2. ウサギヘッダーファイルを作成する

f:id:ant0720:20160429232906p:plain

 ウサギには、下記の状態を定義している

  • TURN ・・・ 0: 左向き、1:右向き (1bit)
  • MOVE ・・・ 0: 止まっている、1:動いている (1bit)
  • ANIME ・・・ 0: アニメーションA、1:アニメーションB (1bit)

1byteは8bitなので、ON/OFFの設定だけであれば、8つの設定を一つのbyte型変数(rabbit_status)で表現できる。3bit使用しているので、5bitは余り。
bool型を使用すると、1つの設定に1byte使用されるので、1/8はメモリ節約になっているはず。
こういう節約は、心がけであって、実際にメモリが足りなくなったときに、やらなきゃいけないことがたくさんでてくるのだろうなあ。

 

3. ウサギクラスを作成する

コンストラクタ

f:id:ant0720:20160429233658p:plain


コンストラクタで、Arduboy変数を引っ張ってきているのは、ウサギクラスが自身を描画するため(drawメソッド)。

ウサギの向きを制御する

f:id:ant0720:20160429233918p:plain

アクセサメソッドには、bit演算により、フラグを取得・設定する。

ウサギの移動(位置)を制御する

f:id:ant0720:20160429233929p:plain

arduboy->everyXFrames(10)で、10フレーム毎に、移動モーションを切り替えている。

x座標を加減して移動する。

Arduboyの画面解像度は、128x64であるため、移動で端にいったら止まるよう処理する。

移動モーションを制御する

f:id:ant0720:20160429234219p:plain

移動モーションは、0, 1の2パターンしか用意していないので、アニメーションもフラグで制御している。

ウサギを描画する

f:id:ant0720:20160429234350p:plain

rabbit_imageは、ポインタ(メモリ節約)であること。

気を付ける点は、ウサギクラスでは、Arduboy変数を直接参照してはいないから、

arduboy->drawBitmap となること。
なんでもかんでも 「.」でつなげばいいわけではないようだ。

(C++言語を知らないまま書いてるから、この辺は、C++の基本的な参考書を読んでおいた方がいいよなあ)

4. ino ファイルを作成する

f:id:ant0720:20160429235237p:plain

Arduboyエミュレーターには、SimpleButtons というクラスが用意されている。
標準のライブラリにはないようなんだけれど、シミュレーター作った人が用意したものだろうか?

これで、以下の判定ができる。

  • justPressed ・・・ ボタンを押した直後か
  • pressed ・・・ ボタンが押されているか

キャラクターを動かす場合には、justPressedで向きを変えて、pressedで移動するイメージ。