Вы хотите понять код, написанный выше?? Если да, то вот описание,
В приведенном выше коде есть две функции. Первая функция «applyVelocity» принимает «скорость», «текущую позицию» и «делу» и возвращает новую позицию после добавления скорости и дельты к текущей позиции.
Обратите внимание, что 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», чтобы вычислить новую позицию вашего спрайта пули. и вы назначаете эту новую позицию своей пуле "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]];
}
person
Tayyab
schedule
11.04.2011