質問

I have a small problem. In this tutorial How To Make a Tile-Based Game with Cocos2D 2.X used cocos2d V2.0, I wanna make this in cocos2d V3.0. So, it doesn't work! Thanks! (I don't speak english)

I think problem in this line - 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;
}
役に立ちましたか?

解決

The problem is that the area of the user interaction is by default bound to the contentSize of the scene (screen size).

When calling your setViewPointCenter method, you are moving the scene position out of this area where the touch event is not handled.

You have to extend this area of the contentSize of the tile map like that :

[self setContentSize:[_tileMap contentSize]];
self.userInteractionEnabled = YES;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top