libnds のキー入力関数 (ARM9)
libnds には KEYS レジスタのラッパー関数が入ってます。
ARM9 からは Xボタンと Yボタンが見えませんが、便利な機能が追加されています。
scanKeys()
この関数を毎フレーム呼び出すことで、キー状態キャッシュを更新します。
keysHeld()
scanKeys関数が最後に呼び出された時に押されていたキーを返します。
keysDown()
scanKeysが2回呼び出される間、最初は押されていなくて、次のscanKeys呼び出しの時に押されていたキーの情報を返します。
ユーザが最初に押したボタンのみを取得することができます。
keysUp()
scanKeysが2回呼び出される間、最初は押されいて、次のscanKeys呼び出しの時に押されていないキーの情報を返します。
Key 定数
key~~関数を呼び出すと、キー情報を返しますが、次の定数とビットマスクを取って使用します。
- KEY_A
- KEY_B
- KEY_SELECT
- KEY_START
- KEY_RIGHT
- KEY_LEFT
- KEY_UP
- KEY_DOWN
- KEY_R
- KEY_L
- KEY_X
- KEY_Y
- KEY_TOUCH (タッチスクリーンが押されているかどうか)
- KEY_LID (磁気センサ付きのモニタのヒンジ)
KEYS レジスタ (ARM7, ARM9)
Register |
Address:Width |
Access |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
KEYS |
0x04000130:16 |
R |
0 |
0 |
0 |
0 |
0 |
0 |
L |
R |
down |
up |
left |
right |
start |
select |
B |
A |
KEYS_CR |
0x04000132:16 |
R/W |
Mode |
IRQ |
0 |
0 |
0 |
0 |
L |
R |
down |
up |
left |
right |
start |
select |
B |
A |
それぞれのキーは通常1を返します。
押されて、離された時に0を返します。
15~10ビットは、常に0です。(保障されてません)
これらのビットはビットマスクを取って、消すようにしてください。
コード例:
uint16 keysPressed = (~KEYS) & 0x3FF;
keysPressed の中で、 0 でないビットがどこにあったかで、押されたキーを表します。
割り込みはIRQ ビットがセットされている場合かつ、KEYS_CR レジスタの Mode でセットされた値とキーがマッチする場合に起こります。
Mode ビット:
- 0: 指定されたキーのどれかが押されている場合、割り込み発生 (OR)
- 1: 指定されたキーの全てが押されている場合、割り込み発生 (AND)
XKEYS (0x04000136:16) (ARM7 only)
15..8 |
他の用途で使う |
|
7 |
R |
ヒンジ |
6 |
R |
ペン押下 |
1 |
R |
Y |
0 |
R |
X |
Xボタン、Yボタンは他のボタンと同じように機能します。(通常 1、押されている状態から離された状態になった時 0 )
ペン押下ビットは、タッチされている間 0 になります。
ヒンジセンサは、磁石を検出して動作します。
A・B・X・Yボタンの上辺りにあります。
フタが閉じられる時に、スピーカの磁石を検出します。(スピーカに限らず、磁石ならなんでも動作するようです)
このセンサは、フタが開けられた時に割り込みを発生させます。
最終更新:2007年06月27日 23:32