不相互反应的不同触摸 objective c

Different touches that not react with each other objective c

我正在 Ipad 上为两个玩家制作简单的游戏,就像乒乓球一样,当一根手指在屏幕上时玩家可以用他的球拍做出反应,但是当第二根手指在他的球拍上时,他不能移动他的球拍,但他先移动球拍,我设置了一些 NSLog,它说它们都在移动,但这是不对的,这是我的代码示例:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
/* Called when a touch begins */
    for (UITouch *touch in touches) {
//First player
CGPoint touchLocation = [touch locationInNode:self];
SKPhysicsBody* body = [self.physicsWorld bodyAtPoint:touchLocation];

if (body && [body.node.name isEqualToString: paddleCategoryName]) {
    NSLog(@"Began touch on first paddle");
    self.isFingerOnPaddle = YES;
}
//Second player
CGPoint secondTouchLocation = [touch locationInNode:self];
SKPhysicsBody* secondbody = [self.physicsWorld bodyAtPoint:secondTouchLocation];
if (secondbody && [secondbody.node.name isEqualToString: secondPaddleCategoryName]) {
    NSLog(@"Began touch on second paddle");
    self.isSecondFingerOnPaddle = YES;
}
    }
 }

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
for (UITouch *touch in touches) {
    //for first player
    if (self.isFingerOnPaddle) {
        CGPoint touchLocation = [touch locationInNode:self];
        CGPoint previousLocation = [touch previousLocationInNode:self];
        SKSpriteNode* paddle = (SKSpriteNode*)[self childNodeWithName: paddleCategoryName];
        int paddleY = paddle.position.y + (touchLocation.y - previousLocation.y);
        paddleY = MAX(paddleY, paddle.size.height/2);
        paddleY = MIN(paddleY, self.size.height - paddle.size.height/2);
        paddle.position = CGPointMake(paddle.position.x, paddleY);
        NSLog(@"First paddle moving");

    }
    //for second player
    if (self.isSecondFingerOnPaddle) {
        CGPoint touchLocation = [touch locationInNode:self];
        CGPoint previousLocation = [touch previousLocationInNode:self];
        SKSpriteNode* secondPaddle = (SKSpriteNode*)[self childNodeWithName: secondPaddleCategoryName];
        int secondPaddleY = secondPaddle.position.y + (touchLocation.y - previousLocation.y);
        secondPaddleY = MAX(secondPaddleY, secondPaddle.size.height/2);
        secondPaddleY = MIN(secondPaddleY, self.size.height - secondPaddle.size.height/2);
        secondPaddle.position = CGPointMake(secondPaddle.position.x, secondPaddleY);
        NSLog(@"Second paddle moving");
    }
}
}
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
self.isFingerOnPaddle = NO;
self.isSecondFingerOnPaddle = NO;
 }

我做错了什么,以及我需要如何更改我的代码工作,就像它应该的那样

你的逻辑错了,加一个touchArray属性来存储第一次触摸和第二次触摸,在触摸开始时设置它,然后确定触摸何时移动。

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
    /* Called when a touch begins */
    for (UITouch *touch in touches) {

        CGPoint touchLocation = [touch locationInNode:self];
        SKSpriteNode *node = (SKSpriteNode *)[self nodeAtPoint:touchLocation];

        if (node && [node.name isEqualToString: paddleCategoryName]) {
            NSLog(@"Began touch on first paddle");

            [self.touchArray replaceObjectAtIndex:0 withObject:touch];

        }else if (node && [node.name isEqualToString: secondPaddleCategoryName]) {
            NSLog(@"Began touch on second paddle");

            [self.touchArray replaceObjectAtIndex:1 withObject:touch];

        }

    }
}

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
    for (UITouch *touch in touches) {
        CGPoint touchLocation = [touch locationInNode:self];

        UITouch *firstTouch = self.touchArray[0];
        UITouch *secondTouch = self.touchArray[1];

        SKSpriteNode *paddle = [[SKSpriteNode alloc] init];

        if (touch == firstTouch) {
            CGPoint previousLocation = [touch previousLocationInNode:self];
            SKSpriteNode* paddle = (SKSpriteNode*)[self childNodeWithName: paddleCategoryName];
            int paddleY = paddle.position.y + (touchLocation.y - previousLocation.y);
            paddleY = MAX(paddleY, paddle.size.height/2);
            paddleY = MIN(paddleY, self.size.height - paddle.size.height/2);
            paddle.position = CGPointMake(paddle.position.x, paddleY);
            NSLog(@"First paddle moving");

        }else if (touch == secondTouch) {
            CGPoint touchLocation = [touch locationInNode:self];
            CGPoint previousLocation = [touch previousLocationInNode:self];
            SKSpriteNode* secondPaddle = (SKSpriteNode*)[self childNodeWithName: secondPaddleCategoryName];
            int secondPaddleY = secondPaddle.position.y + (touchLocation.y - previousLocation.y);
            secondPaddleY = MAX(secondPaddleY, secondPaddle.size.height/2);
            secondPaddleY = MIN(secondPaddleY, self.size.height - secondPaddle.size.height/2);
            secondPaddle.position = CGPointMake(secondPaddle.position.x, secondPaddleY);
            NSLog(@"Second paddle moving");
        }


    }
}
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
    for (UITouch *touch in touches) {
        if (touch == self.touchArray[0]) {
            [self.touchArray replaceObjectAtIndex:0 withObject:@""];
        }else if (touch == self.touchArray[1]) {
            [self.touchArray replaceObjectAtIndex:1 withObject:@""];

        }
    }

    self.isFingerOnPaddle = NO;
    self.isSecondFingerOnPaddle = NO;
}

更好的方法是使用 sub class paddle 并在 paddle subclass 中执行触摸代码。这消除了循环遍历触摸数组以查看您的桨是否被触摸的麻烦,而且它使代码更整洁,更易于阅读。唯一的问题是您必须对节点设置的样式进行一些不同的设置,因为移动的触摸在球拍之外不起作用。

这是你的风格

1) Subclass Paddle to SKNode
2) Create a child of SKSpriteNode for your actual paddle gfx
3) Paddle frame should be set at the width of your scene, with a height that is allowed for the player to touch (probably the height of the paddle gfx)
4) override the touch code inside Paddle, all touch code in the set should only relate to what is being touched by the paddle
5) Do all of your sliding logic inside these overrides

现在您已经为您正在寻找的行为定义了 Paddle,您可以将它添加到场景中任何您喜欢的地方。

这种方法的好处是你消除了很多重复的代码,(因为两边的球拍行为不同)如果你想增加一些乐趣,你可以在两边添加更多的球拍来提供更多的变化。 (每个玩家在比赛场地中间和底部都有一个桨,可以独立移动)