Skip to content

iOS Everyplay Tutorial_ja

Makoto Sugano edited this page Jul 14, 2014 · 4 revisions

ここではEveryplayTutorialを簡単に見てみます。これはeveryplay-ios-examplesリポジトリからのサンプルアプリです。

このドキュメントで扱う範囲:

  • 基本的なEveryplay clientid / secret の初期化
  • Everyplayデリゲートハンドリング
  • 録画した動画にメタデータを追加し、ユーザーエクスペリエンス・ナビゲーションを向上する
  • Everyplayビューを起動、録画を開始・停止、 直近に録画した動画を再生するシンプルなUIボタンを追加する

有効なメソッドに関する詳細な情報についてはiOS Class リファレンスドキュメンテーションをご参照下さい。

このドキュメントを読みはじめる前に、下記の必須資料を読み、理解していることを確認して下さい:

準備

Everyplay SDKとサンプルをGithubからダウンロードする

% git clone https://github.com/Everyplay/everyplay-ios-sdk.git
% git clone https://github.com/Everyplay/everyplay-ios-examples.git
% cd everyplay-ios-examples
% open -a Xcode EveryplayTutorial.xcodeproj

コード

  • Everyplay.frameworkとEveryplay.bundleをEveryplayTutorialプロジェクトへドラッグします

  • EveryplayTutorialターゲットを選択し、SummaryタブからLinked Frameworks and Librariesをチェックし、最低でも次のフレームワークには必ずリンクして下さい:
    • AdSupport (iOS 6+, pre-iOS 6 互換用にOptionalリンクを設定して下さい)
    • AssetsLibrary
    • AudioToolbox (EveryplayTutorialに前もって追加してあります)
    • AVFoundation
    • CoreGraphics (EveryplayTutorialに前もって追加してあります)
    • CoreImage (iOS 5+, pre-iOS 5 互換用にOptionalリンクを設定して下さい)
    • CoreMedia
    • CoreVideo
    • Foundation (EveryplayTutorialに前もって追加してあります)
    • MessageUI
    • MobileCoreServices
    • OpenGLES (EveryplayTutorialに前もって追加してあります)
    • QuartzCore (EveryplayTutorialに前もって追加してあります)
    • Security
    • Social (iOS 6+, set to pre-iOS 6互換用にOptionalリンクを設定して下さい)
    • StoreKit
    • SystemConfiguration
    • Twitter (iOS 5+, pre-iOS 5 互換用にOptionalリンクを設定して下さい)
    • UIKit (EveryplayTutorialに前もって追加してあります)

  • ビューコントローラヘッダERViewController.h内でEveryplayヘッダアンブレラをインポートし、 Everyplay用のデリゲートを追加して下さい。
  */

 #import <UIKit/UIKit.h>
 #import <QuartzCore/QuartzCore.h>
 #import "EAGLView.h"
 #import "Config.h"

-@interface ERViewController :UIViewController {
+#import <Everyplay/Everyplay.h>
+
+@interface ERViewController :UIViewController <EveryplayDelegate> {
     EAGLContext *context;
     GLuint program;

     BOOL animating;
     NSInteger animationFrameInterval;
     CADisplayLink *__unsafe_unretained displayLink;
  • アプリケーションデリゲート実装ERAppDelegate.m内で、 clientId・secret・リダイレクトURIを用いたapplication:didFinishLaunchingWithOptions:メソッドによるEveryplayの初期化を追加します。

    Everyplayデリゲートとビューハンドリングには、 デリゲートハンドリングに使用するインスタンスとビューコントローラを渡す必要があります。この例では、両方ともERViewControllerで扱います。

         self.viewController = [[ERViewController alloc] initWithNibName:@"ERViewController_iPhone" bundle:nil];
     } else {
         self.viewController = [[ERViewController alloc] initWithNibName:@"ERViewController_iPad" bundle:nil];
     }
     self.window.rootViewController = self.viewController;
     [self.window makeKeyAndVisible];

+ // 私共のclient id と secretでEveryplay SDKを初期化します。
+ // これらは https://developers.everyplay.com で生成できます。
+  [Everyplay setClientId:@"b459897317dc88c80b4515e380e1378022f874d2" clientSecret:@"f1a162969efb1c27aac6977f35b34127e68ee163" redirectURI:@"https://m.everyplay.com/auth"];
+
+  // Everyplayに 私共のrootViewControllerを使用してpresenting viewsおよびdelegate callsを処理するよう命令します。
+  [Everyplay initWithDelegate:self.viewController andParentViewController:self.window.rootViewController];
+
     return YES;
 }

 - (void)applicationWillResignActive:(UIApplication *)application
 {
     // アプリケーションがactive状態からinactive状態へ移行しようとする際に送られます。これは特定のタイプのテンポラリインタラプション(電話着信やSMS受信など)もしくはユーザーによるアプリケーション終了にともなって発生し得ます。そうするとbackground状態への移行が始まります。
     // このメソッドは実行中タスクの中断、タイマーの無効化、OpenGL ES フレームレートの引き下げに使用します。ゲームの中断にはこのメソッドを使用して下さい。
  • テスティングに近づいてきました!ボタンをいくつか作って、 ERViewControllerの実装にEveryplayデリゲートハンドラを追加すれば、アプリのビルドと実行の準備ができます。

    everyplayRecordingStoppedでは、録画したばかりのセッションにメタデータを追加します。あなたのゲームの、 ハイスコア・プレイしたレベル・使ったキャラクターなどをメタデータにできます。

    ユーザーエクスペリエンス向上のため、メタデータを追加してナビゲーションと検索を強化しましょう。 Everyplayは後々この情報をゲームプレイに関する情報の表示に使用することになりますし、 サーバーAPIを通じてあなたが個人的に使用することもできます。。

     NUM_ATTRIBUTES
 };

 @interface ERViewController ()
 @property (nonatomic, strong) EAGLContext *context;
 @property (nonatomic, unsafe_unretained) CADisplayLink *__unsafe_unretained displayLink;

 @property (nonatomic) NSString *song1;

