ジャイロセンサーを利用した android 用ゲームアプリケーション...

26
1 ジャイロセンサーを利用した Android 用ゲームアプリケーション Rolling Game 2015 01 23 花川ゼミ 5111157 西平和也 5111160 西脇純

Upload: others

Post on 24-Oct-2019

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

1

ジャイロセンサーを利用した

Android 用ゲームアプリケーション

Rolling Game

2015 年 01 月 23 日

花川ゼミ

5111157 西平和也

5111160 西脇純

Page 2: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

2

目次

第1章 はじめに....................................................................................................... 4

第2章 関連研究....................................................................................................... 5

第1節 Android......................................................................................... 5

第1項 Android とは................................................................................. 5

第2項 システム構成................................................................................. 5

第2節 ジャイロセンサー.......................................................................... 6

第1項 ジャイロセンサーとは................................................................... 6

第2項 振動型ジャイロセンサーの仕組み................................................. 6

第3章 Android アプリケーション開発環境............................................................ 8

第1節 Java ............................................................................................... 8

第2節 JDK(Java Development Kit).................................................... 8

第3節 Android 開発における Eclipse....................................................... 8

第1項 Eclipse............................................................................................ 8

第2項 ADT(Android Development Tools)........................................... 9

第4節 Android SDK(Android Software Development Kit)............... 9

第4章 作成物の紹介................................................................................................ 10

第1節 Rolling の概要................................................................................ 10

第1項 キャラクタの操作について............................................................. 10

第2項 表示画面の内容について................................................................ 10

第3項 障害物について.............................................................................. 11

第2節 システムの全体像.......................................................................... 11

第3節 ジャイロセンサーの利用............................................................... 12

第4節 クラスの詳細................................................................................. 13

第1項 Rolling クラス............................................................................... 13

第2項 RollingView クラス....................................................................... 13

(1) クラス定義.......................................................................... 13

(2) フィールド定義................................................................... 13

(3) メソッド定義....................................................................... 14

第3項 RollingBoard クラス..................................................................... 16

(1) クラス概要とフィールド変数定義...................................... 16

(2) メソッド定義....................................................................... 17

第4項 Piece クラス.................................................................................. 19

第5項 Ball クラス.................................................................................... 19

第5章 Android アプリケーションにおけるオーバーライド.................................. 21

Page 3: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

3

第1節 オーバーライド..................................................................................... 21

第1項 オーバーライドとは...................................................................... 21

第2項 Override の記述............................................................................ 22

第2節 Activity クラス..................................................................................... 22

第3節 「Rolling」における Override............................................................. 22

第4節 SurfaceView クラス「RollingView」における Override.................... 23

第6章 まとめ.......................................................................................................... 25

参考文献.............................................................................................................. 26

謝辞..................................................................................................................... 26

Page 4: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

4

第1章 はじめに

近年、スマートフォンやタブレット端末などの携帯端末の普及により本体に内蔵され

ている各種センサーの技術が進歩してきた。センサーを使うと物理量・磁気・圧力・温

度・照度などの情報を収集することができ、この技術のことをセンシング技術という。

高精度なセンシング技術は様々な機能を我々にもたらしてきた。画面はタッチセンサー

により指先による感覚的な操作が可能になり、地図は磁気・加速度・角速度センサーに

より自分がどこにいるのか、どの方角を向いているのかが正確に分かり、他にもセンサ

ーにより操作が快適になっている部分が大きい。2014 年第 3 四半期(7~9 月)におけ

る世界スマートフォン市場についての OS 別のシェア調査結果の中でセンサー技術を

利用している OS は、Android(83.6%)、iOS(12.3%)、Microsoft(3.3%)、BlackBerry

(0.7%)と詳細不明のその他の 0.1%以外全てで、スマートフォンは 100%センサーが

搭載されていると言っていいだろう[1]。最新の携帯端末として、ウェアラブル端末と

呼ばれる身に付ける時計型・眼鏡型のものが存在し、こういった機器にも当然センサー

が搭載され機能として利用されている。

多様にあるセンサーだが、その中でも角速度センサー通称ジャイロセンサーはスマー

トフォンを利用する上で、ジャイロセンサー関連のアプリケーションを取得することに

よりタッチパネルの代わりになる UI(ユーザーインターフェイス)として利用できる。

ジャイロセンサーを搭載したリモコンを動かすことで画面操作を行うものなどある。セ

ンサーを利用したアプリケーションの中でゲームの占める割合が大きく、そのゲーム内

の役割としてジャイロセンサーは操作や予備機能に使われている。ウェアラブル端末に

関しても、小型化・機能性が求められる中でジャイロセンサーを使う操作というものは

重視されていくだろう。

今回、Android スマートフォンに搭載されるジャイロセンサーを利用したゲームアプ

リケーションを製作した。多様な OS・センサーから Android・ジャイロセンサーを取

り扱う理由として、Android のシェアが高い、携帯端末の発展にジャイロセンサーは欠

かせないとしたからである。ジャイロセンサー利用の Android アプリケーション製作

を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

現在のアプリケーションで必要不可欠なジャイロセンサーを利用した Android アプリ

ケーションの開発の容易性について、プログラムを作成しながら検証する。また、この

Android アプリケーションに使われるオーバーライドの意味、このプログラムでの役割

について考察する。

以降、第2章では Android やジャイロセンサーに関する関連研究について述べ、第

3章では Android アプリの開発環境について紹介し、第4章では作成物の説明、第5

