“如何使用Cocos2D 2.X制作基于平铺的游戏”使用cocos2d V3制作本教程

时间:2014-01-27 09:58:07

标签: ios cocos2d-iphone game-engine tile

我有一个小问题。在本教程How To Make a Tile-Based Game with Cocos2D 2.X中使用了cocos2d V2.0,我想在cocos2d V3.0中进行此操作。所以,它不起作用!谢谢! (我不会说英语)

我认为这一行有问题 - self.position = viewPoint;

@property (strong) CCTiledMap *tileMap;
@property (strong) CCTiledMapLayer *background;
@property (strong) CCSprite *player;



- (id)init
{
    // Apple recommend assigning self with supers return value
    self = [super init];
    if (!self) return(nil);

    // Enable touch handling on scene node
    self.userInteractionEnabled = YES;

    self.tileMap = [CCTiledMap tiledMapWithFile:@"TileMap.tmx"];
    self.background = [_tileMap layerNamed:@"Background"];
    [self addChild:_tileMap z:-1];

    CCTiledMapObjectGroup *objectGroup = [_tileMap objectGroupNamed:@"Objects"];
    NSAssert(objectGroup != nil, @"tile map has no objects object layer");

    NSDictionary *spawnPoint = [objectGroup objectNamed:@"SpawnPoint"];
    int x = [spawnPoint[@"x"] integerValue];
    int y = [spawnPoint[@"y"] integerValue];

    _player = [CCSprite spriteWithImageNamed:@"Player.png"];
    _player.position = ccp(x,y);

    [self addChild:_player];
    [self setViewPointCenter:_player.position];

    // done
    return self;
}


- (void)setViewPointCenter:(CGPoint) position {

    CGSize winSize = [CCDirector sharedDirector].viewSize;

    int x = MAX(position.x, winSize.width/2);
    int y = MAX(position.y, winSize.height/2);
    x = MIN(x, (_tileMap.mapSize.width * _tileMap.tileSize.width) - winSize.width / 2);
    y = MIN(y, (_tileMap.mapSize.height * _tileMap.tileSize.height) - winSize.height/2);
    CGPoint actualPosition = ccp(x, y);

    CGPoint centerOfView = ccp(winSize.width/2, winSize.height/2);
    CGPoint viewPoint = ccpSub(centerOfView, actualPosition);

    self.position = viewPoint;
}

-(void)touchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchLocation = [touch locationInView:touch.view];
    touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
    touchLocation = [self convertToNodeSpace:touchLocation];

    CGPoint playerPos = _player.position;
    CGPoint diff = ccpSub(touchLocation, playerPos);

    if ( abs(diff.x) > abs(diff.y) ) {
        if (diff.x > 0) {
            playerPos.x += _tileMap.tileSize.width;
        } else {
            playerPos.x -= _tileMap.tileSize.width;
        }
    } else {
        if (diff.y > 0) {
            playerPos.y += _tileMap.tileSize.height;
        } else {
            playerPos.y -= _tileMap.tileSize.height;
        }
    }

    CCLOG(@"playerPos %@",CGPointCreateDictionaryRepresentation(playerPos));

    // safety check on the bounds of the map
    if (playerPos.x <= (_tileMap.mapSize.width * _tileMap.tileSize.width) &&
        playerPos.y <= (_tileMap.mapSize.height * _tileMap.tileSize.height) &&
        playerPos.y >= 0 &&
        playerPos.x >= 0 )
    {
        [self setPlayerPosition:playerPos];
    }

    [self setViewPointCenter:_player.position];
    NSLog(@"%@", NSStringFromCGPoint(touchLocation));
}

-(void)setPlayerPosition:(CGPoint)position {
    _player.position = position;
}

1 个答案:

答案 0 :(得分:2)

问题是用户交互的区域默认绑定到场景的contentSize(屏幕大小)。

调用setViewPointCenter方法时,您正在将场景位置移出此区域,而该区域未处理触摸事件。

你必须像这样扩展瓷砖地图contentSize的这个区域:

[self setContentSize:[_tileMap contentSize]];
self.userInteractionEnabled = YES;