Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード

2013-08-23

プレイ動画を録画&シェアできるゲームアプリ向けSDK『Kamcord』を少々さわってみたメモ

Kamcord は、ゲームの動画を撮ってシェアするための SDK(フレームワーク です。







基本的な使い方

録画は startRecording / stopRecording メソッドを呼ぶだけ

[Kamcord startRecording];
[Kamcord stopRecording];

で、showView メソッドを呼ぶと、

[Kamcord showView];

下記のような画面が出てきて、録画したプレイ動画のシェア他プレイヤーの動画の閲覧等ができるようになります。



以上。簡単ですね。


自前UIを使う

ここからはニッチな話になってしまいますが、上記の出来合いのビューを使わず、Kamcord サーバ上にアップされた動画のURLだけ取得してゴニョゴニョ、といったことができるのか、それとも隠蔽されててできないのか、というのを調べてみました。



で、結論としては、可能です。



オフィシャルドキュメント内の下記ページに書かれていて、


Using the Kamcord API: Fully Custom UI


KCCustomUI というクラスを使います。


で、この件についてはドキュメントとかサンプルコードが古い、というかメンテされておらず、Web上でもあまり情報がありません。


このあたりに関して、引っかかった点、わかりにくかった点を以下に箇条書きでまとめておきます。

  • KCCustomUI を使用したサンプルの在処と実行方法
    • サンプルプロジェクトから CustomUITest クラスのファイルが外されている。
    • Custom UIのサンプルを試すには、プロジェクトフォルダ配下の tests/CustomUITest.h,m を改めてプロジェクトに追加し、 ターゲットを作成する必要がある。
  • VideoTicketDelegate プロトコルの実装
    • AppDelegate のサブクラスを VideoTicketDelegate に指定すると EXC_BAD_ACCESS エラーになる。
    • CALayer のサブクラスを VideoTicketDelegate に指定すると問題なくなった。
    • 理由/原因は不明。
  • 動画URLの取得
    • KCVideoTicket クラスの getVideoURL メソッドで得られる URL は、Base URL が省かれている。
    • 同クラスの thumbURL プロパティから得られる結果で、Base URL は https://s3.amazonaws.com と判明(実際にこれで動画にアクセスできた)

また何か出てきたら追記します。



(2013.8.29追記)Kamcord から学んだこと

『Kamcord』をつかってみた際に得た一番の収穫は、「あ、これでいいんだ」という感覚です。


たとえば、

  • デベロッパーとしてサインアップすると、APIKey がメールで飛んでくるだけ。(ダッシュボードとかない)
  • DownloadページもDocumentationページも、GitHub の wiki に飛ばされる。(サイト内でかっこよくドキュメントを表示したりとかしない)

とか。


Kamcord は最近100万ドルを調達しましたが、これぐらい開き直ってコア機能に集中していいんだなと。


そんなわけで、これを見て AppSocially の iOS SDK も、GitHubをベースに諸々整えていく方針にしました。


appsocially/AppSocially-iOS-SDK


今までは配布用 zip を新しいバージョンに差し替えたい場合や、ドキュメントを更新したい場合にはチケット切ってサーバーサイド担当者に依頼してたのですが、これで自分のペースでどんどん更新できるようになって、すごく快適になりました。(追記終わり)



2011-05-07

CCDirector のソース解析

CCDirectorのソースを解析してたときのメモがあったので、載せておきます。

(UIKitとcocos2dの併用時にCCSceneの遷移でハマっていたので、原因の目星をつけられるようソースを読んでました)


CCDirectorの正体

CCDirector *director = [CCDirector sharedDirector];

とすると、


+ (CCDirector *)sharedDirector
{
	if (!_sharedDirector) {

		//
		// Default Director is TimerDirector
		// 
		if( [ [CCDirector class] isEqual:[self class]] )
			_sharedDirector = [[CC_DIRECTOR_DEFAULT alloc] init];
		else
			_sharedDirector = [[self alloc] init];
	}
		
	return _sharedDirector;
}

とシングルトンが生成されるのですが、ここでalloc/initされてる CC_DIRECTOR_DEFAULT は


#define CC_DIRECTOR_DEFAULT CCDirectorTimer

と定義されてるので、実は CCDirectorTimer (CCDirectorのサブクラスであるCCDirectorIOSのサブクラス)のインスタンスが生成されています。


CCDirectorTimer

アニメーションのフレーム処理はNSTimerで実装されてるようです。

- (void)startAnimation
{
	// (略)
	
	animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval_ target:self selector:@selector(mainLoop) userInfo:nil repeats:YES];
}


-(void) mainLoop
{
	[self drawScene];
}

CCDirectorIOS

- (void) drawScene
{    
	// (略)
	
	/* draw the scene */
	[runningScene_ visit];
	
	/* draw the notification node */
	[notificationNode_ visit];

	// (略)
}

CCNode

-(void) visit
{
	// (略)
	[self draw];
	// (略)	
}

CCNodeのdrawメソッドは空。

CCNodeのサブクラスで実装。たとえばCCSpriteでは