章では追加した機能の説明、第6章でまとめを述べる。

Page 5: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

5

第2章 関連研究

第1節 Android

本論では、スマートフォンアプリを作成するにあたり Android OS のスマートフ

ォンを利用するため、Android についての説明を行う。

第1項 Android とは

Android とは、幅広い携帯端末に搭載されている Google が開発した OS

(Operating System)のことである。OS とは、ハードウェアの違いによる

環境の差異を無くし、アプリケーションに対して各種資源(メモリ、画面、タ

ッチパネルなど)を提供し、そのプロセスを管理するためのソフトウェアの集

合体のことである。開発は Google であるが、公開は「Open Handset Alliance

(OHA)」という団体を中心に行っている[2]。OHA とは、Google を中心に

世界中の携帯端末メーカーが集い作られた団体である。携帯端末の共通ソフト

ウェア基盤の開発と普及の推進を目的に組織されており、その共通プラットフ

ォームとして作られたのが Android である。

Android の特徴としてオープンソースであることが挙げられる。オープンソ

ースということは、無償で環境構築が可能で規約内であれば誰でも自由にソー

スを利用できるため、多くのメーカーが自社製品に搭載しやすい環境にある。

そのためスマートフォンやタブレットの他に今後はテレビなどの電化製品に

も搭載される予定もある

第2項 システム構成

図1にあるように、Android のシステム構成はベースに Linux カーネルが

あり、各種ライブラリが用意され、その上に仮想マシン「Dalvik」、アプリケ

ーション・フレームワークが構築されている。Android のアプリは仮想マシン

「Dalvik」とアプリケーション・フレームワークの上で実行される。つまり、

アプリがネイティブなシステムの上でなく仮想マシン上で実行される。

構成からわかるようにアプリは仮想マシン上で動いているため、アプリのコ

アプリケーション・ソフトウェア

アプリケーション・フレームワーク

ネイティブライブラリ

Linux OS

ハードウェア

仮想マシン Dalvik

図 1 Android OS のシステム構成

Page 6: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

6

ードは Linux カーネルが使う C 言語、C++ではなく、仮想マシン「Dalvik」

が理解する言語で記述されている。「Dalvik」は Java 互換の仮想マシンであ

るため、Java で書かれたアプリ実行コードを解釈してネイティブコード化し

処理を行うことでアプリが実行される。このようにアプリ実行に仮想マシンを

介しているために、仮想マシンが動けば CPU や各種ハードウェア構成の違い

があってもアプリの動作が出来る。また、ネイティブなシステムに直接アクセ

スすることが出来なくなっており、アプリのプログラムと切り離されているの

でアプリの異常があってもシステムに影響を与えることはない[3]。

第2節 ジャイロセンサー

第1項 ジャイロセンサーとは

ジャイロセンサー(角速度センサー)とは、回転角速度の測定を実現する慣

性センサーの一種である。角速度とは、物体が回転軸と呼ばれる直線のまわり

を回転する速さを単位時間当たりの回転角で表す物理量である。

慣性センサーの中で代表的なものとして加速度センサーが広く普及してい

るが、ジャイロセンサーは加速度センサーでは反応しない回転の動きを測定す

る。近年では、ジャイロセンサーは電子機器に一般的に搭載されており、例え

ばスマートフォンやゲーム機器(手持ち機器の UI として利用)、デジタルカ

メラ(手ブレ補正用のブレ検知)、カーナビ(車が曲がったことを検出)など

で利用されている。

ジャイロセンサーの角速度出力は、dps(degree per second、°/秒)で表

す。1 秒間に 1 回転(360 度)している物体の場合、角速度は 360dps となる。

ジャイロセンサーに必要な検出範囲は使用する機器の用途により違う。スマー

トフォンなどの携帯端末の UI で利用する場合は 300dps~2000dps 程度、手

ブレ補正用途であれば 150dps 以下、カーナビなどの車向けの場合その間の

100dps~500dps の検出範囲に対応したジャイロセンサーが使われる。

ジャイロセンサーにはいくつか種類があるが、一般的に多く流通しているの

は振動型ジャイロセンサーである。

第2項 振動型ジャイロセンサーの仕組み

振動型ジャイロセンサーは、回転の代わりに棒やリングなどの物体を振動さ

せて物体に加わるコリオリの力から角速度を検出する。コリオリの力とは、回

転座標系上で物が移動した際に進行方向に対して直角に移動速度に比例して

働く慣性力であり、転向力ともいう。コリオリの力の大きさは、角速度ωの回

転系に速度vで動く質量mの物体には 2mωv sin θ で働く。

図 2 は、セイコーエプソンの水晶を素子とした、ダブル T 型構造の振動型

ジャイロセンサーの角速度検出の仕組みである。普段、一定方向に振動してい

る駆動アームが本体の回転運動が加わることで、駆動アームにコリオリの力が

Page 7: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

7

働き、垂直方向の振動が発生する。垂直方向の振動により固定部が屈曲し、検

出アームが運動する。二つの検出アームの運動による電位差から角速度を検出

し、電気信号として変換・検出する。

振動型ジャイロセンサーは、回転型と比べて部品の数が少ないため、信頼性

が高く小型化出来ることが特徴である。また、従来の回転型ジャイロセンサー

と同じ精度でありながら単純に安価で実現可能であるため、スマートフォン、

カメラ、カーナビなどに多く使われている。

