2016-08-23 3 views
1

사용자가 라켓으로 화면 상단에서 떨어지는 물체를 치는 게임을 만들고 있습니다. 사용자는 계속해서 라켓을 움직일 수 있지만 최소 속도 또는 정지 상태에 있으면 물체에 부딪히지 않아야합니다. 그러나 최소 속도 이상의 경우 사용자를 맞춰야합니다. 나는 그것을 달성했다. 그러나 문제는 사용자 터치로 지속적으로 움직이는 라켓을 만지기 시작한 때이다. 스피드 바리에이션은 같은 속도로 시작하지 않고 터치가 그 시간에 움직이는 동안 몇 번 속도가 매우 느리다는 것이다. 운동이 빠르더라도. 여기터치 속도는 씬의 오브젝트 수에 따라 다릅니다.

-(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]]; 
} 

이 같은 객체 고속뿐만 아니라 느린 속도와도 안정된 상태에 충돌과 충돌 할 수 있도록 내 코드가 잘못 떼어 알려주세요 코드의 내 작품이다.

답변

0

수동으로 수행하는 대신 UIPanGestureRecognizer을 사용하여 스 와이프를 처리하십시오. 속도 특성이 주어진 값보다 큰지 확인하는 데 사용할 수있는 속도 속성이 있습니다. 여기

그것을 할 수있는 좋은 튜토리얼입니다 : https://www.raywenderlich.com/76020/using-uigesturerecognizer-with-swift-tutorial

+0

하지만 라켓이 이동할 수 있도록 자주 –

+0

패닝이 있다고 할 수 있습니다 나는 또한 지속적인 운동이 필요합니다 – Knight0fDragon

관련 문제