Spritekit 在触摸时旋转节点

Spritekit rotate a node while touching

如果您愿意的话,我目前正在开发某种自上而下的赛车手。这个想法是有两个按钮,每个按钮用于向左或向右转动汽车。这一切都有效,但它只适用于一次触摸。我想让玩家通过简单地按住按钮来转动汽车。我现在有

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

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

        if ([node.name isEqualToString:@"buttonLeft"]) {
            while (touched == YES) {
                playerRotate = player.zRotation;
                playerRotate += playerAngle;
            }
        }
    }
}

-(void)update:(CFTimeInterval)currentTime {
    /* Called before each frame is rendered */
    player.zRotation = playerRotate;
    float dx = playerSpeed * cos(player.zRotation);
    float dy = playerSpeed * sin(player.zRotation);
    player.physicsBody.velocity = CGVectorMake(dx, dy);
}

玩家汽车的速度在更新函数中更新。并且在touchesEnded touched中设置为NO。问题是这个 while 循环卡住了(我的 phone 不再处理任何触摸),但我不知道只要按下按钮就可以继续旋转汽车的其他方法。如果我删除 while 循环,代码就可以工作。感谢您的帮助!

你已经有了正确的想法。而不是将您的 BOOL touched 设置为所有触摸的通用 YES。创建一个 touchLeft 和 touchRight BOOL。

if([node.name isEqualToString:@"buttonLeft"]) 之后将 touchLeft BOOL 设置为 YES。创建一个 if([node.name isEqualToString:@"buttonRight"]) 并设置 touchRight BOOL.

在您的更新方法中,您可以检查 BOOL YES 值并相应地应用代码。

请记住,您还需要为 touchesEnded 创建相同的代码逻辑,以便在触摸不再存在时将两个 BOOL 设置回 NO。