Двойной виртуальный джойстик для одновременного использования iOS

Я использую виртуальный джойстик для SpriteKit, и он отлично работает. Я пробовал версию JCInput или SpriteKit-Joystick. Оба использовались для движения, и их использовали слева.

Это код, который я использовал, хотя документация в любом случае очень хороша на gitHub:

Для версии JCInput:

    self.joystick = [[JCJoystick alloc] initWithControlRadius:40 baseRadius:45 baseColor:[SKColor blueColor] joystickRadius:25 joystickColor:[SKColor redColor]];
    [self.joystick setPosition:CGPointMake(70,70)];
    [self addChild:self.joystick];

и функция обновления:

-(void)update:(CFTimeInterval)currentTime {

    [self.myLabel1 setPosition:CGPointMake(self.myLabel1.position.x+self.joystick.x, self.myLabel1.position.y+self.joystick.y)];

    [self.myLabel2 setPosition:CGPointMake(self.myLabel2.position.x+self.imageJoystick.x, self.myLabel2.position.y+self.imageJoystick.y)];

/* Called before each frame is rendered */

}

И для версии SpriteKit-Joystick:

    SKSpriteNode *jsThumb = [SKSpriteNode spriteNodeWithImageNamed:@"joystick"];
    [jsThumb setScale:0.5f];
    SKSpriteNode *jsBackdrop = [SKSpriteNode spriteNodeWithImageNamed:@"dpad"];
    [jsBackdrop setScale:0.5f];
    self.joystick = [Joystick joystickWithThumb:jsThumb andBackdrop:jsBackdrop];
    self.joystick.position = CGPointMake(50,50);
    [self addChild:self.joystick];
    //I've already declared it in the header file
    velocityTick = [CADisplayLink displayLinkWithTarget:self selector:@selector(joystickMovement)];
    [velocityTick addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

и функция обновления:

-(void)joystickMovement
{
    if (self.joystick.velocity.x != 0 || self.joystick.velocity.y != 0)
    {
        [self.myLabel1 setPosition:CGPointMake(self.myLabel1.position.x+.1 *self.joystick.velocity.x, self.myLabel1.position.y+.1 * self.joystick.velocity.y)];
    }
}

Теперь все работает отлично, и никаких проблем с этим нет. Но мне нужно добавить еще один, чтобы повернуть моего персонажа (назовем его self.myLabel1). Я попытался продублировать создание объекта (с уникальными именами, параметрами и позициями, чтобы поместить их в правую часть экрана, но другие фрагменты кода точно такие же, как я использовал выше).

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

Может ли кто-нибудь пролить свет на эту тень?

Заранее большое спасибо.


person Septronic    schedule 17.03.2016    source источник


Ответы (1)


Вы должны переопределить update в своей SKScene вместо использования CADisplayLink. Вы можете позвонить joystickMovement из update и добиться желаемого эффекта.

Подробнее о различных методах, называемых SKScene, обрабатывает каждый кадр в ссылка на класс SKScene.

Если вы еще этого не сделали, вам также необходимо установить multipleTouchEnabled в значение true в представлении SKScene. Вы можете сделать это со своего GameViewController с помощью

self.view.multipleTouchEnabled = YES;
person Dion Larson    schedule 17.03.2016
comment
Это нелепо! Я потратил на это добрый час и лег спать, мне снились кошмары! Ты спас мой сегодняшний вечер, Дион. Включив мультитач, все заработало как удовольствие. Я принял ваш совет к сведению и использовал для этого метод обновления. Большое спасибо. - person Septronic; 17.03.2016