Как заставить спрайт следовать по следу?
Я делаю игру, в которой игрок рисует линию, а затем за ней должен следовать спрайт. У меня есть изменяемый массив, а также метод рисования, который хорошо работает. но у меня проблемы с поиском способа перемещения спрайта. Я пробовал разные подходы, но не могу заставить работать итератор.
Это должно работать, перебирая массив. который заполняется ранее сохраненными местоположениями CGPoint. Я пытаюсь переместить спрайт в ccTouchedEnded, но он выделяет [toucharray objectAtIndex:0] и говорит "передача id" параметру несовместимого типа "CGPoint (он же" struct CGPoint ")"
-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//remove objects each time the player makes a new path
[toucharray removeAllObjects];
}
-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [ touches anyObject];
CGPoint new_location = [touch locationInView: [touch view]];
new_location = [[CCDirector sharedDirector] convertToGL:new_location];
CGPoint oldTouchLocation = [touch previousLocationInView:touch.view];
oldTouchLocation = [[CCDirector sharedDirector] convertToGL:oldTouchLocation];
oldTouchLocation = [self convertToNodeSpace:oldTouchLocation];
// add touches to the touch array
[toucharray addObject:NSStringFromCGPoint(new_location)];
[toucharray addObject:NSStringFromCGPoint(oldTouchLocation)];
}
-(void)draw
{
glEnable(GL_LINE_SMOOTH);
for(int i = 0; i < [toucharray count]; i+=2)
{
CGPoint start = CGPointFromString([toucharray objectAtIndex:i]);
CGPoint end = CGPointFromString([toucharray objectAtIndex:i+1]);
ccDrawLine(start, end);
}
}
-(void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// here is the line I can't get to work to move the sprite
_sprite.position = ccpAdd(ccpMult([toucharray objectAtIndex:0], progress), ccpMult([toucharray objectAtIndex:0+1], 1-progress));
}
2 ответа
Я делал это раньше, создав (что у вас есть) создание массива Mine с несколькими спрайтами на экране, поэтому у меня также было 1 определение "Touched sprite"
ontouchstart пустой массив и добавление первой точки (начальная точка) + установка TouchedSprite для спрайта, который был ближе всего к начальной точке) ontouchmove добавить точку в массив ontouchend (запустить массив на спрайте по действиям (вернемся к этому позже)
Я получил несколько проблем: (1) я мог контролировать только 1 спрайт за раз и (2) нарисованная линия имела слишком много точек.
Решение к номеру 1: Создайте объект подкласса спрайта и создайте свои спрайты таким образом. Внутри этого объекта создайте массив (сделайте его доступным с помощью @property и @synthesize), который позволит вам размещать нарисованные точки пути. Также создайте открытый метод с именем "runPathAction". Поэтому на TouchStart вы очищаете массив и устанавливаете выбранный объект spriteObject. При добавлении элементов OnTouchMove, OntouchEnd устанавливает массив выбранного spriteObject в локальный массив, а затем запускает метод runPathAction. (Вы могли бы передать это методу, но мне нравится делать это таким образом, на всякий случай, если я хочу получить доступ к массиву)
Решение для номера 2: я обнаружил, что рисование линии создает путь ко многим точкам. Итак, я создал логический оператор под названием "CanDraw" и расписание с интервалом времени 0,1 (вы можете поэкспериментировать с ним) для метода, который устанавливает для canDraw значение YES. а затем в onTouchMove вы проверяете "canDraw == YES", добавляете точку и устанавливаете canDraw=NO;
Таким образом, у вас будет интервал 0,1 секунды, чтобы добавить очки. Не забудьте убрать расписание на TouchEnd!!!
Теперь, как запустить действия. Вам понадобится постоянная скорость, поэтому вам нужно будет установить переменную скорости. Пройдите через массив точек и рассчитайте расстояние между каждой точкой, чтобы создать общее расстояние. (PS Не забывайте, что первая точка - от CurrentLocation до Point0 в массиве). Когда у вас есть общее расстояние, вы можете определить, сколько времени задержки вы должны установить в своих действиях на шаг. (если вы этого не сделаете, вы не знаете время задержки и если вы исправите это, вы получите странное движение).
Создайте метод, проверьте "количество" массива. Если count = 0, вернитесь; (закончено!!! делать очистку или что-то еще), иначе запустить последовательность действий, которая в конце вызывает сама себя. (проверка на количество будет обрабатывать "перерыв". захватить 1 элемент массива CGPoint p = (objectAtIndex:0); и удалить этот элемент из массива (removeAtIndex:0). Запустите действие со временем задержки и там вы идти!
Запишите положения пути в массиве или списке и выполните итерацию по нему, чтобы переместить ваш спрайт по тропе. Я сделал это в игре, которую создал, чтобы создать след частиц позади игрока. Я использовал массив размером 20 и повторил его через интервал, обновив массив в позиции итератора, указав местоположение моего персонажа, а затем переместив эффект частицы в положение, сохраненное в массиве, в положение итератора плюс 1.
Вам нужно заполнить массив начальным местоположением, чтобы у вас не было нулевых значений, и вам понадобится особый случай, когда вы находитесь в конце массива, потому что вы не хотите читать из за пределами местоположения, вместо этого прочитайте ваш код из позиции 0.