Twitterとcocos2d ① ~Twitter APIの導入~

今週のお題「夏休みの自由研究」

iOS5以上からTwitterの導入が簡単になったという事でAPIを使ってTimelineの表示などやってみたいと思います。

元となるTwitter公式のFramework説明のサイトはこちらです


ではまずTwitterを使うにあたっての準備,Frameworkを入れるところから始めたいと思います。

Xcodeプロジェクトを作成(自分の場合はcocos2d v2.0のテンプレートで)したら,

[xcodeプロジェクト]→[TARGETS]→[Linked Frameworks and Libraries]
のところで[+]を押すとFrameworkが追加出来るので,Twitter.frameworkでAddを押し,追加します。

ここ一つのアカウントのTimelineの表示ならこれでいいですがHome tumelineの表示にはAccount.frameworkも必要となります。
とりあえず追加しておいて問題ないでしょう。

次にプロジェクトの中でTwitter情報を取得したいところでFrameworkの情報を呼び出します

//TwitterAPI使うなら必須
#import <Twitter/Twitter.h>
//必要なときに追加
#import <Accounts/Accounts.h>

あとはcodingして情報を呼び出します。

次回は,Tweet sheet(つぶやき画面表示)と,Timeline情報取得をします。

cocos2d v2.0 released !【インストール】

7月9日にcocos2d v2.0が正式releaseされました

そこで改めてインストールの方法です。

まず,cocos2d-iphone-2.0.tar.gzをダウンロードします

ダウンロードが完了したらターミナルを開いて以下の方法でインストールしましょう

cocos2d-iphone-2.0.tar.gzがあるディレクトリに移動します
$ cd /Users/NAME/Downloads/

tar.gzファイルを解凍します
$ tar xvzf cocos2d-iphone-2.0.tar.gz

解凍が終わったらディレクトリを移動します
$ cd cocos2d-iphone-2.0/

インストールします
(v2.0が初めての場合)
$ ./install-templates.sh
(v2.0のbeta版をインストール済みの場合)
$ ./install-templates.sh -f

以上でインストール完了です
Xcodeを再起動して新しいプロジェクト作成で確認します

cocos2dの使い方【説明】③ 〜ScheduleとAction〜

cocos2dでものを動かすアクションをしたい時。
前作ったコードではScheduleというTimerで少しずつ座標の値をずらす事で動かしていましたが,今回はcocos2dに本来から備わっている,いろいろな動きを使ってみます。
それがActionな訳ですが,使い方は至って簡単です。
例えば画像をまっすぐ定速で動かしたければ,

ActionLayer.m

#import "ActionLayer.h"

@interface ActionLayer(){
}
@property (assign) CGSize screenSize;
@property (nonatomic, assign) CCSprite *square;
@end

@implementation ActionLayer
@synthesize screenSize, square;

- (id)init{
    if (self = [super init]) {
        screenSize = [CCDirector sharedDirector].winSize;
        square = [CCSprite spriteWithFile:@"square.png"];
        square.scale = 0.1;
        square.position = ccp(50, screenSize.height/2);
        //ここに[Actionしたい対象 runAction:アクション];でアクションする事が出来ます。
        [square runAction:[CCMoveTo actionWithDuration:2 position:ccp(300, square.position.y)]];
        [self addChild:square];
    }
    return self;
}

@end

アクションの一覧に関しては,実際にCCActionIntervalクラスを見てもらえれば全て書かれていますが,日本語の説明のあるサイトもありますのでそちらを参考にしてみて下さい。
(例えば : http://www.itassist.info/modules/blog/archives/489)

アクションでは連続で違うアクションをする,同時にアクションをする,ループするなどをすることもできます。ゲームでは使う事が多くなると思います。

適当に書いたものですが,

        float durationTime = 2;
        [square runAction:[CCSequence actions:
                           [CCSpawn actions:[CCMoveTo actionWithDuration:durationTime position:ccp(300, square.position.y)], [CCScaleBy actionWithDuration:durationTime scale:.5f], nil], [CCScaleBy actionWithDuration:1 scale:2], nil]];

と書くことでCCSequenceは順番にアクションし,CCSpawnは同時にアクションします。

ただこれだと見づらいのでアクションは分けて書いても大丈夫です。メモリ管理には気をつけなければいけませんが...

        float durationTime = 2;
        //わからない時はid型でも大丈夫ですが今回はCCActionInterval*型で。
        CCActionInterval *act1 = [CCSpawn actions:[CCMoveTo actionWithDuration:durationTime position:ccp(300, square.position.y)], [CCScaleBy actionWithDuration:durationTime scale:.5f], nil];
        CCActionInterval *act2 = [CCScaleBy actionWithDuration:1 scale:2];
        [square runAction:[CCSequence actions:act1, act2, nil]];

このくらいになら分けてもいいかもしれません。

次回からはこれらをどのように使うか実践したいと思います。

@property の使い方

前記事で説明したカプセル化ですが,実装しようとすると結構大変なのは見ればわかります。そこでpropertyという機能を使う事により典型的なアクセサメソッドの宣言,定義が行えるのです。

- (int) width;
- (int) height
- (NSString *) filename;
- (void) setFilename:(NSString *) newFilename

アクセサメソッドの宣言もproperyを使えば,

@property (readonly) int width,height;
@property (readwrite, assign) NSString *filename;

で済む。メソッドの定義も

- (int) width{
   return width;
}
- (int) height{
   return height;
}
- (NSString *) filename{
   return filename;
}
- (void) setFilename:(NSString *) newfilename{
   filename = [NSString stringWithString: newFilename];
}

から,

@synthesize width, height, filename;

で完了ということだ。

上記の使い方を見ると疑問に思う点として@property(...) と()の中に書かれているものがある。
この中に書いてあるものをpropertyの属性を呼び,これでアクセサメソッドの定義内容が指定できる。



属性一覧(非ARC)

アクセサメソッド名の指定

  • getter =ゲッター名
  • setter =セッター名

 特にアクセサメソッド名の指定が必要なときに使う。

読込書込の有効性

  • readonly

 読み込み専用なので,アクセサメソッドがゲッターしか定義しない。

  • readwrite

 書き込みも可能にするため,セッター,ゲッターが共に定義される。

メモリ管理(書込が有効な時)

  • assign

 オブジェクトアドレスのコピー。他でreleaseすると使えなくなる。

  • retain

 オブジェクトのアドレスコピー。オブジェクトのメモリ管理カウントを増やす。(他でreleaseされても自分が使っているとカウントしてあるので,実質解放されていない。)

  • copy

  別のアドレスにオブジェクトごとコピー。 同じものを別々のオブジェクトとして利用したい場合に使う。

平行計算の有効性

  • atomic

 シングルスレッドで動作する。

  • nonatomic

 マルチスレッドで動作する。

カプセル化とアクセサ

iPhoneアプリの開発でObjective-Cを利用している時,インスタンス変数の管理はどうしているだろうか。
例えば,

@interface file : NSObjet{
@public
   int width;
   int height;
   NSString *filename
}
@end

という風にすると変数に直接参照されて間違った変更などにより矛盾などが起きる可能性があったりする。
これらを起きない様にするためカプセル化する。interface内で,

@interface file : NSObjet{
@private
   int width;
   int height;
   NSString *filename
}
- (int) width;
- (int) height
- (NSString *) filename;
- (void) setFilename:(NSString *) newFilename
@end

とアクセサメソッドの宣言をして,implementation内で,

- (int) width{
   return width;
}
- (int) height{
   return height;
}
- (NSString *) filename{
   return filename;
}
- (void) setFilename:(NSString *) newfilename{
   filename = [NSString stringWithString: newFilename];
}

と定義する事で他のクラスからもアクセスできる様にすることができる。

Gitと共同開発

Gitを使った共同開発のやり方について実際これからやってみるものです。
Gitを使用するにあたって手軽に利用できるgithubというGitホスティングサイトを利用していく。

まず,プログラムは常にビルドできる状態にしておきます。
Gitのブランチ機能を利用して,masterから編集する前に新しいブランチ(develop)をきって,編集し,ここで問題点(issue)の改善をします
その後マージするのではなく,ここで共同開発する際に使える,githubのPullRequestというシステムを使うのが便利である。
ここでPullRequestをして自分以外の共同開発者が確認してその人がdevelopにマージし,問題解決をしたと報告する。




参考URL : http://git-scm.com/book/ja

GitとObjective-C

iPhoneアプリを開発している時,個人の場合もグループの場合もバージョン管理は大事になると思います。バックアップを毎回取るのではなくバージョン管理システムで管理することが大事です。

XcodeにはGitが連携されてるのでGitを利用して管理する。アプリ開発で利用しているObjective-C言語はオブジェクティブ指向であり,クラス毎に同時に複数人で開発できる。GItは分散型管理方式でオブジェト指向プログラミングなので共同開発に適してる。

Gitのワークフロー

  1. リポジトリの複製の作成,クローン(clone)
  2. コミット(commit)
  3. プッシュ(push) / プル(pull)

分散型管理方式は中央レポジトリを直接書き換えるのではなく,各々がローカルレポジトリとしてレポジトリを持ち,最初クローンして変更した箇所をコミット(ローカルで変更)してプッシュ(中央レポジトリに送る)する。他の人が編集したものはプルして更新できる。

参考URL http://www.atmarkit.co.jp/fjava/rensai4/devtool03/devtool03_1.html