触摸速度随场景中的对象数量而变化

时间:2016-08-23 09:49:53

标签: ios sprite-kit collision-detection

我正在制作游戏,用户可以使用球拍击中从屏幕顶部掉落的物体。用户可以连续移动球拍,但如果它以最小速度或静止时它不应该击中物体,但如果它高于最低速度,则用户应击中它们。我已经实现了这个问题但是问题是当用户开始触摸随着用户触摸而不断移动的球拍时,速度变化是他们不以相同的速度开始并且当时触摸移动也有时速度非常少即使运动很快。这是我的一段代码

-(void)didMoveToView:(SKView *)view {
self.physicsWorld.contactDelegate = (id)self;
racketNode = [SKSpriteNode spriteNodeWithImageNamed:@"racket"];
racketNode.size = CGSizeMake(50,50);
racketNode.position = CGPointMake(self.frame.origin.x + self.frame.size.width - 50,50);
racketNode.name = @"racket";
[self addChild:racketNode];
}
-(void) didBeginContact:(SKPhysicsContact *)contact {
SKSpriteNode *nodeA = (SKSpriteNode *)contact.bodyA.node ;
SKSpriteNode *nodeB = (SKSpriteNode *) contact.bodyB.node;
if (([nodeA.name isEqualToString:@"racket"] && [nodeB.name isEqualToString:@"fallingObject"])) {
    if (racketNode.speed > kMinSpeed)
        [nodeB removeFromParent];
    else {
        nodeB.physicsBody.contactTestBitMask = 0;
        [self performSelector:@selector(providingCollsion:) withObject:nodeB afterDelay:0.1];
    }
 }
}
-(void) providingCollsion:(SKSpriteNode *) node {

node.physicsBody.contactTestBitMask = racketHit;
}

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent     *)event {
for (UITouch *touch in touches) {
    CGPoint location = [touch locationInNode:self];
    start = location;
    startTime = touch.timestamp;
    racketNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:racketNode.frame.size];
    racketNode.physicsBody.categoryBitMask = racket;
    racketNode.physicsBody.contactTestBitMask = HitIt;
    racketNode.physicsBody.dynamic = NO;
    racketNode.physicsBody.affectedByGravity = NO;
    [racketNode runAction:[SKAction moveTo:location duration:0.01]];
 }
}

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
racketNode.physicsBody = nil;
racketNode.speed = 0;
}

-(void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent             *)event {
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInNode:self];
CGFloat dx = location.x - start.x;
CGFloat dy = location.y - start.y;
CGFloat magnitude = sqrt(dx*dx+dy*dy);
// Determine time difference from start of the gesture
CGFloat dt = touch.timestamp - startTime;
// Determine gesture speed in points/sec
CGFloat speed = magnitude/dt;
racketNode.speed = speed;
[handNode runAction:[SKAction moveTo:[touch locationInNode:self]   duration:0.01]];
} 

请告诉我我的代码哪个部分是错误的,以便使同一个物体高速碰撞,而不是在低速下碰撞,也不会在稳定状态下碰撞。

1 个答案:

答案 0 :(得分:0)

不要手动操作,而是使用UIPanGestureRecognizer来处理滑动。有了它,你可以使用一个力度属性来检查速度是否大于给定值。

这是一个很棒的教程: https://www.raywenderlich.com/76020/using-uigesturerecognizer-with-swift-tutorial