Я зациклен на разработке игр, работая над платформером, используя 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;
}
Но возникает та же проблема: мой персонаж прыгает,приземляется внутри плитки столкновения и останавливается вместо того, чтобы приземляться на вершину плитки.
Есть ли лучший способ проверки на столкновение в карте плиток?