ラベル iphone の投稿を表示しています。 すべての投稿を表示
ラベル iphone の投稿を表示しています。 すべての投稿を表示

2012年1月17日火曜日

cocos2dでタワーディフェンス その3


前回の続きです。
前回はCreepクラスを継承して2種類の敵を設定する所まで見ました。

次は、DataModelクラスとWayPointクラスを利用して、敵に動作を与える箇所につて見ていきます。

Creep.mの以下の箇所
- (WayPoint *)getCurrentWaypoint{
 DataModel *m = [DataModel getModel];
 WayPoint *waypoint = (WayPoint *) [m._waypoints objectAtIndex:self.curWaypoint];
 return waypoint;
}

- (WayPoint *)getNextWaypoint{

 DataModel *m = [DataModel getModel];
 int lastWaypoint = m._waypoints.count;
 self.curWaypoint++;
 if (self.curWaypoint > lastWaypoint)
  self.curWaypoint = lastWaypoint - 1;

 WayPoint *waypoint = (WayPoint *) [m._waypoints objectAtIndex:self.curWaypoint];
 return waypoint;
}
「getCurrentWaypoint」は現在のWaypointを取得します。
要は今の敵の位置ですね。

「getNextWaypoint」は次のWaypointを返します。
要は次にどこまで移動するかの情報ですね。

この両メソッドを見てみると、
WayPoint *waypoint = (WayPoint *) [m._waypoints objectAtIndex:self.curWaypoint];
という共通箇所があるのが見れると思います。
ここでは、Creepクラスで保持している「curWaypoint」からwaypointを見つけて返却しています。

次の場所を取得したい場合は、「curWaypoint」の値を増やせばOKです。
ただし、増やした値が配列の最後の値なのかの確認は必要ですが。

配列の末尾の値になったら、「curWaypoint」の値はそれ以上増えません(これ以上移動しないって意味です)。
値を「0」にすると敵はループし続けます。

getNextWaypoint内の
self.curWaypoint = lastWaypoint – 1;

self.curWaypoint = 0;


に変更してみてください。

こうすると、タワーが破壊されない限りWaveが繰り返されます。
「self.curWaypoint = lastWaypoint – 1;」だと、敵が一周すると出てこなくなるのに対して
「self.curWaypoint = 0;」だと一周した後、再び敵が出てくるのがわかりますね。

今回はここまで。
次回はTutorialSceneクラスを見ていきます。

2012年1月11日水曜日

cocos2dでタワーディフェンス その2

今回はDataModelクラスから見ていきましょう。

DataModelクラスはNSCodingを実装したsingletonクラスです。
NSCodingを実装しているのはゲームの現在の状態を保持しておきたいから、
またsingletonにしているのはDataModelクラスはゲーム内に一つしか必要ないからのようです。

どの辺がsingletonかというと、DataModel.mの以下の部分ですね。

+(DataModel*)getModel
{
 if (!_sharedContext) {
  _sharedContext = [[self alloc] init];
 }
 return _sharedContext;
}
この辺の詳細を知りたいならGoogle先生に聞いてくださいまし。
まぁ、Objective-cでsingletonの実装をするなら↑のようになると思ってください。

DataModelクラスを他から呼び出す場合は

DataModel *m = [DataModel getModel];
となりますね。

また、ここでは主要なものは配列で保持しています。コードを見てみましょう。

#import "cocos2d.h"

@interface DataModel : NSObject  {
 CCLayer *_gameLayer;
 NSMutableArray *_targets;
 NSMutableArray *_waypoints;
 NSMutableArray *_waves;
 UIPanGestureRecognizer *_gestureRecognizer;
}

@property (nonatomic, retain) CCLayer *_gameLayer;

@property (nonatomic, retain) NSMutableArray * _targets;
@property (nonatomic, retain) NSMutableArray * _waypoints;
@property (nonatomic, retain) NSMutableArray * _waves;
@property (nonatomic, retain) UIPanGestureRecognizer *_gestureRecognizer;;
+ (DataModel*)getModel;

@end

変数の説明ですが
target は敵ですね(TDのcreepのことです)。
waypoint はそのままです。詳しくは前回の投稿を見てください。
waves は Waveクラス(敵の数とか登場する間隔とかを定義しているクラス)を保持する為の配列です。

そのほかに、DataModelクラスはUIPanGestureRecognizer型とCCLayer型の変数を持っています。
まずCCLayerですが、タッチ入力と加速度センサー入力を受け取るクラスです。
このチュートリアルでは
現在のゲームレイヤーへのポインタで、全てのアクションがここで実行されている
と説明されてます。

UIPanGestureRecognizerはタッチジェスチャーを検出するためのクラスですが、
ここでは
480×320に制限されたゲームのスクリーンをスムーズにスクロールするために使う
みたいな事書いてました(かなり意訳)。

まぁ、そのへんは後々に。


次に「敵」のクラスを見ていきましょう。敵を表すクラスはCreepクラスです。

#import "cocos2d.h"