+@property (nonatomic, retain) IBOutlet UIButton *everyplayButton;
+@property (nonatomic, retain) IBOutlet UIButton *recordButton;
+@property (nonatomic, retain) IBOutlet UIButton *videoButton;
+
 - (BOOL)loadShaders;
 - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
 - (BOOL)linkProgram:(GLuint)prog;
 - (BOOL)validateProgram:(GLuint)prog;
 @end

 @implementation ERViewController
 @synthesize animating;
 @synthesize context;
 @synthesize displayLink;

+@synthesize everyplayButton;
+@synthesize recordButton;
+@synthesize videoButton;
+
 - (void)dealloc
 {
     if (program) {
         glDeleteProgram(program);
         program = 0;
     }

...
     [_song1 getCString:buffer maxLength:200 encoding:NSASCIIStringEncoding];
     result = fmod_system->createSound(buffer, FMOD_SOFTWARE | FMOD_LOOP_NORMAL, NULL, &sound1);

     result = fmod_system->playSound(FMOD_CHANNEL_FREE, sound1, false, &channel);
 #endif

     // ビューのロード後は、例によってnibから追加設定を行います。
+  [self createButtons];
 }

 - (void)viewDidUnload
 {
    [super viewDidUnload];

     if (program) {
...

 - (BOOL) shouldAutorotate {
     return YES;
 }

 #pragma mark -

+- (void)createButtons {
+  int buttonX = 10;
+  int buttonY = 10;
+  int buttonWidth = 200;
+  int buttonHeight = 40;
+  int padding = 8;
+
+  everyplayButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+  everyplayButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, buttonHeight);
+  [everyplayButton setTitle:@"Everyplay" forState:UIControlStateNormal];
+  [everyplayButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
+  [everyplayButton setTitleColor:[UIColor yellowColor] forState:UIControlStateHighlighted];
+
+  [everyplayButton addTarget:self action:@selector(everyplayButtonPressed:)
+       forControlEvents:UIControlEventTouchUpInside];
+  [self.view addSubview: everyplayButton];
+
+  buttonY = buttonY + buttonHeight + padding;
+  recordButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+  recordButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, buttonHeight);
+  [recordButton setTitle:@"Start Recording" forState:UIControlStateNormal];
+  [recordButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
+  [recordButton setTitleColor:[UIColor yellowColor] forState:UIControlStateHighlighted];
+
+  [recordButton addTarget:self action:@selector(recordButtonPressed:)
+      forControlEvents:UIControlEventTouchUpInside];
+  [self.view addSubview: recordButton];
+
+  buttonY = buttonY + buttonHeight + padding;
+  videoButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
+  videoButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, buttonHeight);
+  [videoButton setTitle:@"Play Last Recording" forState:UIControlStateNormal];
+  [videoButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
+  [videoButton setTitleColor:[UIColor yellowColor] forState:UIControlStateHighlighted];
+  videoButton.hidden = YES;
+
+  [videoButton addTarget:self action:@selector(videoButtonPressed:)
+     forControlEvents:UIControlEventTouchUpInside];
+  [self.view addSubview: videoButton];
+}
+
+- (IBAction)everyplayButtonPressed:(id)sender {
+  [[Everyplay sharedInstance] showEveryplay];
+}
+
+- (IBAction)recordButtonPressed:(id)sender {
+  if ([[[Everyplay sharedInstance] capture] isRecording]) {
+    [[[Everyplay sharedInstance] capture] stopRecording];
+  } else {
+    [[[Everyplay sharedInstance] capture] startRecording];
+  }
+}
+
+- (IBAction)videoButtonPressed:(id)sender {
+  [[Everyplay sharedInstance] playLastRecording];
+}
+
+#pragma mark - Delegate Methods
+- (void)everyplayShown {
+ NSLog(@"everyplayShown");
+
+  [self stopAnimation];
+#if USE_AUDIO
+  channel->setMute(true);
+#endif
+}
+
+- (void)everyplayHidden {
+ NSLog(@"everyplayHidden");
+
+  [self startAnimation];
+#if USE_AUDIO
+  channel->setMute(false);
+#endif
+}
+
+- (void)everyplayRecordingStarted {
+  NSLog(@"everyplayRecordingStarted");
+
+  [recordButton setTitle:@"Stop Recording" forState:UIControlStateNormal];
+}
+
+- (void)everyplayRecordingStopped {
+  NSLog(@"everyplayRecordingStopped");
+
+  [recordButton setTitle:@"Start Recording" forState:UIControlStateNormal];
+  videoButton.hidden = NO;
+
+  [[Everyplay sharedInstance] mergeSessionDeveloperData:@{@"testString" :@"hello"}];
+  [[Everyplay sharedInstance] mergeSessionDeveloperData:@{@"testInteger" :@42}];
+}
+
 @end
  • EveryplayTutorialはいくつか追加項目を足した完了例として、 everyplay-ios-examplesでご覧になれます。

Clone this wiki locally