Как использовать SneakyJoystick для стрельбы пулями (cocos2d для iphone)?

Я хочу использовать скрытный джойстик, чтобы стрелять пулями. Каждый раз, когда джойстик активен, он должен стрелять из игрока в направлении, указанном джойстиком.

Как я могу это сделать?

PS: Было бы здорово, если бы кто-нибудь мог объяснить код. Я хочу это понять ;)

Изменить:

static CGPoint applyVelocity(CGPoint velocity, CGPoint position, float delta){
    return CGPointMake(position.x + velocity.x * delta, position.y + velocity.y * delta);
}
-(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;
        CCLOG(@"%.5f //// %.5f",vel.x,vel.y);
        vel = ccpMult(ccpNormalize(vel), 50);
        sp.position = applyVelocity(vel,player.position, 50);

    }
}

Но ничего не происходит :(


person cocos2dbeginner    schedule 10.04.2011    source источник


Ответы (1)


Вы хотите понять код, написанный выше?? Если да, то вот описание,

В приведенном выше коде есть две функции. Первая функция «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
comment
хм... пули всегда мгновенно вылетают из экрана: Позиция пули до: 240.00000 //// 160.00000 2011-04-11 16:06:53.632 MusicSpawnTest[659:207] Позиция пули после: 443.06921 /// / 616.90576 Как я могу это исправить? Любая идея? - person cocos2dbeginner; 11.04.2011
comment
Это зависит от того, как вы хотите это сделать в зависимости от ваших потребностей... Например, вы можете уменьшить дельту... Используйте 1 вместо 50, а затем проверьте другие значения, чтобы увидеть, как оно ведет себя и как оно подходит... Но я думаю, что это неправильно, если вы пытаетесь сделать пулю... Пуля должна путешествовать с моей точки зрения... но в вашем случае она просто телепортируется в новое место... Вы можете попробовать действие CCMoveBy, вызвав метод runAction на ваш спрайт пули для анимации пули. - person Tayyab; 12.04.2011
comment
О, я действительно забыл CCMoveBy. Спасибо, это сработало! :) Не могли бы вы отредактировать свой ответ, чтобы я мог его принять? Спасибо: CCSprite* sp = [CCSprite spriteWithFile:@red.png]; sp.position = player.position; [сам addChild: sp z: 10]; CGPoint vel = hudLayer.rightJoystick.velocity; vel = ccpMult(ccpNormalize(vel), 1000); [sp runAction:[CCMoveBy actionWithDuration:3 position:vel]]; - person cocos2dbeginner; 12.04.2011