草庐IT

ios - "How To Make a Tile-Based Game with Cocos2D 2.X"使用cocos2d V3制作本教程

coder 2024-01-19 原文

我有一个小问题。在本教程中 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;
}

最佳答案

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

调用 setViewPointCenter 方法时,您会将场景位置移出未处理触摸事件的区域。

您必须像这样扩展瓦片 map 的 contentSize 区域:

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

关于ios - "How To Make a Tile-Based Game with Cocos2D 2.X"使用cocos2d V3制作本教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21377795/

有关ios - "How To Make a Tile-Based Game with Cocos2D 2.X"使用cocos2d V3制作本教程的更多相关文章

随机推荐