2013-05-09 1 views
-1

Я пытаюсь добавить Sprite рядом с игроком, но только когда Плитка рядом с игроком НЕ является Стеной. Я знаю, что Плиточные плитки работают должным образом, так как они выполняют свою работу в этом методе:Добавление CCSprite на свойства плиточной черепицы

CGPoint p = CGPointMake(tileCoord.x, tileCoord.y - 1); 
if ([self isValidTileCoord:p] && ![self isWallAtTileCoord:p]) { 
    [tmp addObject:[NSValue valueWithCGPoint:p]]; 
    t = YES; 

Я проверка Tiled по координате с этими двумя методами:

-(BOOL)isProp:(NSString*)prop atTileCoord:(CGPoint)tileCoord forLayer:(CCTMXLayer *)layer { 
if (![self isValidTileCoord:tileCoord]) return NO; 
int gid = [layer tileGIDAt:tileCoord]; 
NSDictionary * properties = [_tileMap propertiesForGID:gid]; 
if (properties == nil) return NO;  
return [properties objectForKey:prop] != nil; 
} 



-(BOOL)isWallAtTileCoord:(CGPoint)tileCoord { 
return [self isProp:@"Wall" atTileCoord:tileCoord forLayer:_bgLayer]; 
} 

(Спасибо RayWenderlich)

И мой код для добавления спрайта

CGPoint tileCoord = ccp(_player.position.x - 24 +60, player.position.y); 
CGPoint cTileCoord = [self tileCoordForPosition:tileCoord]; 

NSLog(@" t: %@, c: %@", 
    CGPointCreateDictionaryRepresentation(tileCoord), 
    CGPointCreateDictionaryRepresentation(cTileCoord) 
    ); 

if (![self isWallAtTileCoord:cTileCoord]) 
{ 
    NSLog(@"False"); 
    circle1.position = ccp(_player.position.x - 24 +60, _player.position.y); 
    [self addChild:circle1]; 

} 
else 
{ 
    NSLog(@"True"); 
} 

То, что я хочу, чтобы это сделать добавьте только Circle1 спрайт слева от плеера, если там нет плитки Wall. Проблема в том, что этот код всегда обнаруживает ложь, независимо от того, есть ли там стена или нет. Любой из вас, ребята, понимает, почему он не обнаруживает стены должным образом и как я могу это исправить?

+0

Ну, чтобы спросить очевидное, проверили ли вы, чтобы ваши «стены» были на «_bgLayer» и что они имеют точное свойство «Wall» установить значение True? – stenger96

+0

И если это так, я бы NSLog позицию, в которой вы пытаетесь добавить спрайт (не координаты точки плитки), а затем NSLog координаты точки плитки, которая проходит проверку в 'isProp'. – stenger96

+0

@ stenger96 Все это записывает то же самое .. http://pastebin.com/10AqetvC –

ответ

1

Вы должны проверить, если ваша карта плитка имеет правильные настройки слоя. Я сделал ошибку с этим однажды, легко забыть

2

В прошлом году я также наблюдал такую ​​же проблему в режиме сетчатки. Он работал в сетчатке, но не обнаруживался в режиме сетчатки.

Так что, наконец, используемый пользовательский словарь для проверки края плитки. Целочисленное сравнение занимает меньше процессорного времени, чем сравнение строк. Поэтому заменил его перечислением.

Ищите этот подход, только если ни один другой простой способ не работал.

Я использовал этот код, чтобы найти край плитки, который установлен в мета-свойство.

typedef enum GRID_TYPE{ 
    kGrideType_Normal = 4001, 
    kGrideType_Collidable, 
    kGrideType_Collectable,  
    kGrideType_Sea, 
    kGrideType_Edge, 
    kGrideType_enemy, 
    kGrideType_gold, 

}GridType; 

// Init tilemap и сетки типа

tileMap.meta = [tileMap layerNamed:PP_TILE_META_LAYER]; 
[tileMap initTileAnimation]; 

// Где-то в коде

CGPoint point = [self getTileCoordForPosition:position]; 

GridType type = [self getTileType:point]; 

if(type == kGrideType_Edge) 
{ 
    //touched edge tile.... 
} 

Функции:

-(GridType)getTileType:(CGPoint)pos 
{   
// not defined USE_COCOS2D_FOR_TILE_IDENTIFICATION 

#ifdef USE_COCOS2D_FOR_TILE_IDENTIFICATION 
    GridType type = kGrideType_Normal; 

    CGPoint tileCoord = position;//[self tileCoordForPosition:position]; 
    unsigned int tileGid = [self.meta tileGIDAt:tileCoord]; 
    if (tileGid) { 
     NSDictionary *properties = [self propertiesForGID:tileGid];   
     if (properties) 
     { 
      NSString *collision = [properties valueForKey:TILE_PROPERTY_COLLIDABLE]; 

      if (collision && [collision caseInsensitiveCompare:@"true"] == NSOrderedSame) 
      { 
       type = kGrideType_Collidable ; 
      } 
      NSString *collectable = [properties valueForKey:TILE_PROPERTY_COLLECTABLE]; 
      if (collectable && [collectable caseInsensitiveCompare:@"true"] == NSOrderedSame) { 
       type = kGrideType_Coin ; 
      } 

      NSString *collectable = [properties valueForKey:TILE_PROPERTY_CHEST]; 
      if (collectable && [collectable caseInsensitiveCompare:@"true"] == NSOrderedSame) { 
       type = kGrideType_Chest ; 
      } 

     } 
    } 
    return type;  
#else 
    int type = [[mTileInfoDict objectForKey:[NSString stringWithFormat:@"TILE(%d,%d)", (int)pos.x,(int)pos.y]] intValue]; 

    GridType gType = kGrideType_Normal; 

    if(type!=0) 
     gType = (GridType)type; 

    return (GridType)gType; 
#endif 
} 



-(void)initTileAnimation 
{  
    mTileInfoDict = [[NSMutableDictionary alloc] init]; 

    //Parse all the tile in map 

    mBgLayer = [self layerNamed:PP_TILE_MAP_BG_LAYER]; 

    int rowSize = self.mapSize.width ; 
    int colSize = self.mapSize.height ; 

    for(int x=0; x<rowSize; x++) 
    { 
     for (int y=0; y<colSize; y++) 
     { 
      CGPoint tileCord = ccp(x,y) ; 


      NSString *key = [NSString stringWithFormat:@"TILE(%d,%d)", (int)tileCord.x,(int)tileCord.y]; 


      GridType tileType = kGrideType_Normal; 

      unsigned int tileGid = [self.meta tileGIDAt:tileCord]; 


      if (tileGid) 
      { 
       NSDictionary *properties = [self propertiesForGID:tileGid]; 

       if (properties) 
       {   
        /* Check Tile : IS SEA - TILE */ 


        NSString *sea = [properties valueForKey:TILE_PROPERTY_SEA]; 

        if (sea && [sea isEqualToString:@"true"]) 
        { 
         tileType = kGrideType_Sea; 

         [mTileInfoDict setObject:[NSNumber numberWithInt:tileType] forKey:key]; 

         continue; 
        } 

        /* Check Tile : IS Inky - TILE */ 



        /* Check Tile : IS COLLECTABLE - COIN */ 

        NSString *collectable = [properties valueForKey:TILE_PROPERTY_COLLECTABLE]; 

        if (collectable && [collectable isEqualToString:@"true"]) 
        { 
         tileType = kGrideType_Collectable; 

         [mTileInfoDict setObject:[NSNumber numberWithInt:tileType] forKey:key]; 

         PPCoins *coinSprite = [PPCoins spriteWithSpriteFrameName:@"coin_0000.png"]; 
         coinSprite.tag = kTagCoinSprite; 
         coinSprite.anchorPoint = ccp(0.5f,0.5f); 

         CCSprite *sprite = [mBgLayer tileAt:tileCord]; 

         coinSprite.position = ccp(sprite.position.x+coinSprite.contentSize.width*0.5f, sprite.position.y+coinSprite.contentSize.height*0.5f) ; 

         [self addChild:coinSprite z:3 tag:kTagCoinSprite]; 
         [coinSprite runAnimation]; 

         { 
          coinSprite.key = key; 
          [mCoinDict setObject:coinSprite forKey:key]; 
         } 
         continue; 
        } 



        /* Check Tile : IS COLLIDABLE - TILE */ 

        NSString *collidable = [properties valueForKey:TILE_PROPERTY_COLLIDABLE]; 

        if (collidable && [collidable isEqualToString:@"true"]) 
        { 
         tileType = kGrideType_Collidable; 

         [mTileInfoDict setObject:[NSNumber numberWithInt:tileType] forKey:key]; 

         continue; 
        } 

        /* Check Tile : IS Edge - TILE */ 

        NSString *edge = [properties valueForKey:TILE_PROPERTY_EDGE]; 

        if (edge && [edge isEqualToString:@"true"]) 
        { 
         tileType = kGrideType_Edge; 

         [mTileInfoDict setObject:[NSNumber numberWithInt:tileType] forKey:key]; 

         continue; 
        } 


        NSString *redTargetCoin = [properties valueForKey:TILE_PROPERTY_TARGET_COIN]; 

        if (redTargetCoin && [redTargetCoin isEqualToString:@"true"]) 
        { 
         tileType = kGrideType_TargetCoins; 

         [mTileInfoDict setObject:[NSNumber numberWithInt:tileType] forKey:key]; 
        } 

       } 
       else 
       { 
        [mTileInfoDict setObject:[NSNumber numberWithInt:kGrideType_Normal] forKey:key]; 
       } 
      } 

     } 
    } 
} 

    - (CGPoint)getTileCoordForPosition:(CGPoint)position 
{ 
// CGPoint nodeSpace1 = [self convertToNodeSpace:position]; 
// float x = floor(nodeSpace1.x/self.tileSize.width); 
// float y = floor(self.mapSize.height - (nodeSpace1.y/self.tileSize.height)); 
//  
// if(x >= TILE_IN_ROW) 
//  x = TILE_IN_ROW - 1; 
//  
// if(y >= TILE_IN_COL) 
//  y = TILE_IN_COL - 1;  
// 
// return ccp(x, y); 

    int maxTileCol = self.mapSize.height;// (_tileMap.contentSize.height)/TILE_SIZE; 

    int x = ((position.x-self.position.x)/TILE_SIZE); 
    int y = maxTileCol - (((position.y)-self.position.y)/TILE_SIZE); 

    if(x >= TILE_IN_ROW) 
     x = TILE_IN_ROW - 1; 

    if(y >= TILE_IN_COL) 
     y = TILE_IN_COL - 1; 

    return ccp(x, y); 

} 
+0

Попробуй, если я не смогу заставить его работать каким-либо другим способом! –