自キャラの出し分け

kobold2dのサンプルに入っていたParallax-Side-Scrollerを改造して自分のゲームにしている件です。
前回、背景画像をスプライトシートから設置しました
今回は、表示する自キャラに基地を追加します。

まず、元々のEnemyCache.mやEnemyEntity.mを直接修正してしまったので、修正前のファイルを開いて内容を確認します。

EnemyCache.mのinitBasesでは、switchのcaseを増やします。

switch (i)
{
	case city:
		capacity = 4;
		break;
                
	case base:
		capacity = 4;
		break;

同じく、EnemyEntity.mのinitWithTypeでもswitchのcaseを増やします。

switch (type)
{
	case city:
		baseFrameName = @"city.swf/0000";
		break;
            
	case base:
		baseFrameName = @"base.swf/0000";
		break;

実は、少し前に基地の画像をスプライトシートに入れていました。その名前を追加しただけです。

あと、EnemyEntity.hのtypeof enumでbaseを追加します。

typedef enum
{
    city =0,
    base,
	BaseType_MAX,
} BaseTypes;

忘れちゃいけないのは基地の設置座標です。

int city_point[8][2] = {
    {30,20},//福岡
    {120,31},//大阪
    {200,36},//東京
    {230,84}//札幌
    {70,34},//広島
    {160,40},//名古屋
    {230,60},//宮城
    {280,100}//網走
};

配列に加えました。
これでRunしてみると、、、

130522 0002
都市と基地が被ってしまいました。

それもそのはずです。BaseCache.mのinitBasesで設置の2重forを回していたので、baseIDの数値jは4回でリセットされてしまいます。

for (int i = 0; i < BaseType_MAX; i++)
{
	CCArray* basesOfType = [bases objectAtIndex:i];
	int numBasesOfType = [basesOfType capacity];//その種類の自キャラの順番番号
		
	for (int j = 0; j < numBasesOfType; j++)
	{//ここで生成する
		BaseEntity* base = [BaseEntity baseWithType:i :j];

jが通しで8になると勘違いしてました。

int city_point[4][2] = {
    {30,20},//福岡
    {120,31},//大阪
    {200,36},//東京
    {230,84}//札幌
};

int base_point[4][2] = {
    {70,34},//広島
    {160,40},//名古屋
    {230,60},//宮城
    {280,100}//網走
};

仕方が無いので、座標の配列を2つにします。
この時、本当は少し悩みました。都市と基地を各Entityクラスで分けてbaseCacheクラスから呼び分けすれば、もっとスマートに管理できるのではないんじゃないかと。。。
でも、自分が今持っているスキルでスグに解決できる方法で進めることにしました。

座標の配列を分けたので、今のやり方だとBaseEntity.mのspawnメソッドで自キャラの判別を行う必要があります。

-(void) spawn:(BaseTypes)baseType :(int)baseID//引数を増やしたら.hでも宣言しないと
{
    float xPos;
    float yPos;
    
    switch (baseType) {
        case city:
            xPos = city_point[baseID][0];
            yPos = city_point[baseID][1];
            break;
            
        case base:
            xPos = base_point[baseID][0];
            yPos = base_point[baseID][1];
            break;
            
        default:
            break;
    }

spawnメソッドの引数を増やしてbaseTypeを受け取れるようにしました。また、switchで参照する配列を変更しています。

[self spawn:baseType :baseID];

同じBaseEntity.mのinitWithTypeでspawnをコールする時も引数としてbaseTypeを与えるように変更します。

-(void) spawn:(BaseTypes)baseType :(int)baseID;

少し躓いたのが、BaseEntity,hでspawnの宣言にも引数を加え忘れていたことです。これをしないと、Incomplete Implementationの警告が出ます。

130522 0003
これで期待通りの配置になりました。
ただ、自キャラが敵キャラの上に重なってレイヤー順がイマイチです。

GameLayer.mのinitメソッドで、敵キャラと自キャラのレイヤー順を変えておきました。

EnemyCache* enemyCache = [EnemyCache node];
[self addChild:enemyCache z:100 tag:GameSceneNodeTagEnemyCache];
        
BaseCache* baseCache = [BaseCache node];
[self addChild:baseCache z:50 tag:GameSceneNodeTagBaseCache];

130522 0005
これでバッチリです。
次は、敵キャラを自キャラへ誘導したいと思います。