touchesMoved на определенном движущемся объекте

Я использую Spritekit для создания игры для iOS 7. В игре есть круги, движущиеся по экрану с помощью этого кода.

_enemy = [SKSpriteNode spriteNodeWithImageNamed:@"greeny"];
        _enemy.position = CGPointMake(CGRectGetMidX(self.frame)+300,
                                      CGRectGetMidY(self.frame));
_enemy.size = CGSizeMake(70, 70);
_enemy.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:35];
_enemy.physicsBody.mass = 0;

_enemy.physicsBody.categoryBitMask = Collisiongreen;
[_enemies addObject:_enemy];
NSLog(@"Enemies%lu",(unsigned long)_enemies.count);

[self addChild:_enemy];
[_enemy runAction:[SKAction moveByX:-900 y:0 duration:4]];
[self runAction:[SKAction playSoundFileNamed:@"Spawn.wav" waitForCompletion:NO]];
[self runAction:[SKAction sequence:@[
                                  [SKAction waitForDuration:1.4],
                                  [SKAction performSelector:@selector(move)
                                                   onTarget:self],
                                     ]]];

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

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    if(_dead)
        return;
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];

    if(CGRectContainsPoint(_enemy.frame, location)){

        [_enemy runAction:[SKAction moveTo:[[touches anyObject] locationInNode:self] duration:0.01]];
    }

Моя проблема в том, что если я прикоснусь к нему, объект сдвинется на несколько пикселей, но сразу остановится. Как я могу заставить его двигаться пальцем, и если я отпущу его, он продолжит двигаться влево, как запрограммировано ранее? Спасибо!!


person huddie96    schedule 26.03.2014    source источник


Ответы (1)


Итак, хитрость здесь в том, что в методе touchesMoved вы хотите, чтобы позиция врага была установлена ​​в место вашего касания. Используйте метод touchesEnded для выполнения метода, который заставляет противника продолжать движение в направлении вашего последнего касания. Это грубый непроверенный пример.

Вам нужно сохранить разницу текущего местоположения с предыдущим местоположением.

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{

    if(_dead)
        return;
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInNode:self];

    if(CGRectContainsPoint(_enemy.frame, location)){

        someBool = False;
        [_enemy setPosition:location];
        changeInX = location.x - lastX;
        changeInY = location.y - lastY;
        lastX = location.x;
        lastY = location.y;
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    someBool = True;
}

- (void)update:(NSTimeInterval)currentTime
{
...
    if (someBool) {
        enemy.position = CGPointMake((enemy.position.x + changeInX), (enemy.position.y + changeInY));
    }
...
}
person Roecrew    schedule 26.03.2014
comment
Не могли бы вы немного объяснить штрихи Ended. Я новичок в этом - person huddie96; 30.03.2014
comment
Еще раз это только предварительное. Но вам нужно предупредить метод обновления, когда применять changeInX и changeInY. - person Roecrew; 30.03.2014
comment
Нужно ли определять changeInX,ChangeInY,lastX,lastY как CGpoints? Или целое число.. они появляются как неопределенные - person huddie96; 30.03.2014
comment
Они должны быть поплавками. И вы хотите объявить эти переменные как мгновенные переменные. - person Roecrew; 30.03.2014
comment
Большое спасибо. У меня проблема, но не с вашим кодом, а с моим другим кодом, и мне было интересно, не могли бы вы взглянуть на него - я создал отдельный вопрос stackoverflow.com/questions/22739903/ - person huddie96; 30.03.2014