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
Бихте ли обяснили малко докосванията. Аз съм доста нов в това - 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