Как определить в касаниях, какие узлы еще нажаты

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

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

[super touchesBegan:touches withEvent:event];

for (UITouch *touch in touches){


    CGPoint location = [touch locationInNode:self];


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

    [wizard setTexture:[SKTexture textureWithImageNamed:@"wizardRight"]];

    didTouchRightArrow = YES;
    isLookingRight = YES;
    isLookingLeft = NO;

    rightArrow.alpha = 0.5;
    NSLog(@"Touching right");

}

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

    [wizard setTexture:[SKTexture textureWithImageNamed:@"wizardLeft"]];

    isLookingRight = NO;
    isLookingLeft = YES;
    didTouchLeftArrow = YES;
    leftArrow.alpha = 0.5;
    NSLog(@"Touching left");

}

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

    didTouchUpArrow = YES;
    upArrow.alpha = 0.5;
    NSLog(@"Touching up");

}

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

[super touchesBegan:touches withEvent:event];

if (rightArrow.alpha != 1.0){
    rightArrow.alpha = 1.0;
}
if (leftArrow.alpha != 1.0){
    leftArrow.alpha = 1.0;
}
if (upArrow.alpha != 1.0){
    upArrow.alpha = 1.0;

for (UITouch *touch in touches){

    CGPoint location = [touch locationInNode:self];

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

        NSLog(@"Touching right");
        didTouchRightArrow = YES;
    } {

        NSLog(@"Not touching right");
        didTouchRightArrow = NO;
    }

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

        NSLog(@"Touching Left");
        didTouchLeftArrow = YES;

    } else {

        NSLog(@"not touching left");
        didTouchLeftArrow = NO;
    }

    didTouchUpArrow = NO;



}

Возможно, это неправильный подход к проблеме, но в нескольких штрихах я пытаюсь понять, находится ли касание в нужном Rect.

1 ответ

Решение

Вам нужен способ идентифицировать различные узлы, которые регистрируют касание. Существует несколько способов сделать это, но я всегда обнаружил, что использование свойства name узла является самым простым и простым в работе.

У вас уже есть правильная идея, используя BOOL для регистрации состояний касания.

Я написал некоторый код для обработки того, что вы пытаетесь выполнить:

#import "GameScene.h"

@implementation GameScene {

    SKSpriteNode *node0;
    SKSpriteNode *node1;
    BOOL node0touch;
    BOOL node1touch;
}

-(void)didMoveToView:(SKView *)view {
    self.backgroundColor = [SKColor blackColor];

    node0 = [SKSpriteNode spriteNodeWithColor:[SKColor redColor] size:CGSizeMake(100, 100)];
    node0.name = @"node0";
    node0.position = CGPointMake(100, 300);
    [self addChild:node0];

    node1 = [SKSpriteNode spriteNodeWithColor:[SKColor blueColor] size:CGSizeMake(100, 100)];
    node1.name = @"node1";
    node1.position = CGPointMake(400, 300);
    [self addChild:node1];

    node0touch = false;
    node1touch = false;
}

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

    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInNode:self];
        SKNode *node = [self nodeAtPoint:touchLocation];

        if([node.name isEqualToString:@"node0"])
            node0touch = true;

        if([node.name isEqualToString:@"node1"])
            node1touch = true;
    }
}

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

    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInNode:self];
        SKNode *node = [self nodeAtPoint:touchLocation];

        if([node.name isEqualToString:@"node0"])
            node0touch = false;

        if([node.name isEqualToString:@"node1"])
            node1touch = false;
    }
}

-(void)update:(CFTimeInterval)currentTime {

    if(node0touch)
        NSLog(@"node0 touch");

    if(node1touch)
        NSLog(@"node1 touch"); 
}
Другие вопросы по тегам