#import "DataModel.h"
#import "WayPoint.h"

@interface Creep : CCSprite  {
        int _curHp;
 int _moveDuration;
 int _curWaypoint;
}

@property (nonatomic, assign) int hp;
@property (nonatomic, assign) int moveDuration;
@property (nonatomic, assign) int curWaypoint;

- (Creep *) initWithCreep:(Creep *) copyFrom;
- (WayPoint *)getCurrentWaypoint;
- (WayPoint *)getNextWaypoint;

@end

@interface FastRedCreep : Creep {
}
+(id)creep;
@end

@interface StrongGreenCreep : Creep {
}
+(id)creep;
@end


Creepクラスは
・HP(HitPoint)
・敵の速さ
・現在のWayPoint
をそれぞれセットできます。

敵はCreepを継承したものを作成します。
ここでは

・FastRedCreep
  移動スピードは早いが弱い(HPが少ない)敵(赤色)
・StrongGreenCreep
  移動スピードは遅いが強い敵(緑色)

を用意しています。
それではこの敵をどうやって実装していくか実装部分を見ていきましょう。

@implementation FastRedCreep

+ (id)creep {
    FastRedCreep *creep = nil;
    if ((creep = [[[super alloc] initWithFile:@"Enemy1.png"] autorelease])) {
        creep.hp = 10;
        creep.moveDuration = 4;
  creep.curWaypoint = 0;
    }
    return creep;
}

まず、staticメソッドを用意して、ここで敵の設定を行います。
この敵を呼び出すときは

[FastRedCreep creep]

とすることで、すぐに画面に反映されます。
また、このクラスはCCSpriteを継承しているので、その機能を色々使えるようになってます。

ちなみにCCSpriteはcocos2dで画像を表示するためのクラスです。
背景とかキャラクターとかはこのクラスで表示させます。

とりあえず第2回はここまで。
次回は敵が今どこにいるのかを取得する箇所からやってきます。

いやー、意外に時間かかるなー



2012年1月4日水曜日

cocos2dでタワーディフェンス その1


ここは、このページを参考にしてcocos2dを使ってタワーディフェンスゲームを作成していく備忘録です。

このチュートリアルでは、まず以下の事からやっていくようです。

■ waypointの作り方
■ タイルマップを読み込んで、オブジェクトとして扱う方法
■ Creeps/Bad Guys/Enemies (要は侵入者ですか) の作り方
■ 決められた軌道に沿って移動を行う方法
■ iphone上でスムーズに移動を行う方法

これらの事無くしてタワーディフェンスとは言えないらしいですな。
まぁ、第一回目は基本の敵がタイルマップ上の決められたパスに従って移動させる方法の紹介のようですね。

これから解説するソースコードは以下からDLできます。
http://www.iphonegametutorials.com/wp-content/uploads/2011/04/TowerDefensePart1.zip


ここではタイルマップの作成に「Tiles」というツールを使うので以下からインストールします
http://www.mapeditor.org/

あと、cocos2dは必須なんでDLしときましょ。設定の仕方はググッてくだされ。
http://www.cocos2d-iphone.org/


それではDLしたソースの重要なクラスの機能を簡単に紹介

■ TowerDefenseTutorialAppDelegate
このクラスはWindowをつくって、CCDirectorをロードして、最初のシーンを作成するクラスとなります。

■ RootViewController
UIViewControllerを継承してるから、画面の向きを簡単に変えられるますとのこと。
まぁ、ここで画面を横向きにしているんでしょね。多分。

■ GameConfig
この時点では画面の向きに関する基本的な定数しか定義してないですね。
後々いろいろとここで定義するんでしょうな。

■ TutorialScene
一番メインのクラス(色々やってるクラス)みたいですね。
ここではマップを読み込んで「creep」(敵ですね。あとで説明します)をパスにセットするみたいですね。

■ DataModel
簡易検索のためのメインデータの配列を格納しておくシンプルなModelインターフェースらしいです。

■ Creep
敵クラスです。はじめは2種類ですが、後々増えてくるみたいです。

■ Waypoint
タイルマップエディタと組み合わせて使用する単純なクラス。
このクラスで「Tiles」と連携するんでしょうかね。

■ Wave
「creep(敵)」の順番を制御するクラスですね。

とりあえずこんな感じのようです。
説明で、「creep」って出てきたと思いますが、タワーディフェンス(以下 TD)には色々用語があります。

覚えておくとクラス名とかから、何をしているのか想像しやすくなるので解説しておきます。

■ wave
敵の隊列。TD系のゲームではwave=ステージやレベルとなることが多いです。

■ creep、bad guy
敵ですね。

■ range
砲台の射程距離です。

■ upgrade
砲台を強化することです。
3段階まで強化できるのをよく見かけます。

■ waypoint
敵が通る順路です。
たいての場合、敵がどこを通るかが何らかの方法で示されています(道が光ったり)。

あと色々あったと思うんですが、思い出し次第書いていこうかと思います。

とりあえず今回はここまで。
次回から実装の方に入っていきたいと思います。

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。。。。
どのサイトみてもこんな事書いていない。

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


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