図 2 ダブル型構造振動型ジャイロセンサーの仕組み

出典:http://www5.epsondevice.com/ja/sensing_device/gyroportal/about.html

① ②

③ ④

Page 8: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

8

第3章 Android アプリケーション開発環境

Android アプリケーション開発の大部分は Java を使って開発する。本章では、

今回使用した Java という言語の説明と開発にあたり使用した Java 開発の基本と

なる JDK、開発環境 Eclipse、開発ツール Android SDK について説明する[4]。

第1節 Java

Java とは、1990 年代前半に Sun Microsystems が開発したプログラミング言語

である。Java の特徴として、まずオブジェクト指向性を備えている点がありオブ

ジェクト指向プログラミングと呼ばれる。オブジェクト指向とは、ソフトウェアの

設計・開発で操作手順よりも操作対象を重視する考え方のことで、様々な機能を持

ったオブジェクトの組み合わせによりソフトウェアを構築する。オブジェクトはデ

ータとコードを持ち合わせており、オブジェクト同士がデータを元にメッセージを

送りあうことで機能が実行される。既存のオブジェクトを再利用することで新しい

大規模なソフトウェア開発を簡単に出来る。

次の特徴として、プラットフォームに依存していないためにハードウェアや OS

の違いに関わらず動く点がある。Java のアプリケーションが実行できないプラッ

トフォームであっても、そのプラットフォーム上に Java アプリケーションが動作

する仮想のプラットフォームを実装することで実行させることが出来る。そのため

ハードウェアや OS に依存しないで、様々な環境で動作が可能なのである。しかし、

標準のものではどのプラットフォームでも実現可能な機能しか利用できないため、

プラットフォーム特有とされるような機能を利用することは難しくなっている。

第2節 JDK(Java Development Kit)

Java の開発・実行環境の準備には、「JDK(Java Development Kit)」という開

発キットが用いられる。JDK は、Java を開発した Sun Microsystems により開発

され、現在は Oracle が配布している。Java で作成したプログラムを Java のバイ

トコードに変換するコンパイラー、アプレットのテストや実行に利用する Applet

Viewer、プログラムのバグを見つけるための Java デバッガーなどこれはコマンド

入力によるプログラム実行ツールという Java 開発の基本的なものである.

第3節 Android 開発における Eclipse

第1項 Eclipse

Eclipse は、Eclipse Foundation により開発された統合開発環境(IDE)の

ことである。ソースコードの編集に関する機能が JDK にはなくその機能の補

完として Eclipse が誕生した。

Eclipse は拡張性に優れている。基本的な必要最低限の機能しかない開発ツ

ールであるが、「プラグイン」と呼ばれる拡張プログラムを取り込むことで機

能を追加していくことが出来、あらゆる開発環境に対応できる。例えば、

Page 9: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

9

Eclipse は Java の開発を行うツールとして開発されたが、プラグインするこ

とにより C++、PHP、Perl、C#、D 言語、TeX、Python、Ruby、JavaScript、

COBOL、AspectJ、Mathematica など多様な言語に対応する。

このプラグインは様々なソフトウェアベンダーにより提供されている。

Eclipse はオープンソースであるためにそれを可能にした。Eclipse を利用す

れば低コストで独自の機能を追加した開発ツールを作り公開することが出来

る。このことで Eclipse は開発者に人気があり、早いスピードで発展してきた

のである。またマルチプラットフォーム対応であることも発展の理由に挙げ

られる。現在、Windows、Mac OS X、Linux の主要プラットフォーム、32bit

と 64bit に対応している。

第2項 ADT(Android Development Tools)

ADT(Android Development Tools)とは、Google が無償で公開している

Android 開発用の Eclipse のプラグインのことである。Eclipse は、Java や

XML の編集機能を備えたパッケージを初めから持っているため、ADT を組

み込むことで Android アプリケーション開発に必要な機能(各種ファイル管

理やアプリの生成など)を追加し、Android の開発が可能となる。

第4節 Android SDK(Android Software Development Kit)

SDK とは、「Software Development Kit」の略で、何らかの特定のソフトウェ

アを開発する際に必要なツールのセットのこと。「Android SDK」というのは、

Android アプリケーションを作るための SDK のことである。Android SDK は、

Google により無償で Windows 版、Mac OS X 版、Linux 版と主要プラットフォー

ム向けに公開されている。プログラムを開発するために必要な様々なソフトウェア

のパッケージとなっており、今回使用した Android SDK は、Android SDK

Components, JDK(Java Development Kit),Eclipse、ADT(Android

Development Tools)により構成される。

API やライブラリ、エミュレータなどは Android のバージョン(API レベル)ごと

にまとめられており、どのバージョンをターゲットに開発するかを選択することが

できる。新たなバージョンが公開されると、そのバージョン向けのファイルはイン

ターネットを通じてダウンロードして追加することができる。

Page 10: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

10

第4章 作成物の紹介

第1節 Rolling の概要

今回、キャラクタをゴールまで動かす Android アプリのゲームを参考書[5]を元

に製作した。操作はジャイロセンサーを用いて、スマートフォンを傾けることによ

りキャラクタを移動させる。

第1項 キャラクタの操作について

このゲームでプレイヤーがすることは操作キャラクタの移動だけとなって

いる。このゲームはジャイロセンサーと連動しており、図4のようにスマート

フォンを傾けるとその方向にキャラクタが移動するようになっている。

第2項 表示画面の内容について

