Обнаружение столкновений платформы Tilemap с Cocos2d - PullRequest
1 голос
/ 01 сентября 2011

Я зациклен на разработке игр, работая над платформером, используя Cocos2d для iPhone.Я немного изо всех сил пытаюсь запустить обнаружение столкновений, чтобы у моего персонажа было отменено действие прыжка при попадании на платформу.

Я использую технику из этого урока , где ясоздать отдельный слой "мета-плитки".Проблема заключается в том, что обнаружение столкновений не происходит до тех пор, пока спрайт символов не окажется внутри плитки, которую можно сопоставить, а не поверх нее.

Я использую приведенный ниже код для определения координаты плитки на основе текущего спрайта моего персонажа.позиция:

    - (CGPoint) tileCoordForPosition: (CGPoint) position {
    int x = position.x / tileMap.tileSize.width;
    int y = ((tileMap.mapSize.height * tileMap.tileSize.height) - position.y) / tileMap.tileSize.height;
    return ccp(x, y);
}

Я пробовал различные техники, даже пытаясь выяснить, какая плитка была ниже моего персонажа, используя этот код:

- (void) update: (ccTime) dt {
    BOOL isCollision = NO;
    if (firstRun) {
        oldY = player.position.y;
        firstRun = NO;
    }
    CGPoint oneTileDown = ccp(player.position.x, player.position.y / 2);
    CGPoint tileCoord = [gameplayLayer tileCoordForPosition:oneTileDown];
    int tileGid = [gameplayLayer.meta tileGIDAt:tileCoord];

    if (tileGid) {
        NSDictionary* tileProperties = [gameplayLayer.tileMap propertiesForGID:tileGid];
        if (tileProperties) {
            NSString* collision = [tileProperties valueForKey:@"Collidable"];
            if (collision && [collision compare:@"True"] == NSOrderedSame) {
                //CCLOG(@"Collision Below");
                isCollision = YES;
                if (player.characterState == kStateFalling) {
                    [player stopAllActions];
                }
            }
        }
    }

    if (oldY < player.position.y) {
        CCLOG(@"Character is jumping");
        player.characterState = kStateJumping;
    }
    else if (oldY > player.position.y) {
        CCLOG(@"Character is falling");
        player.characterState = kStateFalling;
    }

    oldY = player.position.y;
}

Но возникает та же проблема: мой персонаж прыгает,приземляется внутри плитки столкновения и останавливается вместо того, чтобы приземляться на вершину плитки.

Есть ли лучший способ проверки на столкновение в карте плиток?

Ответы [ 2 ]

0 голосов
/ 21 мая 2013

Что вам нужно сделать, это использовать CGRectContainRect, чтобы проверить, пересекается ли ограничивающий прямоугольник спрайта игрока с плитками, где он не должен.

0 голосов
/ 30 августа 2012

У меня есть решение этой проблемы.

В методе (CGPoint) tileCoordForPosition: (CGPoint) position вы должны написать следующее:

int x = position.x / tileMap.tileSize.width;
    int y = ((tileMap.mapSize.height * tileMap.tileSize.height + player.contenSize().height / 2) - position.y) / tileMap.tileSize.height;
    return ccp(x, y);

player - спрайт, из которого вы должны добавить половину его высоты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...