Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

[iOS] iCadeゲームコントローラーに対応してみよう

More than 5 years have passed since last update.

iCadeってなに?

iCadeは昔からあるiOS用のゲームコントローラです。
http://www.ionaudio.com/products/details/icade

iPadをアップスタンド筐体っぽくするやつが発端で、この後様々なコントローラがこのiCade互換として発売されています。
最近ではファミコンコントローラ風のものがでて話題になっていました。
http://jp.fc30.com

接続とOS/アプリでの認識

bluetoothで接続します。
接続されたらiCadeのデバイスはキーボードのように振る舞い、アプリはボタンが押されたら特定の文字列が送られてくるのでそれを拾って各動作をさせることになります。

ゲーム以外での可能性

入力の判定は簡単にできるので、ゲーム以外でも対応すると便利になる可能性を秘めてます。
たとえばレシピアプリ(iPad)を例にしましょう。
iPadは濡れたりすると困るので、ちょっと離れた場所におきたい。
でも操作するときちょっと面倒。濡れて壊れるとイヤですし。
iCade対応すればiPadはちょっと離れた場所に、コントローラはラップでくるんで多少濡れても大丈夫にし、手元に置けば気軽にページ送りとかできてしまいます。
テレビのリモコン感覚ですね。

他にも沢山できることはあるはずです。

対応方法

残念ながらiOS7から用意されているGame Controller Frameworkは使えませんので、独自に実装していく必要があります。
単純に書くとUIKeyInputプロトコルの

UIKeyInput
- (void)insertText:(NSString *)text

で入力された文字列を判定すればよいというだけなのですが、面倒なのでラッパーライブラリを使います。
iCade-iOSというライブラリがそれなのですが、残念ながらメンテナンスがされていないようでPullRequestも取り込まれていない状態でした。forkしてARC対応したものを用意しましたのでこちらを使ってみてください。

iCade-iOS
https://github.com/banwanko/iCade-iOS/tree/support-arc

実際に使用するのは下記の3ファイルです。

iCadeTest/iCade/
iCadeReaderView.h
iCadeReaderView.m
iCadeState.h

プロジェクトに適当に上記3ファイルを入れます。
使いたいViewControllerのviewDidLoadあたりにこのViewを作成し、iCadeEventDelegateのプロトコルメソッドを追加します。

ViewController
#import "iCadeReaderView.h"

@interface ViewController()
@protocol (nonatmic) iCadeReaderView    *icadeView;
@end

@implementation ViewController

- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.icadeView = [[iCadeReaderView alloc] initWithFrame:CGRectZero];
    [self.view addSubview:_icadeView];
    _icadeView.active = YES;
    _icadeView.delegate = self;
}
#pragma mark - iCadeEventDelegate
- (void)buttonDown:(iCadeState)button 
{
    // ボタンが押された
}
- (void)buttonUp:(iCadeState)button 
{
    // ボタンがはなされた
}
- (void)setState:(BOOL)state forButton:(iCadeState)button 
{
    // ボタンの状態が変わった
}
@end

通常はbuttonDownの対応だけでいいと思います。
このままですとこのViewControllerから遷移したときなどで困るので、下記のようにしておくといいと思います。

ViewController
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear: animated];
    _icadeView.active = YES;
    _icadeView.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated 
{
    [super viewWillDisappear: animated];
    _icadeView.active = NO;
    _icadeView.delegate = nil;
}

注意点

  • キーボードが日本語入力の状態になっていると、ボタン入力が受け付けられないので注意しましょう。
    これの回避方法はまだ調べてません。

  • iCadeデバイスが繋がっている状態ではキーボードが表示されなくなります。
    ユーザが入力する項目のあるアプリでは色々面倒かもしれません。

宣伝

Dモーニング(iOS)ではサポート外の機能ですがiCade対応していたりします。
(DモーニングのiOS版は自分が実装を担当なのです)
左右でページ移動、L,Rで作品移動をすることができ、iPadを置いて楽な姿勢でコントローラを使い読みすすめることができますよ。
はじめは手元にあったimpulse controllerをなにかに使えないかなと思い、Dモーニングで対応してみたところ、かなり使い勝手が良いということに気がつきました。

今後ゲームコントローラの対応はGame Controller Frameworkに収束していくと思うので、今更iCade対応するのもなーという人もいるかと思います。
組み込み自体は10分もあればできちゃうので、もし対応したら楽しそうなアプリでしたら試してみてはいかがでしょうか?

一番の問題点は、iCade互換デバイスを持っている人がそんなに多くはいないだろうということでしょうかね・・・

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away