図3の画面、操作キャラクタの位置がスタート位置となっており、旗のアイ

… 敵キャラクタ1

… 操作キャラクタ

… 敵キャラクタ2

… 敵キャラクタ3

… ワープホール

… ゴール

図3 ゲーム画面

経過時間

ゴールに触れる

図5 ゲームクリア画面

崖から落ちる

図6 ゲームオーバー画面

図4 移動操作 傾ける

Page 11: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

11

コンがゴールとなっている。スタートからゴールまでは両端が崖の道が続くマ

ップとなっており、キャラクタがゴールまで辿りつけばクリアとなり「You

Goal!!」と表示される(図5参照)。崖から落ちるとゲームオーバーとなり

「GAME OVER」と表示される(図6参照)。マップの途中には敵キャラクタ

3種類とワープホールの障害物が設置されている。右上の TIME(図3参照)

は、ゲームをスタートすると時間計測が始まり、クリアもしくはゲームオーバ

ーになると計測が止まる。この計測結果が競争ゲームとして楽しむ指標となる。

第3項 障害物について

マップ上には3種類のキャラクタが2体ずつ、ワープホールが2個の計8個

の障害物が配置されている。障害物にはそれぞれ能力を持っており操作キャラ

クタが触れると能力が発動する。その能力について説明を行う。敵キャラクタ

1は、数秒間自分の姿が見えなくなる(図7参照)。敵キャラクタ2は、横方

向の動きが急になる。敵キャラクタ3は、縦方向の転がり方が急になる。ワー

プホールは、スタート地点に飛ばされる。

第2節 システムの全体像

Rolling ゲームのプログラム構成をクラス図として図8に示す。Android アプリ

ケーションであるこのゲームは、起動時に main.xml に指定されている Activity を

継承する Rollng クラスと SurfaceView を継承する RollingView クラスが呼び出さ

れ、AndroidManifest.xml に定義されたルールに従い画面が表示される。Rolling

図 8 Rolling ゲームクラス図

図 7 敵キャラ1

能力

敵キャラクタ1に触れる

Page 12: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

12

クラスで用意したスタートメニューからゲームをスタートさせるとRollingViewク

ラスが呼び出される。RollingView クラスには、ジャイロセンサーから取り出した

値で移動量を割り出す処理、ゲーム終了処理、時間計測、描画などの処理が含まれ

る。描画処理は、この RollingView クラスが RollingBoard クラスを呼び出すこと

で行う。RollingBoard クラスは、Ball クラスのキャラクタの位置情報・移動量な

どと、Piece クラスに保管してある盤面に配置されるパーツの番号を継承すること

で、描画処理とイベント処理を行う。イベント処理にて、ゲームクリア・ゲームオ

ーバーの判断がされ、RollingView にて終了処理が行われる。

第3節 ジャイロセンサーの利用

Android アプリケーションでの、ジャイロセンサーの利用方法について本論に

て製作した Rolling ゲームのソースを用いて説明する。Android で各種センサーを

利用するには Activity から SensorManager をはじめに取得しなければならない。セ

ンサーは色々と種類があるので種類により制御方法が異なってくるが、この

SensorManagerを使えば利用するセンサーを指定するだけでセンサーの値が取得で

きる。SensorManager の取得は getSystemService メソッドで

Activity.SENSOR_SERVICE を指定することで行う(図9①参照)。次にセンサー

の種類には TYPE_ORIENTATION を指定する(図9②参照)。これで傾き関係の

センサーを取得することができる。

そして、取り出した List の項目数が 1 以上なら、Sensor の get で最初のインスタ

ンスを取得し、これを registerListener で組み込む(図9③参照)。今回は、

registerListener の第3引数に SENSOR_DELAY_FASTEST という値を指定した。こ

れは、センサーチェックのレートのうち、もっとも早いものを指定してある。これ

で一番敏感にセンサーが反応するようになる。

次に、onSensorChanged でセンサーの値が変更された時の処理を行う(図 10 参

照)。まず、SensorEvent の getType でイベントのタイプをチェックし、

TYPE_ORIENTATION の場合のみ処理を行うようにすることで、ジャイロセンサ

ーに応じた処理を行うことが出来るようにする(図 10①参照)。そして、SensorEvent

の values 配列から値をとり、小数点2桁以下を切り捨て、キャラクタの縦横の移

動量を示す dx、dy として保管される(図 10②参照)。

図9 センサー値の取得

Page 13: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

13

これでジャイロセンサーを通して取得した数値がゲームの中で利用・処理出来る

ようになる。このようにジャイロセンサーだけに関わらず、センサーで数値を取得

し、プログラムに組み込むことは容易に出来るのである。

第4節 クラスの詳細

第1項 Rolling クラス

このクラスはアクティビティを継承しており、アプリケーションに画面を

表示させることができる。ここでは、ゲームスタートのオプションメニューと

onCreateOptionsMenu で「スタート!」というメニュー項目を用意している、

これは、選択すると RollinView クラスの start を呼び出すようにしてある。

第2項 RollingView クラス

(1) クラス定義

Surfaceview を継承し、SensorEventListener と SurfaceHolder.Callback をそれ

ぞれ実装している。クラス定義は図 11 のようになっている。

(2) フィールド定義

クラスに定義されているフィールド類は、ScheduledExecutorService、

SurfaceHolderRollingBoard、Rolling、Piece といった各クラス、移動量を示す

