前回は画面遷移を設計して、それをベースにカードゲームを作るサイクルを紹介した(11月1日の記事参照)。
今回からは、900iシリーズならではの機能を利用して、アプリに組み入れてみよう。まずは、カメラの使い方と、その応用で撮影画像を解析してカードの画像とパラメーターを生成する処理を解説する。
Cameraクラスは、カメラ機能を呼び出して、静止画や動画を撮影する機能を持つオブジェクトを定義できる。CameraクラスにあるgetCamera(int id)でカメラIDを指定することで、カメラオブジェクトを用意することができる。カメラIDはゼロから始まるが、900iシリーズには標準で一つ以上のカメラが搭載されているので、引数にゼロを指定すると、デフォルトのカメラをスタンバイする。
static final Camera cam = Camera.getCamera(0);
|
|
前回のコードにSCENE_DECKという、カード閲覧モードとカード生成モードへのメニューが表示されるシーンを追加した。デッキ:DECKとは、カードゲームで使用するカードが組まれた束のことだ。
static final int SCENE_DECK = 2;
static final int SCENE_DECK_VIEW = 200;
static final int SCENE_DECK_CAMERA = 201;
|
|
カード閲覧シーン(SCENE_DECK_VIEW)では取り込んで作成したカードの表示を、カード生成シーン(SCENE_DECK_CAMERA)では、画像の撮影と解析を行う。
撮影画像をアプリに取り込むために、取り込む画像サイズや、カメラ操作モードの指定などが必要となる。
Camera.setImageSize(int w, int h)で、撮影画像の幅と高さを指定する。
cam.setImageSize(PICTURE_WIDTH, PICTURE_HEIGHT);
|
|
Camera.takePicture()を呼び出すと、カメラが静止画撮影モードで立ち上がり、ユーザの操作を待つ状態になる。
撮影すると、指定したカメラオブジェクトに撮影画像が格納される。撮影モードを指定せずに撮影すると、1枚だけ画像を保持する。ほかにも連射モード、ムービー撮影モードなどが用意される。撮影された画像はCamera.getImage(int index)で指定したindexの画像のMediaImageを得ることができる。
MediaImage mi = cam.getImage(0);
|
|
しかし、もしユーザがカメラ起動後にクリアキーなどで撮影をキャンセルしてしまった場合は、画像が保持されないため、この状態でgetImageを実行すると例外ArrayIndexOutOfBoundsExceptionが発生する。
そのため、Camera.getNumberOfImages()を実行して、保持画像数がゼロの場合には処理を中止するようにしておく。
if (cam.getNumberOfImages() == 0) {
//写真を撮らなかった場合の処理
break;
}
|
|
Copyright © ITmedia, Inc. All Rights Reserved.