#ios #cocos2d-iphone #ccsprite
#iOS #cocos2d-iphone #ccsprite
Вопрос:
Хорошо, поехали. У меня есть приложение cocos2d, и есть цели, которые движутся к проигрывателю. Когда игрок перемещается, я бы хотел, чтобы они снова медленно меняли свое назначение на игрока, чтобы они не просто перемещались в пустое пространство. Возможно ли изменить назначение спрайта в середине выполнения?
Редактировать:
Это код в — (void)changeTargetDest
- (void)changeTargetDest {
NSMutableArray* deleteArray = [[NSMutableArray alloc] init];
for(CCSprite* s in _targets) {
float offX = s.position.x - player.position.x;
float offY = s.position.y - player.position.y;
float adjustX;
float adjustY;
float offDistance = sqrt(powf(offX, 2.0f) powf(offY, 2.0f));
if(offDistance < 15) {
[deleteArray addObject:s];
deaths ;
[deathLabel setString:[NSString stringWithFormat:@"Deaths: %ld", deaths]];
if(deaths == 0)
[kdLabel setString:[NSString stringWithFormat:@"K/D ratio: %ld.00", score]];
else
[kdLabel setString:[NSString stringWithFormat:@"K/D ratio: %.2f", ((float)score / (float)deaths)]];
}
else {
adjustX = offX * .99;
adjustY = offY * .99;
CGPoint point = CGPointMake(player.position.x adjustX, player.position.y adjustY);
[s setPosition:point];
}//else
}//for
for (CCSprite *target in deleteArray) {
[_targets removeObject:target];
[self removeChild:target cleanup:YES];
}
}
Это работает хорошо, за исключением одной проблемы. Поскольку новая позиция вычисляется путем простого взятия 0,99 от предыдущего смещения, чем ближе цель к игроку, тем медленнее она движется. Как я могу сделать его скорость постоянной?
Ответ №1:
Вы можете остановить действие и запускать новое действие каждые несколько кадров по расписанию. но лучший способ — вычислить положение целей в соответствии с положением игроков и использовать setPosition для ручного изменения их положения в каждом кадре в вашем методе обновления.
Комментарии:
1. Точно. Действия будут отставать на 1 кадр. Как только вы дойдете до ситуации, когда вы будете создавать новое действие перемещения в каждом кадре, спрайт застынет на месте и не будет двигаться.
2. Пожалуйста, посмотрите мое редактирование. С помощью этого кода спрайты делают именно то, что вы сказали: они вообще не перемещаются.
3. В вашем коде в каждом кадре вы выполняете действие и останавливаете другое действие, таким образом, спрайт не будет перемещаться, действия не подходят для перемещения одного кадра, если вы хотите перемещать свои спрайты в каждом кадре, вы должны установить позицию вручную с помощью set position, каждый кадр.
4. Как именно я буду использовать setPosition для перемещения цели к проигрывателю каждые пару кадров?
5. ваши offX и offY указывают вектор от вашего игрока к цели, и вы предполагаете скорость для целей, поэтому в вашем методе обновления каждый кадр вычисляет новую позицию, вычисляя перемещение в этом векторном направлении по этой скорости и устанавливая новую позицию с помощью setPosition .