有没有办法围绕任意点旋转 SpriteKit 中的节点?我现在可以操纵anchorPoint
我的节点,但如果我想使用的旋转点位于节点之外,这还不够。
在 SpriteKit 中实现这种旋转的最佳方法是什么?
有没有办法围绕任意点旋转 SpriteKit 中的节点?我现在可以操纵anchorPoint
我的节点,但如果我想使用的旋转点位于节点之外,这还不够。
在 SpriteKit 中实现这种旋转的最佳方法是什么?
由于您要求最好的方法,这里有一个效果很好(最好是主观的):
创建一个 SKNode 并将其位置设置为旋转中心。将应该围绕该中心旋转的节点作为子节点添加到中心节点。将子节点的位置设置为所需的偏移量(即半径,例如 x + 100)。更改中心节点的旋转属性以使子节点围绕中心点旋转。顺便说一句,cocos2d 也是如此。
代码本身没有通过
+(NSArray *)calculatePoints:(CGPoint)point withRadius:(CGFloat)radius numberOfPoints: (int)numberOfPoints{ //or sprite kit equivalent thereof
// [drawNode clear];
NSMutableArray *points = [[NSMutableArray alloc]init];
for (int j = 1; j < 5; j++) {
float currentDistance;
float myRadius = radius;
float xAdd;
float yAdd;
int xMultiplier;
int yMultiplier;
CCColor *color = [[CCColor alloc]init]; //Will be used later to draw the position of the node, for debugging only
for (int i = 0; i < numberOfPoints; i += 1){
//You also have to change the if (indextogoto == <value>) in the moveGumliMethod;
float opposite = sqrtf( powf(myRadius, 2) - powf(currentDistance, 2) );
currentDistance = i;
switch (j) {
case 1:
xMultiplier = 1;
yMultiplier = 1;
xAdd = currentDistance;
yAdd = opposite;
color = [CCColor blueColor];
break;
case 2:
xMultiplier = 1;
yMultiplier = -1;
xAdd = opposite;
yAdd = currentDistance;
color = [CCColor orangeColor];
break;
case 3:
xMultiplier = -1;
yMultiplier = -1;
xAdd = currentDistance;
yAdd = opposite;
color = [CCColor redColor];
break;
case 4:
xMultiplier = -1;
yMultiplier = 1;
xAdd = opposite;
yAdd = currentDistance;
color = [CCColor purpleColor];
break;
default:
break;
}
int x = (CGFloat)(point.x + xAdd * xMultiplier); //or sprite kit equivalent thereof
int y = (CGFloat)(point.y + yAdd * yMultiplier); //or sprite kit equivalent thereof
CGPoint newPoint = CGPointMake((CGFloat)x,(CGFloat)y); //or sprite kit equivalent thereof
NSValue *pointWrapper = [NSValue valueWithCGPoint:newPoint]; //or sprite kit equivalent thereof
NSLog(@"Point is %@",pointWrapper);
[points addObject:pointWrapper];
}
}
return points;
}
-(CGPoint)calculateNearestGumliPoint:(CGPoint)search point { // MY Character is named Gumli
float closestDist = 2000;
CGPoint closestPt = ccp(0,0);
for (NSValue *point in points) {
CGPoint cgPoint = [point CGPointValue];
float dist = sqrt(pow( (cgPoint.x - searchpoint.x), 2) + pow( (cgPoint.y - searchpoint.y), 2));
if (dist < closestDist) {
closestDist = dist;
closestPt = cgPoint;
}
}
return closestPt;
}
几周前我也试图解决这个问题,但没有实施锚点解决方案,因为当假设对象与另一个节点碰撞并应该离开它的轨道时,我不想担心移除锚点并且弹开。
相反,我想出了两个解决方案,如果调整它们都可以工作。第一个花了很长时间来完善,但仍然不完美。它涉及计算围绕中心位置偏移设定半径的一定数量的点,然后如果某个物体在中心点的一定距离内进入,它将不断使用物理学将物体沿着“圆周”,它计算的点(见上文)。
第一个使用勾股定理,第二个最终使用三角函数。首先,您将 for 循环增加一定量,而它小于 361(度),并且对于循环的每次迭代,使用正弦和余弦计算一个点,该点在距中心点一定半径处具有该角度.
第二个使用勾股定理,其代码如下:
计算完 points 之后,您应该在 didMoveToView 中创建一个预定的选择器[<object> scheduled selector...];
或计时器,或者使用一个固定的更新方法,以及一个名为 int 的实例变量,该变量将保存您的对象将移动到的下一个位置的索引。每次调用计时器方法时,它都会使用您自己的或以下标有physicsMovement的代码将对象移动到计算点数组中的下一个点;您可以使用物理值,甚至 ttimer 的频率来获得不同的运动效果。只要确保你得到正确的索引。
此外,为了更真实,我使用了一种方法来计算计算点数组中与对象最近的点,该方法仅在碰撞开始时调用。它也在下面标记为nearestPointGoTo。
如果您需要更多帮助,请在评论中说出来。继续黑客攻击!
我使用了第二个,这里是它的源代码:
我认为完成这项工作的最佳方法是通过两个SKNode
并将它们连接起来SKPhysicsJointPin
(请看下面的引脚示例)
我试图SKSpriteNode
在我的门(`SkScene)上挂一个门牌(),当有人触摸它时,我想在挂点上旋转
我所做的是1x1
SKNode
用一个巨大的质量制作一个并禁用它的重力效应。
var doorSignAnchor = SKSpriteNode(color: myUIColor, size: CGSize(width: 1, height: 1))
doorSignAnchor.physicsBody = SKPhysicsBody(rectangleOf: doorSignAnchor.frame.size)
doorSignAnchor.physicsBody!.affectedByGravity = false // MAGIC PART
doorSignAnchor.physicsBody!.mass = 9999999999 // MAGIC PART
var doorSignNode = SKSpriteNode(imageNamed:"doorSign")
doorSignNode.physicsBody = SKPhysicsBody(rectangleOf: doorSignNode.frame.size)
并创建了一个SKPhysicsJointPin
将它们全部连接起来
let joint = SKPhysicsJointPin.joint(
withBodyA: doorSignAnchor.physicsBody!,
bodyB: doorSignNode.physicsBody!,
anchor: doorSignAnchor.position)
mySkScene.physicsWorld.add(joint)
所以它会像实际的门牌一样移动,围绕任意点旋转(doorSignAnchor)
参考: