2011年11月28日月曜日

やっと

ちょっと私事なんですが、引越しして約2ヶ月やっとWEB環境が整いました。。。 
これからやっとTowerDefenceのチュートリアルやってきます。 

Xcodeも最新版DLしないと。 

WEB環境ってなくても問題ないって思ってたけど、意外に何もできませんね。 
いつも野良電波をキャッチしてたので、思わず使おうかと何度おもって何度自分を戒めた事か。 コレから頑張りまっせー。



2011年10月4日火曜日

cocos2dでTowerDefence系のアプリをつくってみる




最近あるアプリを作成する為にcocos2dを勉強し始めたんですが、

cocos2dのチュートリアルって色々面白そうなのがたくさんありまして

そのなかでも、

iPhone Game Tutorials

↑のサイトが非常に参考になるので、勉強を兼ねてこのサイトで紹介されている

「タワーディフェンス」のチュートリアルをまとめていこうと思った次第です。


はっきり言いまして、あまり時間がとれないので中々まとめられないかもしれませんが
頑張ってみようかと思います。


とりあえず今んとこの目標として

・今年中にβ版、もしくはFREE版をリリースする
・有料版をリリースする
・ステージいくつかまとめたパック販売する
・売上で車買うw

とでもしときましょうか。

ま、タイトルにもありますがあくまで備忘録なんで、あせらずゆっくりとやってこうかなと。

2011年7月7日木曜日

CGImageをIplImageに変換する

久しぶりの投稿。

OpenCVをつかったiPhoneのカメラアプリを作成しているのですが、
OpenCVで扱える画像はIplImageという型なのでCGImageをそれに変換する必要があります。

そのサンプルが以下の部分。
(まぁ、本来はもっと色々と実装があるのですが。)

IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
cvCvtColor(iplimage, ret, CV_RGBA2BGR);
cvReleaseImage(&iplimage);


どのサンプルを見てもこうなんですよね。


ただ、私の環境でこの実装をすると、黄色が青色に変換されるんですよね。
どう考えてもRGBの値がおかしい感じ。

アバターカメラ って名前で出すのであればこれでいいかもって写真になるんですよねー









 











なんでこうなるのか悩んだんですが、

結局
「CV_RGBA2BGR」の箇所を「CV_RGBA2RGB

にしないとダメみたいなんですよ。


というのも、「iPhoneデジカメプログラミング」って本を見ると
やっぱり
「CV_RGBA2BGR」
ってなってるワケですが、サンプルのXCodeプロジェクトをDLして見てみると

「CV_RGBA2RGB

ってなってたわけで。

ただ、他のサイトが書いている事が間違いとは思えないので
iphone用にコンパイル済みのOpenCVを使ってるのが原因かも。。。

詳細知っている方は教えてください。

2011年4月29日金曜日

NSMutableArrayにCGPointを入れる

グラフを作成するのにNSMutableArrayにCGPointを入れときたかったので調べてみた。

NSMutableArrayにCGPointを追加する
NSMutableArray *points = [[NSMutableArray alloc] init];
CGPoint point = CGPointMake(100,100);
[points addObject:[NSValue valueWithCGPoint:point]];


NSMutableArrayからCGPointを取り出す

NSValue* value = [points objectAtIndex:0];
CGPoint point2 = [value CGPointValue];


こんな感じ。
NSValueは意外に色々使いますな。



2011年3月10日木曜日

UIImageViewとNSCoding

NSCodingを使って独自Classを保存しようとしたらエラーに。

↓クラスはこんな感じのクラス
-------------------------------------------------
#import <Foundation/Foundation.h>

@interface ArchiveObject : NSObject <NSCoding> {
    NSString *string01;
    UIImageView *imageView;   
}

@property (nonatomic, retain) NSString *string01;
@property (nonatomic, retain) UIImageView *imageView;

@end
-------------------------------------------------
もちろん

- (void)encodeWithCoder:(NSCoder*)coder
- (id)initWithCoder:(NSCoder*)coder

は実装してますよ、はい。

まぁ、このクラスをエンコードしようとすると、
以下のエラーが

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage encodeWithCoder:]: unrecognized selector sent to instance xxxxxx'

ふーん。。。。。
って、え?UIImageってNSCoding実装してないのかよ!
んなわけないだろって思いつつ、UIImage.hをみてみると

@interface UIImage : NSObject {

。。。。ガボーン

悩みました。


要は
@interface UIImage : NSObject <NSCoding> {
こうなって欲しいんですよ。(もちろんメソッドも実装するとして)

で、閃きました。

カテゴリや!

なんか昔に
UIImage+crop.h
みたいなクラス見た事ある!

カテゴリに関しての詳細はググッてください。

というわけで、UIImageにNSCodingの機能を追加したクラスを作成

UIImage+NSCoding.h
-------------------------------------------------
#import <Foundation/Foundation.h>

@interface UIImageNSCoding <NSCoding>
- (id)initWithCoder:(NSCoder *)decoder;
- (void)encodeWithCoder:(NSCoder *)encoder;
@end


UIImage+NSCoding.m
-------------------------------------------------
#import "UIImage+NSCoding.h"

@implementation UIImage(NSCoding)

- (id)initWithCoder:(NSCoder *)decoder {
    if ((self = [super init])) {
        NSData *data = [decoder decodeObjectForKey:@"UIImage"];
        self = [self initWithData:data];
    }
  
    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    NSData *data = UIImagePNGRepresentation(self);
    [encoder encodeObject:data forKey:@"UIImage"];
}

@end

これで、UIImageにNSCodingの実装を追加できました。
おしまい。

あとはこんな感じかな(結構適当)
エンコード、デコードするだけ

- (IBAction)save {
    ArchiveObject *object = [[ArchiveObject alloc] init];
    object.string01 = @"hoge";
    object.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"hoge.png"]];
   
    NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.dat"];
    [NSKeyedArchiver archiveRootObject:object toFile:dataPath];
}

- (IBAction)load {
    NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/data.dat"];
    ArchiveObject *loadData = [NSKeyedUnarchiver unarchiveObjectWithFile:dataPath];
   
    loadDataからゴニョゴニョ。。。。
    localImageView.image = loadData.imageView.image; とか
}


とりあえず、UIImageViewを含む独自クラスのエンコード/デコードに成功しました。



2011年2月14日月曜日

AdMobでどれくらいの収入になるのか?

さて、AdMobを導入した iphoneアプリ「学歴計算機」をリリースして約1ヶ月が経過しました。
ブログ内でも紹介していますが、この「学歴計算機」は3枚構成の画面になっています。
その内、アプリを起動すると必ず表示される画面(生年月日を入力する画面)にAdMobの広告バナーを貼りました。

リリースから今までのDL数は 2,813

AdMobは自分のアプリで、自分の他のアプリの宣伝を何%表示させるか設定できます。
その設定を25%に設定。

つまり、広告が表示される4回に1回は自分の別アプリの宣伝となり
広告収入はありません。

それでは、この状態でどれくらいの収入があるのでしょうか??

答えは。。。。。






さて、この数字を多いと取るか少ないと取るかはあなた次第です。

AdMobがいいと思うのは
自分のアプリ内なら自分の他のアプリが無料で宣伝できる所です。

例えば、広告を100%自分のアプリの広告にするように設定します。

2813人の約1%にあたる28人のユーザが
私の他の有料アプリ(115円の内利益は81円) をDLしてくれると

2,268円の収入になります。

どうですか
こう考えると、AdMobも捨てたもんじゃないと思いませんか?

広告収入だけで考えると、TGAdという広告ネットワークの方が
収入は多くなるような気がしますね。
(クリック収入ではなく表示収入なので。これはまたの機会に)

どちらにせよ、広告収入だけをアテにするなら
色々と考える必要があると思います。

特に、私が今回広告を入れたアプリのように

DL後1度程度しか起動されないであろうアプリではダメって事ですね。(当たり前。。。)



2011年1月14日金曜日

iPhoneアプリにAdMob導入してみたら。。。

iAdがまだ日本で始まらないので、とりあえずAdMobをアプリに導入して広告収入でウハウハしようとしたんですが、手順書(IBを使う方法)をどうりにしても広告が一切表示されないという状態に陥りました。

まぁ、結果からいうと手順書なのに手順が足りないってことです。

SDKにあるサンプルを見たところ、以下のオレンジの箇所が足りないですね。

広告を表示させるIBのxibを持っているcontrollerのヘッダに

#import "AdViewController.h"



@interface xxxx {
   AdViewController *adViewController;
}

を追加。
あと、この実装ファイルに

#import "AdMobView.h"

@implementation xxxx
@synthesize adViewController;


正直、これを気づくのに2時間近く費やしていますorz。。。。
どのサイトみてもこんな事書いていない。

これで動いたって言ってるのは何で??


もし悩んでる方の助けになれば嬉しいですねー。

2011年1月2日日曜日

「学歴計算機」アップルへの申請完了

とりあえず正月休みに何か一つアプリを作成しようと、以前からちょくちょく書いていたネタ帳を広げて3時間以内(これだけしか時間が取れない)に作成できるアプリを探しました。

まぁ、そのなかで唯一3時間以内で完成しそうだったのが「学歴計算機」。

ただ単に、誕生日を入力すると、中学校卒業からの学歴が表示されるってアプリ。
自分自身が浪人しているのと、高専卒の友人が以前「高専卒に対応した学歴票なくて面倒」と言っていたのを考慮して、

・3浪まで選択可能
・高卒か高専卒か選択できる

という機能を組み込みました。
作成段階でさらに

・医学部卒とか、短大卒とか1年制の専門学校卒の人に対応
・大学や短大や専門学校を卒業後に院や専門学校へ入学した人にも対応

という上記の機能も追加したくなったので追加しました。
この二つの機能が余計で、以外に2時間以上時間を使ってしまったんですが、なんとか完成し申請しました。

履歴書書く時があれば使ってみてください。
一応個人で初めてアプリに広告をつけてみたので、その収入も公開しようかと思っています。