单击即可移动SKSpriteNode,但长按时可连续移动 - Sprite Kit

时间:2014-03-21 06:46:38

标签: ios iphone objective-c ipad sprite-kit

我正在尝试更改现有Sprite Kit教程项目的一些SKActions,但在运动方面我遇到了一些问题。 Tutorial和GitHub项目在这里:

https://www.codefellows.org/blogs/simple-sprite-kit-game-tutorial-part1

https://github.com/megharastogi/GameTutorial

正如您在下面的代码中所看到的,每次点击只会移动节点一次。如何更改它以便长按此移动连续移动节点?我尝试了一些像repeatActionForever这样的东西,但是效果不好。

-(void)addShip
{
        //initalizing spaceship node
        ship = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"];
        [ship setScale:0.5];
        ship.zRotation = - M_PI / 2;

        //Adding SpriteKit physicsBody for collision detection
        ship.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ship.size];
        ship.physicsBody.categoryBitMask = shipCategory;
        ship.physicsBody.dynamic = YES;
        ship.physicsBody.contactTestBitMask = obstacleCategory;
        ship.physicsBody.collisionBitMask = 0;
        ship.physicsBody.usesPreciseCollisionDetection = YES;
        ship.name = @"ship";
        ship.position = CGPointMake(120,160);
        actionMoveUp = [SKAction moveByX:0 y:30 duration:.2];
        actionMoveDown = [SKAction moveByX:0 y:-30 duration:.2];

        [self addChild:ship];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchLocation = [touch locationInNode:self.scene];
    if(touchLocation.y >ship.position.y){
        if(ship.position.y < 270){
            [ship runAction:actionMoveUp];
        }
    }else{
        if(ship.position.y > 50){

            [ship runAction:actionMoveDown];
        }
    }
}

1 个答案:

答案 0 :(得分:3)

- (void)didMoveToView:(SKView *)view
{
    UILongPressGestureRecognizer *tapper = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tappedScreen:)];
    tapper.minimumPressDuration = 0.1;
    [view addGestureRecognizer:tapper];
}

- (void)tappedScreen:(UITapGestureRecognizer *)recognizer
{
    float touchY = [self convertPointFromView:[recognizer locationInView:self.view]].y;
    SKSpriteNode *ship = [self childNodeWithName:@"ship"];
    if (recognizer.state == UIGestureRecognizerStateBegan) {
        if(touchY >ship.position.y){
            [ship runAction:[SKAction repeatActionForever:actionMoveUp] withKey:@"longTap"];
        }else{
            [ship runAction:[SKAction repeatActionForever:actionMoveDown] withKey:@"longTap"];
        }
    }
    if (recognizer.state == UIGestureRecognizerStateEnded) {
        [ship removeActionForKey:@"longTap"];
    }
}

在代码中添加这两种方法。