2015-07-01 3 views
-1

Когда сцена начала, я установил мировой уровень тяжести -2.0f. И я добавил объект на сцену и узел джойстика, которым я управляю этим объектом. Когда я касаюсь узла джойстика, мировая гравитация устанавливается на 0, а когда джойстик с концевым касанием достигает мировой силы тяжести до -2.0f.Замешательство с гравитацией на SpriteKit

Я не могу понять, что не так. Потому что объект несколько раз имеет медленную скорость движения.

Для получения дополнительной информации вы можете найти образец video/video2.

Спасибо за ответ. P.S. Извините мой английский. Надеюсь, вы понимаете. ;)

метод

Переместить:

- (void)moveJoystick { 

    if (_joystickController.isTracking) { 

     self.physicsWorld.gravity = CGVectorMake(.0f, 0.0f); 
     _shooter.position = CGPointMake(_shooter.position.x + .3f * _joystickController.velocity.x, 
             _shooter.position.y + .3f * _joystickController.velocity.y); 

//  if (_joystickController.velocity.x > 0) { 
//   [_shooter changeShooterSpriteSide:NO]; 
//  } else { 
//   [_shooter changeShooterSpriteSide:YES]; 
//  } 

     NSLog(@"_shooter.position %@", NSStringFromCGPoint(_shooter.position)); 
    } else { 
     self.physicsWorld.gravity = CGVectorMake(.0f, -2.0f); 
    } 
} 

джойстиков:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    for (UITouch *touch in touches) { 

     CGPoint touchPoint = [touch locationInNode:self]; 

     if (_isTracking && sqrtf(powf(touchPoint.x - _innerControl.position.x, 2) + 
           powf(touchPoint.y - _innerControl.position.y, 2)) < _outerControl.size.height) { 

      if (sqrtf(powf(touchPoint.x, 2) + powf(touchPoint.y, 2)) <= _innerControl.size.height/2) { 
       _innerControl.position = CGPointMake(touchPoint.x, touchPoint.y); 
      } else { 
       double magV = sqrt(touchPoint.x * touchPoint.x + touchPoint.y * touchPoint.y); 
       double aX = touchPoint.x/magV * _innerControl.size.width; 
       double aY = touchPoint.y/magV * _innerControl.size.width/2; 

       _innerControl.position = CGPointMake(aX, aY); 
      } 

      _velocity = CGPointMake(_innerControl.position.x, _innerControl.position.y); 
      NSLog(@"_velocity %@", NSStringFromCGPoint(_velocity)); 
     } 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self resetInnerControlWithVelocity]; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self resetInnerControlWithVelocity]; 
} 

- (void)resetInnerControlWithVelocity { 

    _isTracking = NO; 
    _velocity = CGPointZero; 
    _innerControl.position = INNERCONTROLDEFAULTPOINT; 
    NSLog(@"%@", NSStringFromCGPoint(_velocity)); 
} 

SpriteNode:

- (void)initTestSprite { 

    SKShapeNode *testShape = [SKShapeNode shapeNodeWithCircleOfRadius:15.0f]; 
    testShape.strokeColor = [UIColor greenColor]; 
    testShape.name = @"test"; 

    testShape.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:15.0f]; 
    testShape.physicsBody.dynamic = YES; 
    testShape.physicsBody.affectedByGravity = YES; 
    testShape.physicsBody.categoryBitMask = CBShooterCategory; 
    testShape.physicsBody.collisionBitMask = CBAsteroidCategory | CBGroundCategory | CBWorldCategory; 
    testShape.physicsBody.contactTestBitMask = CBAsteroidCategory | CBWorldCategory; 

    [self addChild:testShape]; 
} 

Вызов MoveJoystick:

- (instancetype)initWithSize:(CGSize)sceneSize { 

    if (self = [super initWithSize:sceneSize]) { 

     self.physicsWorld.contactDelegate = self; 
     _velocityTick = [CADisplayLink displayLinkWithTarget:self selector:@selector(moveJoystick)]; 
     [_velocityTick addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; 

Изменение physicBody (affectedGravity, динамический) Don `T принимать какие-либо изменения

testSprite position

+0

Когда это метод moveJoystick называется? – EDUsta

+0

Я обновляю qestion (добавлен Call MoveJoystick :) –

ответ

0

Fix работал для меня

if (_joystickController.velocity.y > 0) 
    self.physicsWorld.gravity = CGVectorMake(.0f, 2.0f); 
Смежные вопросы