値、メッセージ(タイム)の表示位置、開始時刻といった値の保管変数など

がまとめられている(図 12 参照)。

操作キャラクタを動かしていくゲームだが、「傾けると動く」というのは、

センサーの値を元に縦横の移動幅を計算し、それを操作キャラクタの表示位

置に加算減算していく、という形になる。ここでの dx,dy が、この「移動量」

図 11 SurfaceViewの基本形

図 10 センサー値の保管

図 12 RollimgView のフィールド

Page 14: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

14

を保管するためのものである。

また、Last_piece は、最後に操作キャラクタが残っていたパーツ(Piece

インスタンス)を保管するためのものである。これをフィールドで保管して

おくことにより「今、操作キャラクタがどのパーツ上にいるか」をすぐにわ

かるようにしている。

(3) メソッド定義

コンストラクタは、それぞれ init メソッドを呼び出す。init では、まず必

要なフィールドへの値の設定を行う。

start_time には、Calendar の getTimeInMillis の値を入れておく。これは、

ゲーム開始時にまた改めて値を設定することになる(図 13①参照)。続い

て、SurfaceHolder をフィールドに保管し、コールバックの設定を行ない、

フォーカスをビューに移す(図 13②参照)。最後に、ゲームに必要となる

Rolling、RollingBoard といったクラスのインスタンスをフィールドに保管す

る(図 13③参照)。Rolling はアクティビティクラスで、RollingBoard はこ

の後に作成するボード管理クラスである。また RollingBoard は、インスタン

ス作成後、loadImages を呼び出して、必要なグラフィック類のロードを完了

させておく。

Start メソッドは、このプログラムのポイントとなるメソッドである。「ス

タート!」メニューを選ぶと実行されるメソッドである。ここでは、以下の

ような処理を行なっている。

ゲーム開始に必要な初期化処理をする。ScheduledExecutorService インス

タンスを用意し、別スレッドでゲームのメイン処理を開始する(図 14①参

照)。まず、ゲーム開始のための初期化処理から、ScheduledExecutorService

が既に実行していたらそれを終了し、dx,dy,last_piece といったフィールドに

初期値を設定し、RollingView の「init」メソッドを呼び出してボードを初期

化する。

図 13 init メソッド

Page 15: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

15

続いて、ゲーム開始時刻を保管する start_time に、現在のタイムスタンプ

を保管している(図 14②参照)。これでゲーム開始の準備は完了である。

次に、ScheduledExecutorService を使ったマルチスレッド処理を開始して

いる(図 14③参照)。newSingleThreadExecutor でインスタンスを取得し、

scheduleAtFixedRate で Runnable をスケジューリングする。実行しているの

は、Runnable の run メソッドである(図 14④参照)。ここでは、RollingBoard

の「move」を呼び出し、それから「draw」を呼び出して描画を行っている。

move の引数には、移動量を保管している dx,dy を渡している。これで斜め

にした分だけ移動し、画面を更新するという作業は終了である。

次に、ゲーム終了のチェックとイベントの実行をする。まずは、操作キャ

ラクタが置かれているパーツを取得する。RollingBoard の getOnBalledPiece

は、現在操作キャラクタがある場所の Piece インスタンスを返す(図 14⑤参

照)。Piece は、マップの一つ一つのパーツを管理するクラスである。つま

り、これで得られた Piece を見れば、操作キャラクタが置かれている場所の

状況がわかるのである。まず、最後にボードが置かれていた Piece が null な

らばパーツがない場所に操作キャラクタがいるということで、ゲーム終了に

なる。終了処理は、finish というメソッドとして用意されているので、これ

図 14 start メソッド

Page 16: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

16

を呼び出す、この finish では、false を渡すとゲームオーバー、true ならクリ

アと判断されるようにしてある。(図 14⑥参照)

Piece がある場合は、改めて isBallOnPiece というメソッドを使って操作キ

ャラクタがピース上にあるかどうかをチェックする(図 14⑦参照)。Piece

があった場合は、更に getEvent を調べ、これが Piece.GOAl(ゴールのイベ

ント)ならば、ゴールまで到着したと判断し、finish(true)を呼び出す。そ

うでない場合は、last_piece と piece が同じかどうかチェックし、同じインス

タンスでなければ piece を last_piece に設定し直し、doEvent でイベントの処

理を実行する。

最後に、RollingBoard の goal_flg をチェックし、true ならばゴールしたも

のとして finish(true)を呼び出しゴール処理をする。そうでなければ、

game_flg が false なら finish(false)を呼び出しゲームオーバー処理をする(図

14⑧参照)。

第3項 RollingBorad クラス

(1)クラス概要とフィールド変数定義

このクラスに定義されているフィールド類は、ボードやパーツスタート

地点の縦横の位置や幅、Ball インスタンス、piece2 次元配列や地面、敵キャ

ラ、操作キャラのグラフィックなどがまとめられている。

0 0 0 0 0 0 0 0 00 7 7 7 6 0 0 0 00 8 3 7 7 7 7 6 00 5 7 7 1 2 7 7 00 2 7 7 4 3 7 7 00 8 2 7 7 7 7 1 00 0 8 8 8 3 1 8 00 0 0 0 3 7 4 0 00 0 0 5 1 8 2 6 00 0 5 7 4 0 8 7 00 0 2 7 1 0 5 1 00 0 8 2 4 5 1 8 00 0 5 7 7 7 8 0 00 3 7 1 8 7 7 6 00 2 7 4 0 2 7 7 60 8 2 7 7 7 7 7 1