-(void) draw
{
	NSAssert(!usesBatchNode_, @"If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called");

	// Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
	// Needed states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
	// Unneeded states: -

	BOOL newBlend = blendFunc_.src != CC_BLEND_SRC || blendFunc_.dst != CC_BLEND_DST;
	if( newBlend )
		glBlendFunc( blendFunc_.src, blendFunc_.dst );

#define kQuadSize sizeof(quad_.bl)
	glBindTexture(GL_TEXTURE_2D, [texture_ name]);
	
	long offset = (long)&quad_;
	
	// vertex
	NSInteger diff = offsetof( ccV3F_C4B_T2F, vertices);
	glVertexPointer(3, GL_FLOAT, kQuadSize, (void*) (offset + diff) );
	
	// color
	diff = offsetof( ccV3F_C4B_T2F, colors);
	glColorPointer(4, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff));
	
	// tex coords
	diff = offsetof( ccV3F_C4B_T2F, texCoords);
	glTexCoordPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff));
	
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
	
	if( newBlend )
		glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);
	
#if CC_SPRITE_DEBUG_DRAW
	CGSize s = [self contentSize];
	CGPoint vertices[4]={
		ccp(0,0),ccp(s.width,0),
		ccp(s.width,s.height),ccp(0,s.height),
	};
	ccDrawPoly(vertices, 4, YES);
#endif // CC_TEXTURENODE_DEBUG_DRAW
	
}

ここでOpenGL ESベースの描画処理を行っていることがわかります。



2011-04-21

cocos2d を使用したゲームアプリのソースコード集

実装の参考になるかもしれないので、cocos2d を使ったアプリのソースコードをいろいろと集めています。


Gorillas

https://github.com/Lamentum/Gorillas

ビルドするのにプロジェクトをもろもろ整備する必要あり。

https://github.com/Lamentum/iLibs

cocos2dのファイル群が必要で、さらにフォルダ構造をプロジェクトに合わせていろいろ組み替える必要があったり、ヘッダ探索パスを設定したり、warning を error として扱う設定をoffにしたり、足りないフォントを探してきたり、ソースの修正も必要だったり。。

で、なんとかビルド成功したところでAssertion Error。。


deblock

http://codaset.com/lhunath/deblock

同上


artifice

http://kwigbo.tumblr.com/artifice

ゲームのルールがよくわからないけどすぐビルドできてちゃんと遊べました

f:id:shu223:20110421085310p:image:w320

grabbed

http://code.google.com/p/grabbed/

grabbed-tooをダウンロードしたところ、ビルド時にbundle identifierにハイフンがあるとまずいと怒られたので、そこだけ修正。

f:id:shu223:20110421084551p:image:w240


Thrown

http://code.google.com/p/thrown/

box2dゲーム

f:id:shu223:20110421084638p:image:w240


tweejump

https://github.com/haqu/tweejump

sumojumpみたいなゲーム。

ビルドはすんなりいきました。

f:id:shu223:20110421084716p:image:w240


Pusher

http://kwigbo.tumblr.com/post/335053103/pusher-source-code

ビルドはすんなり。ゲームの内容がよくわからない。。

f:id:shu223:20110421084443p:image:w240


ABC123

http://kwigbo.tumblr.com/abc123

f:id:shu223:20110421084936p:image:w240


cocos2dじゃないけどiPhone用ゲームでソースが公開されてるもの

http://www.geeks3d.com/20090325/source-code-of-wolfenstein-3d-for-the-iphone-available/

:title=wolfenstein 3D]



(情報ソース)

http://www.cocos2d-iphone.org/wiki/doku.php/prog_guide:sample_games

http://code.google.com/p/cocos2d-iphone/wiki/GamesUsingCocos2d



2011-04-15

cocos2dでの3Dアプリケーションの開発を可能とするエクステンション「cocos3d」

"cocos3d"なるcocos2dエクステンションが出たようです。

http://brenwill.com/cocos3d/


とりあえずダウンロードしてデモを動かしてみました。


f:id:shu223:20110414234119p:image:w240:left

f:id:shu223:20110414234244p:image:w240:left



デモのビルド方法

cocos2dとcocos3dのソースが入ってないので、追加してやる必要があります。以下追加手順です。

  1. cocos2dのテンプレートを使って適当なプロジェクトを生成する
  2. 生成されたプロジェクト内にあるlibsフォルダを、デモプロジェクトのフォルダ(CC3DemoMashUp)直下にコピー
  3. ダウンロードしてきて解凍した"cocos3d 0.5.3"フォルダ内にあるcocos3dフォルダを、上記のlibsフォルダ直下にコピー

これでビルドできるようになります。


実装方法とか

プログラミングガイドAPIリファレンスをざっと見渡す限りでは、CC3LayerとかCC3Nodeなどcocos2dの概念と、CC3LightやCC3VertexArrayなど3Dプログラミングの概念に則った設計になっていて、わかりやすそうです。


自分でも何か作ってみて、もうちょっと理解が進んだら別途記事を書きたいと思います。



2011-04-09

cocos2dの使いどころ

最近cocos2d+UIKitでゲームアプリを開発していたのですが、どうも遷移、アニメーション、階層構造でハマることがやたら多く、よく考えてみたら今つくってるゲームは弾幕もないしパーティクルもないし遷移エフェクトは必要ないしで、あんまりcocos2dのメリットは享受してないなぁ・・・ってことで結局cocos2dは使用しないという決断に至りました。


「ゲームをつくるならやっぱりゲームエンジン!」と短絡的に思ってしまったが故の判断ミスなので、cocos2dというかOpenGL ESベースのゲームエンジン全般の使いどころについて自分なりに整理してみました。


  • 敵がたくさんでてくるアクション
  • 弾が飛び交うシューティング
  • 何層にも渡る表示
  • cocos2dのトランジションエフェクトやパーティクルを使いたい場合
  • イージングを多用する場合
  • pauseやスコアなどゲームっぽい機能を利用したい場合
  • UIKitっぽいUIが必要ない場合(併用できるけどいろいろ大変)


2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |