spritekit ios sprite-kit

ios - spritekit - skview



ios-Spritekit-¿Cómo calcular la distancia entre dos nodos? (5)

Aquí hay una función que lo hará por usted. Esto es del código de ejemplo de Apple''s Adventure:

CGFloat SDistanceBetweenPoints(CGPoint first, CGPoint second) { return hypotf(second.x - first.x, second.y - first.y); }

Para llamar a esta función desde su código:

CGFloat distance = SDistanceBetweenPoints(nodeA.position, nodeB.position);

Tengo dos sknodes en la pantalla. ¿Cuál es la mejor manera de calcular la distancia ("en línea recta", no necesito un vector, etc.)?

He tenido un google y busco aquí y no puedo encontrar algo que lo cubra (no hay demasiados hilos en stackoverflow sobre el kit de sprites)


Teorema de pitágoras:

- (float)getDistanceBetween:(CGPoint)p1 and:(CGPoint)p2 { return sqrt(pow(p2.x-p1.x,2)+pow(p2.y-p1.y,2)); }


joshd y Andrey Gordeev son correctos, con la solución de Gordeev deletreando lo que hace la función hipotf.

Pero la función de raíz cuadrada es una función costosa. Tendrá que usarlo si necesita conocer la distancia real, pero si solo necesita distancia relativa, puede omitir la raíz cuadrada. Es posible que desee saber qué sprite está más cerca, o más lejos, o si alguno de los sprites está dentro de un radio. En estos casos, solo compare la distancia al cuadrado.

- (float)getDistanceSquared:(CGPoint)p1 and:(CGPoint)p2 { return pow(p2.x - p1.x, 2) + pow(p2.y - p1.y, 2); }

Para usar esto para calcular si algún objeto está dentro de un radio desde el centro de la vista en el método update: de una subclase SKScene:

-(void)update:(CFTimeInterval)currentTime { CGFloat radiusSquared = pow (self.closeDistance, 2); CGPoint center = self.view.center; for (SKNode *node in self.children) { if (radiusSquared > [self getDistanceSquared:center and:node.position]) { // This node is close to the center. }; } }


Rápido:

extension CGPoint { /** Calculates a distance to the given point. :param: point - the point to calculate a distance to :returns: distance between current and the given points */ func distance(point: CGPoint) -> CGFloat { let dx = self.x - point.x let dy = self.y - point.y return sqrt(dx * dx + dy * dy); } }


Otro método rápido, también porque estamos tratando con la distancia, agregué ABS () para que el resultado siempre sea positivo.

extension CGPoint { func distance(point: CGPoint) -> CGFloat { return abs(CGFloat(hypotf(Float(point.x - x), Float(point.y - y)))) } }

¿No es veloz?