2016-11-01 5 views
3

я создал «судно» узел для перемещения вдоль круговой траектории следующим образом:Вычислить скорость перехвата между двумя SKSpriteNodes

self.orbit = [OrbitManager getCirclePathWithCenter:centerRealPt radius:radius startingAngle:angelFromCenter isClockwise:self.isClockwise]; 

SKAction* orbitAction = [SKAction followPath:self.orbit asOffset:NO orientToPath:YES speed:300]; 

[self.ship.node runAction:orbitAction]; 

и у меня есть пушка, которая стреляет пулю, применяя скорость к нему следующим :

bullet.node.physicsBody.velocity = [ActionHelper getVelocityFrom:bullet.node toNodeB:self.target speed:bullet.speed]; 

как судно движется по тропе. Но пуля промахнется каждый раз. Как я могу рассчитать положение, к которому должна стремиться пушка, с заданной скоростью?

+0

Звуки для меня, как вы хотите, чтобы рассчитать траекторию, необходимо выяснить, в какой момент времени 2 объекты будут сталкиваться, что требует некоторой математике – Knight0fDragon

ответ

1

Это моя цель-C (на самом деле это C-функция) Решение для запуска снаряда в движущуюся цель.

Вы можете посмотреть на отведениях In this SO topic

Это даст вам хитпоинт и угол стрелять, вы можете просто перевести его на скорость, потому что вы знаете, угол и скорость снаряда, то это будет что-то как:

`CGVector Velocity = CGVectorMake(speed * cos(theta), speed * sin(theta));` 


BOOL calculateAngleToShoot(CGVector targetVelocity, CGPoint targetPosition, CGPoint selfPos,CGFloat projectileSpeed,CGFloat *theta, CGPoint * hitPoint) 
{ 
    CGFloat dx = targetPosition.x - selfPos.x; 
    CGFloat dy = targetPosition.y - selfPos.y; 

    CGVector v = targetVelocity; 

    CGFloat a = v.dx * v.dx + v.dy * v.dy - projectileSpeed * projectileSpeed; 
    CGFloat b = 2 * (v.dx * dx + v.dy * dy); 
    CGFloat c = v.dx * v.dx + v.dy * v.dy; 

    CGFloat q = b * b - 4 * a * c; 
    if (q < 0) 
    { 
     //Dead End; 
     return NO; 
    } 
    CGFloat t = ((a < 0 ? -1 : 1) * sqrt(q) - b)/(2 * a); 

    // Aim for where the target will be after time t 
    dx += t * v.dx; 
    dy += t * v.dy; 
    *theta = atan2(dy, dx); 

    *hitPoint = CGPointMake(targetPosition.x + v.dx * t, targetPosition.y + v.dy * t); 
    return YES; 
} 
1

После некоторого исследования я получил, как получить ответ

первым, мне нужно, чтобы получить расстояние (d) между мишенью и центром и время для пули от центра к цели. , поскольку судно движется вдоль окружности, так что радиус также равен расстоянию (d)

CGFloat timeToArriveTarget = bullet.speed/distance; 
CGFloat angularSpeed = bullet.speed/distance; 

Найти угол перемещается в течение этого периода времени

CGFloat angle = angularSpeed * timeToArriveTarget; 

CGFloat x = self.target.position.x; 
CGFloat y = self.target.position.y; 
CGFloat a = bullet.node.position.x; 
CGFloat b = bullet.node.position.y; 

и, наконец, используя эту формулу: детали дают по этой ссылке https://math.stackexchange.com/a/266837

CGPoint targetPt = CGPointMake((x - a) * cos(angle) - (y - b) * sin(angle) + a, (x - a) * sin(angle) + (y - b) * cos(angle) + b); 

bullet.node.physicsBody.velocity = [ActionHelper getVelocityFrom:bullet.node.position toPtB:targetPt speed:bullet.speed]; 

функция getVelocity задается

+(CGVector)getVelocityFrom:(CGPoint)ptA toPtB:(CGPoint)ptB speed:(CGFloat)speed{ 

CGPoint targetPosition = ptB; 
CGPoint currentPosition = ptA; 

double angle = [MathHelper getRotateAngleFrom:currentPosition toTargetPosition:targetPosition]; 
double velocityX = speed * cos(angle); 
double velocityY = speed * sin(angle); 

CGVector newVelocty = CGVectorMake(velocityX, velocityY); 
return newVelocty; 

}