図 16 ground の配列

0(g01.png) 1(g02.png)

2(g03.png) 3(g04.png)

4(g05.png) 5(g06.png)

6(g07.png) 7(g08.png)

8(g09.png)

図 15 RollingBorad のフィールド

Page 17: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

17

ここでは、2つの配列があり整数の値が記述されている(図 16,17 参照)。

これはグラフィックをまとめた配列のインデックス番号を示している。つま

り、Drawable 配列のこの番号のグラフィックを表示するということを配列

の形でまとめている。ground と event は、それぞれ図のような形で数値を設

定している。

2 重の繰り返しを使い、これらの配列から順に値を取り出して、それをも

とに Piece インスタンスを作って配列に収める、というようにして、全マッ

プのパーツ配列をまとめている(図 18①参照)。この際、event の値が1(ス

タート地点)だった場合は、start_col と start_row にそれぞれ値を収めて保管

する。あとは、new Ball で操作キャラクタのインスタンスを作成するだけ

である。引数には、操作キャラクタの表示位置を指定する(図 18②参照)。

(2)メソッド定義

draw メソッドで描画処理を行う(図 19 参照)。2重の for を使い、datas

に保管した Piece インスタンスの getGround、getEvent メソッドでそれぞれの

マップとイベント番号を取出し Drawable 配列から対応するグラフィックを

図 18 パーツとキャラクタの位置指定

図 19 draw メソッド

図 17 event の配列

0 0 0 0 0 0 0 0 00 1 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 6 0 0 4 0 00 0 0 0 0 0 0 0 00 0 0 5 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 0 3 0 4 0 0 0 00 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 00 5 0 0 0 0 0 0 00 0 0 6 0 0 3 0 00 0 0 0 0 0 0 2 0

2(goarl.png) 3(warp.png)

4(teki001.png) 5(teki002.png)

6(teki003.png)

0(イベントなし) 1(スタート地点)

Page 18: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

18

描画する。最後に、Ball の show_flg が true かどうかを確認し、操作キャラ

クタと影を描画する。show_flg とは操作キャラクタの表示・非表示を示すフ

ィールドである。

getOnBalledPiece メソッドは操作キャラクタがある場所の Piece インスタ

ンスを返すものである(図 20 参照)。Ball クラスには getContactPoint とい

う、操作キャラクタの接地点を返すメソッドが用意されている。この値から

ボードの位置を引きパーツの幅で割ると何番目のパーツに操作キャラクタ

があるか計算できる。

計算で得られた位置の値がゼロ未満だったり要素数以上だったりした場

合はボードの外に出てしまったということで null を返し、そうでなければ

datas からその位置の Piece を取り出して返す。

isBallOnPieceメソッドは引数に渡した Piece上に操作キャラクタがあるか

どうかをチェックする(図 21 参照)。まずは、Ball から getContactPoint で

接地点の位置情報を取出し、引数の Piece から getPoint メソッドそのパーツ

の位置を取り出す。Ball の位置の値から Piece の位置の値を引き、これで操

作キャラクタの、そのパーツ上の相対位置が得られる。

最後に、Piece にある isOnPiece というメソッドを呼び出して、結果を返す。

このメソッドは、引数に指定した位置が、その Piece のエリア内にあるかど

うかを返すものである。

doEventメソッドは、イベントの処理を行うためのものである(図 22参照)。

Case3はワープホールであるが、これは操作キャラクタの setPointを使い、

開始地点に操作キャラクタを移動しているだけである。

Case4 は図 17.4の敵キャラであるが、操作キャラクタを一時的に非表示

にしている。これは Ball クラスに用意されている invisibled メソッドを呼び

出しているだけである。このスレッド内で引数に指定したミリ秒数が経過す

る間、操作キャラクタが見えなくなる。

Case5,6は図17.5と6の敵キャラであるが、Ballに用意されている sensitived

メソッドを呼び出しているだけである。操作キャラクタの縦横の移動量を引

図 20 getOnBalledPiece メソッド

図 21 isBallOnPiece メソッド

Page 19: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

19

数に指定した値にだけ倍増させている。

第4項 Piece クラス

地面の上に操作キャラクタがあるかのチェックをしている。どのようにして

地面の上にいるかどうかを調べているのかというと、マップには様々な形状が

あり、図 16.7のような全部地面、図 16.8と0のような全部地面でない場合は

true、flase で構わないのだが、他に対角線に区切った半分が地面というパター

ンは図 24 のように調べている。

左上から右下へ場合正方形の場合、この対角線は常にx縦位置とyが等しい

値になることがわかる、xに対して、yの値が小さければ対角線の上側、y が

大きければ下側になる。

左下から右下への場合正方形の場合、この対角線は x + y = 図形の幅になる。

そして x + y が図形の幅より小さければ図形の上側、大きければ下側になる。

このように、x = y、x + y = 幅という形で2つの対角線上の位置があらわさ

れることがわかる。そして、x と y の値を比べることにより、その対角線のど

ちら側に位置するかがわかる。

第5項 Ball クラス

では、最後に Ball クラスについて、説明していく。

invisibled メソッドは引数で指定した時間だけ、操作キャラクタを非表示に

するためのものである。まず、currentThreadTimeMillis で現在の時間を取得し、

それに引数の時間を足したものを last_time に設定する。それから show_flg を

(0、0) (0、0)

