Вы хотите понять код, написанный выше ??Если да, то вот некоторое описание,
В приведенном выше коде есть две функции.Первая функция applyVelocity принимает «скорость», «текущую позицию» и «dela» и возвращает новую позицию после добавления скорости и дельты к текущей позиции.
Обратите внимание, что Sneaky Joystick дает вам скорость(направление и величина), которые вы должны использовать, чтобы увидеть, в каком направлении двигаться и сколько двигаться.
if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0)
Приведенная выше строка проверяет, является ли компонент X и Y вашей скорости НЕ НУЛЕМ, чтоозначает, что джойстик активен и движется.
CCSprite* sp = [CCSprite spriteWithFile:@"red.png"];
sp.position = player.position;
[self addChild:sp z:10];
Здесь вы создаете спрайт пули "sp" и устанавливаете его положение на то же положение, что и у игрока, а затем добавляете этот спрайт в слой так, чтобы еговидимый.
Теперь ваш пуля-спрайт создан, и вы должны переместить его так,
CGPoint vel = hudLayer.rightJoystick.velocity;
CCLOG(@"%.5f //// %.5f",vel.x,vel.y);
vel = ccpMult(ccpNormalize(vel), 50);
sp.position = applyVelocity(vel,player.position, 50);
В приведенном выше коде вы получаете скорость от вашего джойстика, он дает вам текущее состояние джойстикаа затем умножьте этот вектор скорости на 50 (ваш выбор), а затем вы вызываете функцию «applyVelocity», чтобы вычислить новую вашу позициюr bullet sprite и вы присваиваете это новое положение вашей пули "sp.postion".
Теперь я предполагаю, что вы вызываете функцию "canShootWithRightJoystick" в вашем методе tick (), как указано в комментарии к коду,Таким образом, эта функция будет вызываться снова и снова с интервалом, который вы указали в селекторе расписания.Всякий раз, когда он вызывается, он проверяет скорость джойстика, создает новый спрайт пули и обновляет его местоположение.
Но проблема в том, что вы создаете спрайт в местоположении A, а затем сразу же меняете его местоположение на B. Таким образом, вы не увидите, как ваша пуля движется от A к B. И если ваша расчетная точка B отсутствуетс экрана вы вообще ничего не увидите.
Проверьте журналы консоли и добавьте новые журналы, чтобы увидеть значения «sp.position» перед применением скорости и после применения скорости, например,
CCLOG(@"Postion of bullet before: %.5f //// %.5f",sp.position.x,sp.position.y);
sp.position = applyVelocity(vel,player.position, 50);
CCLOG(@"Postion of bullet after: %.5f //// %.5f",sp.position.x,sp.position.y);
Замените последнюю строку функции canShootWithRightJoystick на приведенный выше код и просмотрите вывод в консоли.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: решение CCMoveBy работало для анимацииПуля с подлым входным джойстиком.Ниже представлена обновленная функция canShootWithRightJoystick,
-(void)canShootWithRightJoystick { //called in tick method
if (hudLayer.rightJoystick.velocity.x != 0 && hudLayer.rightJoystick.velocity.y != 0) {
CCSprite* sp = [CCSprite spriteWithFile:@"red.png"];
sp.position = player.position;
[self addChild:sp z:10];
CGPoint vel = hudLayer.rightJoystick.velocity;
vel = ccpMult(ccpNormalize(vel), 1000);
[sp runAction:[CCMoveBy actionWithDuration:3 position:vel]];
}