2010年12月5日日曜日

iPhoneアプリの売上の締め日

さて、開発を初めて一年。citiバンクからは
「全然振込みないし預金もないけど、使わないんだったら口座を解約するぞ」
という感じの厳しい連絡をいただきながら、
それでもめげずに頑張って、やっとそれなりの数のDLをして頂けるようになり、初めて銀行振込される「はず」という期待に胸を膨らませている今日この頃。

ふと「appleって何日締めなの?」って疑問が湧いてきました。
毎月メールで「iTunes Connect Financial Report」なるものが届いていたんですが、
振り込まれるほどDLされてなかったので気にしていませんでした。

ってなわけで、改めてメールが届いている日をみると
  • 2/20
  • 3/23
  • 4/27
  • 5/25
  • 6/19 
  • 7/31
ってな感じ。。。あれ?全然バラバラ。
けどなんとなく月末っぽいな。って思ってたらここ最近は
  • 9/4
  • 10/1
  • 11/5
めっちゃ月初にメールきとる。
ここである推測がでてきました。

決まった締め日って無いのでは???まさかappleの気分次第??

とりあえずここはgoogle先生に聞くしか無いってことで
検索してみたんですが、答えがでてこない。
キーワードをいろいろ変えながら何回も検索して、やっとそれっぽいやりとりを2chで発見。

450:名称未設定:2009/12/22(火) 10:47:08
>>449 締め日なんてない。 いつ支払われるかは、アップルと銀行次第。
451:名称未設定:2009/12/23(水) 01:50:00
>>450 それは怖いですね……。 ありがとうございました。

やっぱりそうなのね。。。
気長に待つしか無いようです。


追記

@SlideCalcさんから締日についてコメント頂きました。
それによると、Fiscal Calendarの最終日の翌週の木曜日あたりにレポートが届くようですねー。
ありがとうございましたー

2010年11月8日月曜日

iTunes Connectの「Sales and Trends」

自作のiPhoneアプリのDL数を見るのは、

Sales and Trends Sales and Trends

なんですが、これって昨日の売上がいつ反映されるか知りませんでした。

なんとなく2日後の朝に確認する感じでしたが、これって
昨日のDL数の反映は22時頃に更新されるんですねー。

追記:遅くとも22時頃でした。早いときは19時には反映されていました。。。

知らんかった。
そういえば、アップルからの振込の最低ラインが変更になったみたいですね。
どこにも、いくらで振り込まれるとは書いてないですが(見つけられないだけ?)

1万円強で振り込まれるようです。
これも知らんかった。メールが来てたのに無視してました。。。

メールは重要な事が多いので見るように心がけます。

2010年10月27日水曜日

performSelector:withObject:afterDelay:

iPhoneアプリ開発してて、遅延実行が必要になったので色々調べてたんですが、そこでperformSelectorなるメソッドを見つけたんですが、みなさん小難しい言葉で書いておられ、
第二引数(withObject)って何?とか結構悩んだので(読解力の無さは置いといて)、私なりに簡単にまとめときます。

iPhoneアプリ作ってると、何かちょっとこの動作遅らせて実行したいってときがあるかもしれません。たとえば、1秒後に今表示している画像をフェードアウトさせたいとか。

こんな時に思いつくのがNSTimerなんですが、performSelectorを使うともう少しシンプルに実装できます。

こんな感じ。

[self performSelector:@selector(methodHoge:) withObject:nil afterDelay:0.1];

これだと、「methodHoge」を0.1秒後に実行しまっせ。って事になります。

第二引数の「withObject:nil」なんですが、これはmethodHogeに引数が必要な場合に使います。たとえば

-(void)methodHoge:(NSString *)msg {

みたいな感じなら

[self performSelector:@selector(methodHoge:) withObject:@"オラオラ" afterDelay:0.1];
となります。

おもいっきり簡単に言うとこれだけ。
これだけの事なのに30分ぐらいGoogle先生を見つめてましたorz。

2010年10月12日火曜日

Prepare for Upload

画像を90度づつ回転させて、保存するアプリをアップルに申請中。ただいまの状態は「Prepare for Upload」です。

この「Prepare for Upload」って状態、まだ全然アップ作業が終わってない状態なので注意して下さい。これで安心してたらいつまでたってもレビューしてもらえませんよ(経験者)。

今一度、itunes connectに戻ってちょいと作業すると「waiting for upload」になって、
それから圧縮したアプリをUPして初めて「Waiting For Review」となります。

無料でリリースしようとおもったのですが、やっぱやめました。¥115です。すんません・・・
とりあえずアプリの説明でも書いていますが、現状は上記機能しかありませんが、どんどんと画像系の機能を追加させていきたいと思ってますんで、よかったらDLして下さいませ。
Ready for Sale」になったら名前を発表します。

画像系で欲しい機能がありましたら、ここにコメント頂くか、レビューに書いて下さい。自分の力量で可能だと判断したらどんどん作成していきますので。