x > y

x < y

x + y < 幅

x + y > 幅

x = = y x + y = = 幅

図 23 パーツ内の位置判別

図 22 doEvent メソッド

Page 20: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

20

false にすれば完了。Rollingboard の draw メソッドで描画を行う際、show_flg

が false ならば描画はされないので、この値を変更するだけで非表示にするこ

とができる。またスレッドの run が実行されるたびに ball の move が呼び出さ

れることで操作キャラクタが動いていくがこのときに last_time をチェックし

て、時間が経過したら show_flg を true に戻すようにしている、これにより一

定時間が経過すると自動的に表示が戻るようになる。

Sensitived メソッドは傾きによって操作キャラクタが動く移動量を変化させ

るものである、移動量は、センサーで得られた値に、Ball クラスの dx,dy

の値をかけて計算するようになっている。このdx,dyの値を増減することで、

同じセンサーの値でもより多く移動するようになる。今回は敵キャラ(図 17.

5,6)に触れたとき、このメソッドを呼び出して操作を難しくさせるのに使

った。

Page 21: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

21

第 5 章 Android におけるオーバーライド

製作した RollingGame のソースには、@Override の記述がいくつかありオーバーライ

ドが用いられる。他にも Android アプリケーションには、基本的にオーバーライドが用

いられるが、オーバーライドとは何なのか、オーバーライドは製作したプログラムでどの

ように使われているのか考察する[4]。

第1節 オーバーライド

第1項 オーバーライドとは

オーバーライドとは、クラスを継承した時の特徴のひとつである。継承す

る元の親クラス(スーパークラス)で定義されているメソッドを、子クラス

(サブクラス)で書き換え再定義することができる。これがメソッドのオー

バーライドであり、子クラスで機能を追加する必要がある場合などに使う。

オーバーライドを行うためには、スーパークラスのメソッドとシグネチャ(メ

ソッド名、引数の数・型)と戻り値型が同じではないといけない。

オーバーライドの仕組みを図 24 に示す。図 24 は、クラス B(サブクラス)

がクラス A(スーパークラス)をオーバーライドしている。クラス B は、ク

ラス A の定義する変数 Name と age、そして「名前を調べる」「年齢を調べる」

「自己紹介する」といったメソッドを継承する。しかし、クラス A の「自己

紹介する」メソッドは「私は典子、20 歳です。」、クラス B の「自己紹介する」

メソッドは「名前は典子、今年で 20 歳です。」となる。これは「自己紹介す

る」というメソッド名(シグニチャ)が同一であるにもかかわらず、クラス B

の「自己紹介する」メソッドを使うとクラス A の「自己紹介する」と異なる

動きをするということである。つまり、コーディング上は同じでも

A. 自己紹介する()

B. 自己紹介する()

これで異なる動作ができるというのが、オーバーライドである。そして、新

しく「掃除をする」というメソッドが追加される。オーバーライドを利用す

クラス A(スーパークラス)

Name:典子・age:20

名前を調べる 年齢を調べる

自己紹介する(私は“name”、“age”歳です。)

クラス B(サブクラス)

自己紹介する(名前は“name”、今年で“age”歳です。) 掃除をする

オーバーライド

私は典子、

20 歳です。

名前は典子、

今年で 20歳です。

図 24 オーバーライドの例

Page 22: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

22

ることで、親クラスの変数と一部のメソッドを呼び出しながらも、独自のメ

ソッドへの書き換えと、新しいメソッドも加えることも出来るのである。

第2項 Overide の記述

オーバーライドの基本的な記述方法について図 25 に示す。クラスの宣言時

に、「extends 親クラス名」と記述することで子クラスは親クラスをオーバ

ーライドすることが出来る。そして、再定義しなおしたいメソッド名を@

Override の下で指定することで親クラスの中の指定メソッドを再定義しなお

すことが出来る。このような記述が、今回製作した RollingGame の Rolling

クラスと RollingView クラスにある。第2節、第3節で詳細を記す。

第2節 Activity クラス

アクティビティとは、ユーザーが操作を行うために画面に表示されるコンポーネ

ントで、主にユーザーインターフェイスが必要なアプリケーションで使用される。

Android アプリケーションでは、スマートフォンの画面を表示させるため必須のも

のとなる。Android アプリケーションを起動させ、アクティビティを開始すると画

面が表示されるまでに以下の処理が行われる。

①onCreated アクティビティ生成時の処理

②onStart アクティビティスタート時の処理

③onResume アクティビティレジューム時の処理

このように onCreate()メソッド、onStart()メソッド、onResume()メソッドが順に

呼ばれて実行中の状態になる。メソッドが三つに分かれているのは、その状態に応

じて処理を行えるように分かれている。

アクティビティは、Activity クラスと表示する画面のレイアウトデータからでき

ている。レイアウトデータは、res フォルダ内の layout 内に保管されている。

第3節 「Rolling」における Override

RollngGame では、Rolling クラスが android.app にある Activity というクラス

を継承している。また、この Activity クラスには onCreate というメソッドがあり

これをオーバーライドして定義している。ここで登場した Activity クラスという

のがアクティビティを作成する際に用いられるクラスである。すべてのアクティ

ビティは、必ずこの Activity クラスを継承して作られる。この Activity クラスに

は、インスタンスを作成する際に呼び出される onCreate というメソッドがあり、

図 25 オーバーライド記述の基本

Page 23: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

23

