Привет, хорошие люди переполнения стека Я стою перед вами сегодня с (не очень большой) проблемой cocos2d.Как постоянно проверять столкновения в черепичных тилей в CCMoveTo
Как я могу проверить столкновение WHILE в действии вместо проверки целевой плитки? Я работаю с tilemap, у которого есть мета-слой, где есть мозаичные плитки. Следующий код работает, когда я нажимаю на скользящую плитку, но не тогда, когда я нажимаю на нее, если это произойдет, он просто будет ходить прямо.
В настоящее время я обнаружить столкновения с этим кодом:
-(void)setPlayerPosition:(CGPoint)position {
CGPoint tileCoord = [self tileCoordForPosition:position];
int tileGid = [_meta tileGIDAt:tileCoord];
if (tileGid) {
NSDictionary *properties = [_tileMap propertiesForGID:tileGid];
if (properties) {
NSString *collision = properties[@"Collidable"];
if (collision && [collision isEqualToString:@"True"]) {
return;
}
}
}
float speed = 10;
CGPoint currentPlayerPos = _player.position;
CGPoint newPlayerPos = position;
double PlayerPosDifference = ccpDistance(currentPlayerPos, newPlayerPos)/24;
int timeToMoveToNewPostition = PlayerPosDifference/speed;
id moveTo = [CCMoveTo actionWithDuration:timeToMoveToNewPostition position:position];
[_player runAction:moveTo];
//_player.position = position;
}
Кстати, это вызывается из этого метода:
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
[_player stopAllActions];
CGPoint touchLocation = [touch locationInView:touch.view];
touchLocation = [[CCDirector sharedDirector] convertToGL:touchLocation];
touchLocation = [self convertToNodeSpace:touchLocation];
CGPoint playerPos = _player.position;
CGPoint diff = ccpSub(touchLocation, playerPos);
int diffx = diff.x;
int diffy = diff.y;
int adiffx = diffx/24;
int adiffy = diffy/24; //Porque my tile size is 24
if (abs(diff.x) > abs(diff.y)) {
if (diff.x > 0) {
playerPos.x = playerPos.x + adiffx * 24;
} else {
playerPos.x = playerPos.x + adiffx * 24;
}
} else {
if (diff.y > 0) {
playerPos.y = playerPos.y + adiffy * 24;
}else{
playerPos.y = playerPos.y + adiffy * 24;
}
}
[self setPlayerPosition:playerPos];
}
Я попытался
[self schedule:@selector(setPlayerPosition:) interval:0.5];
Без удачи , что сразу же разбило приложение на
NSAssert(pos.x < _layerSize.width && pos.y < _layerSize.height && pos.x >=0 && pos.y >=0, @"TMXLayer: invalid position");
И я не могу обвинить его в сбоях.
Как я могу постоянно проверять наличие столкновений с металлизированными мета-плитами во время работы CCMoveTo
?
Вы только проверку плитки в положении прикосновения. Поддерживаете ли вы массив всех плиток? Если это так, тогда вы можете запланировать метод «детектора столкновения», который активно проверяет любые столкновения между игроком и всеми плитками. –
Нет, я не знаю, потому что я не знаю, как: D Можете ли вы просветить меня, отлично @SmugbitStudios –