Как использовать SneakyJoystick для стрельбы пулями (cocos2d для iphone)? - PullRequest
0 голосов
/ 10 апреля 2011

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

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

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);

    }
}

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

1 Ответ

1 голос
/ 11 апреля 2011

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

В приведенном выше коде есть две функции.Первая функция 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]];
     }
...