オーバーライドして、アクティビティの初期化処理を用意する(図 26 参照)。

図 26①の onCreate には savedInstanceState という名前の Bundle というクラ

スのインスタンスが引数として渡される。要するに前回の起動から引き継ぐデー

タの有無をチェックしている。この onCreate で実行しているのは、以下のような

処理である、まず、スーパークラスの onCreate を呼び出し、初期化処理を行う。

これでアクティビティの基本的な準備が整う(図 26②参照)。

続いて、コンテンツビューというものを設定する(図 27 参照)。これが実際に

画面に表示される部品である。この setContentView というメソッドの引数に用意

された部品が、そのままアクティビティの画面として表示される。というわけで

layout.xml で作られるレイアウトデータというオブジェクトをコンテントビュー

に設定して表示させている。

第4節 SurfaceView クラス「RollingView」における Override

SurfaceView を RollingGame の View クラスである RollingView クラスに継承

するには、基本的にSurfaceViewクラスをextendsで継承するだけでいいのだが、

これに加え SurfaceHolder.Callback というインターフェイスを implements して

おく。この SurfaceHolder.Callback というのは、SurfaceHolder オブジェクトの

addCallback メソッドを使って、SurfaceView のサーフェイスの生成・変更・破

棄それぞれの際に呼び出されるものである。サーフェイスとは、文字通りビュー

の表面である。SurfaceView では、View の上にサーフェイスと呼ばれるものを表

示し、このサーフェイスに様々な表示を作成する。この SurfaceHolder.Callback

を implements して必要なメソッドを用意しておくことで、サーフェイスのイベン

トに応じた処理を実行できるようになる。以下の 3つのコールバックメソッドを、

オーバーライドする必要がある(図 28 参照)。

①srfaceCreated サーフェイス生成時の処理

②srfaceChanged サーフェイス変更時の処理

③surfaceDestroyed サーフェイス破棄時の処理

② 図 26 アクティビティの初期化処理

図 27 コンテンツビュー設定

Page 24: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

24

これらのメソッドでは、引数にSurfaceHolderというインスタンスが渡される。

これは、サーフェイスを管理するためのもので、ここにサーフェイスを扱うための

機能が用意されている。たとえば、描画のための Canvas を取得するのも、この

SurfaceHolder にあるメソッドを用いる。

図 28 サーフェイスイベント処理

Page 25: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

25

第6章 まとめ

近年、センサーの発達によりスマートフォンの利用方法がさらに多様化している。ス

マートフォン OSの中でも最もシェアが多い AndroidOS では必ずセンサーが搭載され

ており、そのセンサーの中でもジャイロセンサーは、地図アプリやゲームアプリ、UI

としての利用がされ必要不可欠なものとなっている。そこでジャイロセンサーを利用す

る Android アプリケーションの開発を決めた。

本論文では、AndroidOS の構成、ジャイロセンサーの角速度検出方法などの理解を

深めながら、Android アプリケーションの開発環境構築を行い、ジャイロセンサーのジ

ャイロセンサーを利用する Android アプリケーションゲームの開発を行った。ゲーム

はシンプルなもので、スマートフォンを傾けると動くキャラクタをスタート地点からゴ

ール地点まで導くものである。コースアウトするとゲームオーバーするため緊張感を持

ちながら、またクリア時間がスコアとなるため早くクリアするために思い切りを要する

楽しいゲームになっている。この Android アプリケーションを製作する中で、Activity

クラスに Override する形で画面表示やジャイロセンサーの利用を行い、Activity と

Override の仕組みの理解とともに、Android アプリケーションにおいて有効に働いて

おり、必要なものであることが分かった。

今後の課題として、仮想センサー持つエミュレータが必要であると考える。Android

アプリケーションの開発自体は用意になってきているが、センサーを使った Android

アプリケーションを開発するには、SensorManager を使用しているため動作テストす

る際に実機が必須となってしまう。今後増えるだろうジャイロセンサーアプリケーショ

ンを開発する上で、仮想センサーでアプリケーションのテストを行うことが出来れば、

さらに開発が容易になるだろう。

Page 26: ジャイロセンサーを利用した Android 用ゲームアプリケーション …hanakawa/soturon/2014/NishiwakiNishihira.pdf · を行う上で、Android アプリケーションの開発に適した環境を用意・利用する。そして、

26

-参考文献-

[1]http://blogs.strategyanalytics.com/WSS/post/2014/10/31/Android-Captures-84-Sh

are-of-Global-Smartphone-Shipments-in-Q3-2014.aspx

[2]Open Handset Alliance(OHA) http://www.openhandsetalliance.com/index.html

[3]Eclipse で始める Android プログラミング入門

著者:掌田津耶野 発行者:斉藤和邦 発行所:秀和システムズ

[4]基礎から学ぶ Android アプリ開発

著者:渡邊昌之 発行者:池田武人 発行所:株式会社シーアンドアール研究所

[5]15 歳からはじめる Android わくわくゲームプログラミング教室

著者:掌田津耶野 発行者:黒田庸夫 発行所:株式会社ラトルズ

-謝辞-

この 2 年間楽しみと苦しみを分かち合ったゼミ生の皆さんに感謝します。学ぶ環境

を与えていただいた阪南大学に感謝します。本論文作成中に何度も崖から落ちることに

なってしまったはぴなんに感謝します。本論文の添削、アドバイスなど数々の指導の他

に、就職に関してもお世話になりました花川典子先生に感謝します。